perf_asm.S
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:26k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. ;   Purpose:
  2. ; This file has the overall purpose of suppyling low-level
  3. ;   assembly to program the intrigue portion of the cpu.
  4. #include <linux/config.h>
  5. #include <asm/assembly.h>
  6. #ifdef __LP64__
  7. .level 2.0w
  8. #endif /* __LP64__ */
  9. #define MTDIAG_1(gr)    .word 0x14201840 + gr*0x10000
  10. #define MTDIAG_2(gr)    .word 0x14401840 + gr*0x10000
  11. #define MFDIAG_1(gr)    .word 0x142008A0 + gr
  12. #define MFDIAG_2(gr)    .word 0x144008A0 + gr
  13. #define STDIAG(dr)      .word 0x14000AA0 + dr*0x200000
  14. #define SFDIAG(dr)      .word 0x14000BA0 + dr*0x200000
  15. #define DR2_SLOW_RET    53
  16. ;
  17. ; Enable the performance counters
  18. ;
  19. ; The coprocessor only needs to be enabled when
  20. ; starting/stopping the coprocessor with the pmenb/pmdis.
  21. ;
  22. .text
  23. .align 32
  24. .export perf_intrigue_enable_perf_counters,code
  25. perf_intrigue_enable_perf_counters:
  26. .proc
  27. .callinfo  frame=0,NO_CALLS
  28. .entry
  29. ldi     0x20,%r25                ; load up perfmon bit
  30. mfctl   ccr,%r26                 ; get coprocessor register
  31. or      %r25,%r26,%r26             ; set bit
  32. mtctl   %r26,ccr                 ; turn on performance coprocessor
  33. pmenb                           ; enable performance monitor
  34. ssm     0,0                     ; dummy op to ensure completion
  35. sync                            ; follow ERS
  36. andcm   %r26,%r25,%r26             ; clear bit now 
  37. mtctl   %r26,ccr                 ; turn off performance coprocessor
  38. nop                             ; NOPs as specified in ERS
  39. nop
  40. nop
  41. nop
  42. nop
  43. nop
  44. nop
  45. bve    (%r2)
  46. nop
  47. .exit
  48. .procend
  49. .export perf_intrigue_disable_perf_counters,code
  50. perf_intrigue_disable_perf_counters:
  51. .proc
  52. .callinfo  frame=0,NO_CALLS
  53. .entry
  54. ldi     0x20,%r25                ; load up perfmon bit
  55. mfctl   ccr,%r26                 ; get coprocessor register
  56. or      %r25,%r26,%r26             ; set bit
  57. mtctl   %r26,ccr                 ; turn on performance coprocessor
  58. pmdis                           ; disable performance monitor
  59. ssm     0,0                     ; dummy op to ensure completion
  60. andcm   %r26,%r25,%r26             ; clear bit now 
  61. bve    (%r2)
  62. mtctl   %r26,ccr                 ; turn off performance coprocessor
  63. .exit
  64. .procend
  65. ;************************************************************************
  66. ;* *
  67. ;* Name: perf_rdr_shift_in_W *
  68. ;* *
  69. ;* Description: *
  70. ;* This routine shifts data in from the RDR in arg0 and returns *
  71. ;* the result in ret0.  If the RDR is <= 64 bits in length, it *
  72. ;* is shifted shifted backup immediately.  This is to compensate *
  73. ;* for RDR10 which has bits that preclude PDC stack operations *
  74. ;* when they are in the wrong state. *
  75. ;* *
  76. ;* Arguments: *
  77. ;* arg0 : rdr to be read *
  78. ;* arg1 : bit length of rdr *
  79. ;* *
  80. ;* Returns: *
  81. ;* ret0 = next 64 bits of rdr data from staging register *
  82. ;* *
  83. ;* Register usage: *
  84. ;* arg0 : rdr to be read *
  85. ;* arg1 : bit length of rdr *
  86. ;* %r24  - original DR2 value *
  87. ;* %r1   - scratch *
  88. ;*  %r29  - scratch *
  89. ;* *
  90. ;* Returns: *
  91. ;* ret0 = RDR data (right justified) *
  92. ;* *
  93. ;************************************************************************
  94. .export perf_rdr_shift_in_W,code
  95. perf_rdr_shift_in_W:
  96. .proc
  97. .callinfo frame=0,NO_CALLS
  98. .entry
  99. ;
  100. ; read(shift in) the RDR.
  101. ;
  102. ; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any
  103. ; shifting is done, from or to, remote diagnose registers.
  104. ;
  105. depdi,z 1,DR2_SLOW_RET,1,%r29
  106. MFDIAG_2 (24)
  107. or     %r24,%r29,%r29
  108. MTDIAG_2 (29) ; set DR2_SLOW_RET
  109. nop
  110. nop
  111. nop
  112. nop
  113. ;
  114. ; Cacheline start (32-byte cacheline)
  115. ;
  116. nop
  117. nop
  118. nop
  119. extrd,u arg1,63,6,%r1    ; setup shift amount based on bits to move 
  120. mtsar %r1
  121. shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number
  122. blr   %r1,%r0     ; branch to 8-instruction sequence
  123. nop
  124. ;
  125. ; Cacheline start (32-byte cacheline)
  126. ;
  127. ;
  128. ; RDR 0 sequence
  129. ;
  130. SFDIAG (0)
  131. ssm     0,0
  132. MFDIAG_1 (28)
  133. shrpd ret0,%r0,%sar,%r1
  134. MTDIAG_1 (1) ; mtdiag %dr1, %r1 
  135. STDIAG (0)
  136. ssm     0,0
  137. b,n         perf_rdr_shift_in_W_leave
  138. ;
  139. ; RDR 1 sequence
  140. ;
  141. sync
  142. ssm     0,0
  143. SFDIAG (1)
  144. ssm     0,0
  145. MFDIAG_1 (28)
  146. ssm     0,0
  147. b,n         perf_rdr_shift_in_W_leave
  148. nop
  149. ;
  150. ; RDR 2 read sequence
  151. ;
  152. SFDIAG (2)
  153. ssm     0,0
  154. MFDIAG_1 (28)
  155. shrpd ret0,%r0,%sar,%r1
  156. MTDIAG_1 (1)
  157. STDIAG (2)
  158. ssm     0,0
  159. b,n         perf_rdr_shift_in_W_leave
  160. ;
  161. ; RDR 3 read sequence
  162. ;
  163. b,n         perf_rdr_shift_in_W_leave
  164. nop
  165. nop
  166. nop
  167. nop
  168. nop
  169. nop
  170. nop
  171. ;
  172. ; RDR 4 read sequence
  173. ;
  174. sync
  175. ssm 0,0
  176. SFDIAG (4)
  177. ssm 0,0
  178. MFDIAG_1 (28)
  179. b,n         perf_rdr_shift_in_W_leave
  180. ssm 0,0
  181. nop
  182. ; RDR 5 read sequence
  183. ;
  184. sync
  185. ssm 0,0
  186. SFDIAG (5)
  187. ssm 0,0
  188. MFDIAG_1 (28)
  189. b,n         perf_rdr_shift_in_W_leave
  190. ssm 0,0
  191. nop
  192. ;
  193. ; RDR 6 read sequence
  194. ;
  195. sync
  196. ssm 0,0
  197. SFDIAG (6)
  198. ssm 0,0
  199. MFDIAG_1 (28)
  200. b,n         perf_rdr_shift_in_W_leave
  201. ssm 0,0
  202. nop
  203. ;
  204. ; RDR 7 read sequence
  205. ;
  206. b,n         perf_rdr_shift_in_W_leave
  207. nop
  208. nop
  209. nop
  210. nop
  211. nop
  212. nop
  213. nop
  214. ;
  215. ; RDR 8 read sequence
  216. ;
  217. b,n         perf_rdr_shift_in_W_leave
  218. nop
  219. nop
  220. nop
  221. nop
  222. nop
  223. nop
  224. nop
  225. ;
  226. ; RDR 9 read sequence
  227. ;
  228. b,n         perf_rdr_shift_in_W_leave
  229. nop
  230. nop
  231. nop
  232. nop
  233. nop
  234. nop
  235. nop
  236. ;
  237. ; RDR 10 read sequence
  238. ;
  239. SFDIAG (10)
  240. ssm 0,0
  241. MFDIAG_1 (28)
  242. shrpd ret0,%r0,%sar,%r1
  243. MTDIAG_1 (1)
  244. STDIAG (10)
  245. ssm 0,0
  246. b,n         perf_rdr_shift_in_W_leave
  247. ;
  248. ; RDR 11 read sequence
  249. ;
  250. SFDIAG (11)
  251. ssm 0,0
  252. MFDIAG_1 (28)
  253. shrpd ret0,%r0,%sar,%r1
  254. MTDIAG_1 (1)
  255. STDIAG (11)
  256. ssm 0,0
  257. b,n         perf_rdr_shift_in_W_leave
  258. ;
  259. ; RDR 12 read sequence
  260. ;
  261. b,n         perf_rdr_shift_in_W_leave
  262. nop
  263. nop
  264. nop
  265. nop
  266. nop
  267. nop
  268. nop
  269. ;
  270. ; RDR 13 read sequence
  271. ;
  272. sync
  273. ssm 0,0
  274. SFDIAG (13)
  275. ssm 0,0
  276. MFDIAG_1 (28)
  277. b,n         perf_rdr_shift_in_W_leave
  278. ssm 0,0
  279. nop
  280. ;
  281. ; RDR 14 read sequence
  282. ;
  283. SFDIAG (14)
  284. ssm 0,0
  285. MFDIAG_1 (28)
  286. shrpd ret0,%r0,%sar,%r1
  287. MTDIAG_1 (1)
  288. STDIAG (14)
  289. ssm 0,0
  290. b,n         perf_rdr_shift_in_W_leave
  291. ;
  292. ; RDR 15 read sequence
  293. ;
  294. sync ; RDR 15 read sequence
  295. ssm 0,0
  296. SFDIAG (15)
  297. ssm 0,0
  298. MFDIAG_1 (28)
  299. ssm 0,0
  300. b,n         perf_rdr_shift_in_W_leave
  301. nop
  302. ;
  303. ; RDR 16 read sequence
  304. ;
  305. sync ; RDR 16 read sequence
  306. ssm 0,0
  307. SFDIAG (16)
  308. ssm 0,0
  309. MFDIAG_1 (28)
  310. b,n         perf_rdr_shift_in_W_leave
  311. ssm 0,0
  312. nop
  313. ;
  314. ; RDR 17 read sequence
  315. ;
  316. SFDIAG (17)
  317. ssm 0,0
  318. MFDIAG_1 (28)
  319. shrpd ret0,%r0,%sar,%r1
  320. MTDIAG_1 (1)
  321. STDIAG (17)
  322. ssm 0,0
  323. b,n         perf_rdr_shift_in_W_leave
  324. ;
  325. ; RDR 18 read sequence
  326. ;
  327. SFDIAG (18)
  328. ssm 0,0
  329. MFDIAG_1 (28)
  330. shrpd ret0,%r0,%sar,%r1
  331. MTDIAG_1 (1)
  332. STDIAG (18)
  333. ssm 0,0
  334. b,n         perf_rdr_shift_in_W_leave
  335. ;
  336. ; RDR 19 read sequence
  337. ;
  338. b,n         perf_rdr_shift_in_W_leave
  339. nop
  340. nop
  341. nop
  342. nop
  343. nop
  344. nop
  345. nop
  346. ;
  347. ; RDR 20 read sequence
  348. ;
  349. sync
  350. ssm 0,0
  351. SFDIAG (20)
  352. ssm 0,0
  353. MFDIAG_1 (28)
  354. b,n         perf_rdr_shift_in_W_leave
  355. ssm 0,0
  356. nop
  357. ;
  358. ; RDR 21 read sequence
  359. ;
  360. sync
  361. ssm 0,0
  362. SFDIAG (21)
  363. ssm 0,0
  364. MFDIAG_1 (28)
  365. b,n         perf_rdr_shift_in_W_leave
  366. ssm 0,0
  367. nop
  368. ;
  369. ; RDR 22 read sequence
  370. ;
  371. sync
  372. ssm 0,0
  373. SFDIAG (22)
  374. ssm 0,0
  375. MFDIAG_1 (28)
  376. b,n         perf_rdr_shift_in_W_leave
  377. ssm 0,0
  378. nop
  379. ;
  380. ; RDR 23 read sequence
  381. ;
  382. sync
  383. ssm 0,0
  384. SFDIAG (23)
  385. ssm 0,0
  386. MFDIAG_1 (28)
  387. b,n         perf_rdr_shift_in_W_leave
  388. ssm 0,0
  389. nop
  390. ;
  391. ; RDR 24 read sequence
  392. ;
  393. sync
  394. ssm 0,0
  395. SFDIAG (24)
  396. ssm 0,0
  397. MFDIAG_1 (28)
  398. b,n         perf_rdr_shift_in_W_leave
  399. ssm 0,0
  400. nop
  401. ;
  402. ; RDR 25 read sequence
  403. ;
  404. sync
  405. ssm 0,0
  406. SFDIAG (25)
  407. ssm 0,0
  408. MFDIAG_1 (28)
  409. b,n         perf_rdr_shift_in_W_leave
  410. ssm 0,0
  411. nop
  412. ;
  413. ; RDR 26 read sequence
  414. ;
  415. SFDIAG (26)
  416. ssm 0,0
  417. MFDIAG_1 (28)
  418. shrpd ret0,%r0,%sar,%r1
  419. MTDIAG_1 (1)
  420. STDIAG (26)
  421. ssm 0,0
  422. b,n         perf_rdr_shift_in_W_leave
  423. ;
  424. ; RDR 27 read sequence
  425. ;
  426. SFDIAG (27)
  427. ssm 0,0
  428. MFDIAG_1 (28)
  429. shrpd ret0,%r0,%sar,%r1
  430. MTDIAG_1 (1)
  431. STDIAG (27)
  432. ssm 0,0
  433. b,n         perf_rdr_shift_in_W_leave
  434. ;
  435. ; RDR 28 read sequence
  436. ;
  437. sync
  438. ssm 0,0
  439. SFDIAG (28)
  440. ssm 0,0
  441. MFDIAG_1 (28)
  442. b,n         perf_rdr_shift_in_W_leave
  443. ssm 0,0
  444. nop
  445. ;
  446. ; RDR 29 read sequence
  447. ;
  448. sync
  449. ssm 0,0
  450. SFDIAG (29)
  451. ssm 0,0
  452. MFDIAG_1 (28)
  453. b,n         perf_rdr_shift_in_W_leave
  454. ssm 0,0
  455. nop
  456. ;
  457. ; RDR 30 read sequence
  458. ;
  459. SFDIAG (30)
  460. ssm 0,0
  461. MFDIAG_1 (28)
  462. shrpd ret0,%r0,%sar,%r1
  463. MTDIAG_1 (1)
  464. STDIAG (30)
  465. ssm 0,0
  466. b,n         perf_rdr_shift_in_W_leave
  467. ;
  468. ; RDR 31 read sequence
  469. ;
  470. sync
  471. ssm 0,0
  472. SFDIAG (31)
  473. ssm 0,0
  474. MFDIAG_1 (28)
  475. nop
  476. ssm 0,0
  477. nop
  478. ;
  479. ; Fallthrough
  480. ;
  481. perf_rdr_shift_in_W_leave:
  482. bve     (%r2)
  483. .exit
  484. MTDIAG_2 (24) ; restore DR2
  485. .procend
  486. ;************************************************************************
  487. ;* *
  488. ;* Name: perf_rdr_shift_out_W *
  489. ;* *
  490. ;* Description: *
  491. ;* This routine moves data to the RDR's.  The double-word that *
  492. ;* arg1 points to is loaded and moved into the staging register. *
  493. ;* Then the STDIAG instruction for the RDR # in arg0 is called *
  494. ;* to move the data to the RDR. *
  495. ;* *
  496. ;* Arguments: *
  497. ;* arg0 = rdr number *
  498. ;* arg1 = 64-bit value to write *
  499. ;* %r24 - DR2 | DR2_SLOW_RET *
  500. ;* %r23 - original DR2 value *
  501. ;* *
  502. ;* Returns: *
  503. ;* None *
  504. ;* *
  505. ;* Register usage: *
  506. ;* *
  507. ;************************************************************************
  508. .export perf_rdr_shift_out_W,code
  509. perf_rdr_shift_out_W:
  510. .proc
  511. .callinfo frame=0,NO_CALLS
  512. .entry
  513. ;
  514. ; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any
  515. ; shifting is done, from or to, the remote diagnose registers.
  516. ;
  517. depdi,z 1,DR2_SLOW_RET,1,%r24
  518. MFDIAG_2 (23)
  519. or      %r24,%r23,%r24
  520. MTDIAG_2 (24) ; set DR2_SLOW_RET
  521. MTDIAG_1 (25) ; data to the staging register
  522. shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number
  523. blr     %r1,%r0     ; branch to 8-instruction sequence
  524. nop
  525. ;
  526. ; RDR 0 write sequence
  527. ;
  528. sync ; RDR 0 write sequence
  529. ssm 0,0
  530. STDIAG (0)
  531. ssm 0,0
  532. b,n         perf_rdr_shift_out_W_leave
  533. nop
  534. ssm 0,0
  535. nop
  536. ;
  537. ; RDR 1 write sequence
  538. ;
  539. sync
  540. ssm 0,0
  541. STDIAG (1)
  542. ssm 0,0
  543. b,n         perf_rdr_shift_out_W_leave
  544. nop
  545. ssm 0,0
  546. nop
  547. ;
  548. ; RDR 2 write sequence
  549. ;
  550. sync
  551. ssm 0,0
  552. STDIAG (2)
  553. ssm 0,0
  554. b,n         perf_rdr_shift_out_W_leave
  555. nop
  556. ssm 0,0
  557. nop
  558. ;
  559. ; RDR 3 write sequence
  560. ;
  561. sync
  562. ssm 0,0
  563. STDIAG (3)
  564. ssm 0,0
  565. b,n         perf_rdr_shift_out_W_leave
  566. nop
  567. ssm 0,0
  568. nop
  569. ;
  570. ; RDR 4 write sequence
  571. ;
  572. sync
  573. ssm 0,0
  574. STDIAG (4)
  575. ssm 0,0
  576. b,n         perf_rdr_shift_out_W_leave
  577. nop
  578. ssm 0,0
  579. nop
  580. ;
  581. ; RDR 5 write sequence
  582. ;
  583. sync
  584. ssm 0,0
  585. STDIAG (5)
  586. ssm 0,0
  587. b,n         perf_rdr_shift_out_W_leave
  588. nop
  589. ssm 0,0
  590. nop
  591. ;
  592. ; RDR 6 write sequence
  593. ;
  594. sync
  595. ssm 0,0
  596. STDIAG (6)
  597. ssm 0,0
  598. b,n         perf_rdr_shift_out_W_leave
  599. nop
  600. ssm 0,0
  601. nop
  602. ;
  603. ; RDR 7 write sequence
  604. ;
  605. sync
  606. ssm 0,0
  607. STDIAG (7)
  608. ssm 0,0
  609. b,n         perf_rdr_shift_out_W_leave
  610. nop
  611. ssm 0,0
  612. nop
  613. ;
  614. ; RDR 8 write sequence
  615. ;
  616. sync
  617. ssm 0,0
  618. STDIAG (8)
  619. ssm 0,0
  620. b,n         perf_rdr_shift_out_W_leave
  621. nop
  622. ssm 0,0
  623. nop
  624. ;
  625. ; RDR 9 write sequence
  626. ;
  627. sync
  628. ssm 0,0
  629. STDIAG (9)
  630. ssm 0,0
  631. b,n         perf_rdr_shift_out_W_leave
  632. nop
  633. ssm 0,0
  634. nop
  635. ;
  636. ; RDR 10 write sequence
  637. ;
  638. sync
  639. ssm 0,0
  640. STDIAG (10)
  641. STDIAG (26)
  642. ssm 0,0
  643. b,n         perf_rdr_shift_out_W_leave
  644. ssm 0,0
  645. nop
  646. ;
  647. ; RDR 11 write sequence
  648. ;
  649. sync
  650. ssm 0,0
  651. STDIAG (11)
  652. STDIAG (27)
  653. ssm 0,0
  654. b,n         perf_rdr_shift_out_W_leave
  655. ssm 0,0
  656. nop
  657. ;
  658. ; RDR 12 write sequence
  659. ;
  660. sync
  661. ssm 0,0
  662. STDIAG (12)
  663. ssm 0,0
  664. b,n         perf_rdr_shift_out_W_leave
  665. nop
  666. ssm 0,0
  667. nop
  668. ;
  669. ; RDR 13 write sequence
  670. ;
  671. sync
  672. ssm 0,0
  673. STDIAG (13)
  674. ssm 0,0
  675. b,n         perf_rdr_shift_out_W_leave
  676. nop
  677. ssm 0,0
  678. nop
  679. ;
  680. ; RDR 14 write sequence
  681. ;
  682. sync
  683. ssm 0,0
  684. STDIAG (14)
  685. ssm 0,0
  686. b,n         perf_rdr_shift_out_W_leave
  687. nop
  688. ssm 0,0
  689. nop
  690. ;
  691. ; RDR 15 write sequence
  692. ;
  693. sync
  694. ssm 0,0
  695. STDIAG (15)
  696. ssm 0,0
  697. b,n         perf_rdr_shift_out_W_leave
  698. nop
  699. ssm 0,0
  700. nop
  701. ;
  702. ; RDR 16 write sequence
  703. ;
  704. sync
  705. ssm 0,0
  706. STDIAG (16)
  707. ssm 0,0
  708. b,n         perf_rdr_shift_out_W_leave
  709. nop
  710. ssm 0,0
  711. nop
  712. ;
  713. ; RDR 17 write sequence
  714. ;
  715. sync
  716. ssm 0,0
  717. STDIAG (17)
  718. ssm 0,0
  719. b,n         perf_rdr_shift_out_W_leave
  720. nop
  721. ssm 0,0
  722. nop
  723. ;
  724. ; RDR 18 write sequence
  725. ;
  726. sync
  727. ssm 0,0
  728. STDIAG (18)
  729. ssm 0,0
  730. b,n         perf_rdr_shift_out_W_leave
  731. nop
  732. ssm 0,0
  733. nop
  734. ;
  735. ; RDR 19 write sequence
  736. ;
  737. sync
  738. ssm 0,0
  739. STDIAG (19)
  740. ssm 0,0
  741. b,n         perf_rdr_shift_out_W_leave
  742. nop
  743. ssm 0,0
  744. nop
  745. ;
  746. ; RDR 20 write sequence
  747. ;
  748. sync
  749. ssm 0,0
  750. STDIAG (20)
  751. ssm 0,0
  752. b,n         perf_rdr_shift_out_W_leave
  753. nop
  754. ssm 0,0
  755. nop
  756. ;
  757. ; RDR 21 write sequence
  758. ;
  759. sync
  760. ssm 0,0
  761. STDIAG (21)
  762. ssm 0,0
  763. b,n         perf_rdr_shift_out_W_leave
  764. nop
  765. ssm 0,0
  766. nop
  767. ;
  768. ; RDR 22 write sequence
  769. ;
  770. sync
  771. ssm 0,0
  772. STDIAG (22)
  773. ssm 0,0
  774. b,n         perf_rdr_shift_out_W_leave
  775. nop
  776. ssm 0,0
  777. nop
  778. ;
  779. ; RDR 23 write sequence
  780. ;
  781. sync
  782. ssm 0,0
  783. STDIAG (23)
  784. ssm 0,0
  785. b,n         perf_rdr_shift_out_W_leave
  786. nop
  787. ssm 0,0
  788. nop
  789. ;
  790. ; RDR 24 write sequence
  791. ;
  792. sync
  793. ssm 0,0
  794. STDIAG (24)
  795. ssm 0,0
  796. b,n         perf_rdr_shift_out_W_leave
  797. nop
  798. ssm 0,0
  799. nop
  800. ;
  801. ; RDR 25 write sequence
  802. ;
  803. sync
  804. ssm 0,0
  805. STDIAG (25)
  806. ssm 0,0
  807. b,n         perf_rdr_shift_out_W_leave
  808. nop
  809. ssm 0,0
  810. nop
  811. ;
  812. ; RDR 26 write sequence
  813. ;
  814. sync
  815. ssm 0,0
  816. STDIAG (10)
  817. STDIAG (26)
  818. ssm 0,0
  819. b,n         perf_rdr_shift_out_W_leave
  820. ssm 0,0
  821. nop
  822. ;
  823. ; RDR 27 write sequence
  824. ;
  825. sync
  826. ssm 0,0
  827. STDIAG (11)
  828. STDIAG (27)
  829. ssm 0,0
  830. b,n         perf_rdr_shift_out_W_leave
  831. ssm 0,0
  832. nop
  833. ;
  834. ; RDR 28 write sequence
  835. ;
  836. sync
  837. ssm 0,0
  838. STDIAG (28)
  839. ssm 0,0
  840. b,n         perf_rdr_shift_out_W_leave
  841. nop
  842. ssm 0,0
  843. nop
  844. ;
  845. ; RDR 29 write sequence
  846. ;
  847. sync
  848. ssm 0,0
  849. STDIAG (29)
  850. ssm 0,0
  851. b,n         perf_rdr_shift_out_W_leave
  852. nop
  853. ssm 0,0
  854. nop
  855. ;
  856. ; RDR 30 write sequence
  857. ;
  858. sync
  859. ssm 0,0
  860. STDIAG (30)
  861. ssm 0,0
  862. b,n         perf_rdr_shift_out_W_leave
  863. nop
  864. ssm 0,0
  865. nop
  866. ;
  867. ; RDR 31 write sequence
  868. ;
  869. sync
  870. ssm 0,0
  871. STDIAG (31)
  872. ssm 0,0
  873. b,n         perf_rdr_shift_out_W_leave
  874. nop
  875. ssm 0,0
  876. nop
  877. perf_rdr_shift_out_W_leave:
  878. bve (%r2)
  879. .exit
  880. MTDIAG_2 (23) ; restore DR2
  881. .procend
  882. ;**************************** CHRIS ***********************************
  883. ;************************************************************************
  884. ;* *
  885. ;* Name: rdr_shift_in_U *
  886. ;* *
  887. ;* Description: *
  888. ;* This routine shifts data in from the RDR in arg0 and returns *
  889. ;* the result in ret0.  If the RDR is <= 64 bits in length, it *
  890. ;* is shifted shifted backup immediately.  This is to compensate *
  891. ;* for RDR10 which has bits that preclude PDC stack operations *
  892. ;* when they are in the wrong state. *
  893. ;* *
  894. ;* Arguments: *
  895. ;* arg0 : rdr to be read *
  896. ;* arg1 : bit length of rdr *
  897. ;* *
  898. ;* Returns: *
  899. ;* ret0 = next 64 bits of rdr data from staging register *
  900. ;* *
  901. ;* Register usage: *
  902. ;* arg0 : rdr to be read                         *
  903. ;* arg1 : bit length of rdr                         *
  904. ;* %r24 - original DR2 value *
  905. ;* %r23 - DR2 | DR2_SLOW_RET *
  906. ;* %r1  - scratch *
  907. ;* *
  908. ;************************************************************************
  909. .export perf_rdr_shift_in_U,code
  910. perf_rdr_shift_in_U:
  911. .proc
  912. .callinfo frame=0,NO_CALLS
  913. .entry
  914. ; read(shift in) the RDR.
  915. ;
  916. ; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any
  917. ; shifting is done, from or to, remote diagnose registers.
  918. depdi,z 1,DR2_SLOW_RET,1,%r29
  919. MFDIAG_2 (24)
  920. or %r24,%r29,%r29
  921. MTDIAG_2 (29) ; set DR2_SLOW_RET
  922. nop
  923. nop
  924. nop
  925. nop
  926. ;
  927. ; Start of next 32-byte cacheline
  928. ;
  929. nop
  930. nop
  931. nop
  932. extrd,u arg1,63,6,%r1
  933. mtsar %r1
  934. shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number
  935. blr  %r1,%r0 ; branch to 8-instruction sequence
  936. nop
  937. ;
  938. ; Start of next 32-byte cacheline
  939. ;
  940. SFDIAG (0) ; RDR 0 read sequence
  941. ssm 0,0
  942. MFDIAG_1 (28)
  943. shrpd ret0,%r0,%sar,%r1
  944. MTDIAG_1 (1)
  945. STDIAG (0)
  946. ssm 0,0
  947. b,n         perf_rdr_shift_in_U_leave
  948. SFDIAG (1) ; RDR 1 read sequence
  949. ssm 0,0
  950. MFDIAG_1 (28)
  951. shrpd ret0,%r0,%sar,%r1
  952. MTDIAG_1 (1)
  953. STDIAG (1)
  954. ssm 0,0
  955. b,n         perf_rdr_shift_in_U_leave
  956. sync ; RDR 2 read sequence
  957. ssm 0,0
  958. SFDIAG (4)
  959. ssm 0,0
  960. MFDIAG_1 (28)
  961. b,n         perf_rdr_shift_in_U_leave
  962. ssm 0,0
  963. nop
  964. sync ; RDR 3 read sequence
  965. ssm 0,0
  966. SFDIAG (3)
  967. ssm 0,0
  968. MFDIAG_1 (28)
  969. b,n         perf_rdr_shift_in_U_leave
  970. ssm 0,0
  971. nop
  972. sync ; RDR 4 read sequence
  973. ssm 0,0
  974. SFDIAG (4)
  975. ssm 0,0
  976. MFDIAG_1 (28)
  977. b,n         perf_rdr_shift_in_U_leave
  978. ssm 0,0
  979. nop
  980. sync ; RDR 5 read sequence
  981. ssm 0,0
  982. SFDIAG (5)
  983. ssm 0,0
  984. MFDIAG_1 (28)
  985. b,n         perf_rdr_shift_in_U_leave
  986. ssm 0,0
  987. nop
  988. sync ; RDR 6 read sequence
  989. ssm 0,0
  990. SFDIAG (6)
  991. ssm 0,0
  992. MFDIAG_1 (28)
  993. b,n         perf_rdr_shift_in_U_leave
  994. ssm 0,0
  995. nop
  996. sync ; RDR 7 read sequence
  997. ssm 0,0
  998. SFDIAG (7)
  999. ssm 0,0
  1000. MFDIAG_1 (28)
  1001. b,n         perf_rdr_shift_in_U_leave
  1002. ssm 0,0
  1003. nop
  1004. b,n         perf_rdr_shift_in_U_leave
  1005. nop
  1006. nop
  1007. nop
  1008. nop
  1009. nop
  1010. nop
  1011. nop
  1012. SFDIAG (9) ; RDR 9 read sequence
  1013. ssm 0,0
  1014. MFDIAG_1 (28)
  1015. shrpd ret0,%r0,%sar,%r1
  1016. MTDIAG_1 (1)
  1017. STDIAG (9)
  1018. ssm 0,0
  1019. b,n         perf_rdr_shift_in_U_leave
  1020. SFDIAG (10) ; RDR 10 read sequence
  1021. ssm 0,0
  1022. MFDIAG_1 (28)
  1023. shrpd ret0,%r0,%sar,%r1
  1024. MTDIAG_1 (1)
  1025. STDIAG (10)
  1026. ssm 0,0
  1027. b,n         perf_rdr_shift_in_U_leave
  1028. SFDIAG (11) ; RDR 11 read sequence
  1029. ssm 0,0
  1030. MFDIAG_1 (28)
  1031. shrpd ret0,%r0,%sar,%r1
  1032. MTDIAG_1 (1)
  1033. STDIAG (11)
  1034. ssm 0,0
  1035. b,n         perf_rdr_shift_in_U_leave
  1036. SFDIAG (12) ; RDR 12 read sequence
  1037. ssm 0,0
  1038. MFDIAG_1 (28)
  1039. shrpd ret0,%r0,%sar,%r1
  1040. MTDIAG_1 (1)
  1041. STDIAG (12)
  1042. ssm 0,0
  1043. b,n         perf_rdr_shift_in_U_leave
  1044. SFDIAG (13) ; RDR 13 read sequence
  1045. ssm 0,0
  1046. MFDIAG_1 (28)
  1047. shrpd ret0,%r0,%sar,%r1
  1048. MTDIAG_1 (1)
  1049. STDIAG (13)
  1050. ssm 0,0
  1051. b,n         perf_rdr_shift_in_U_leave
  1052. SFDIAG (14) ; RDR 14 read sequence
  1053. ssm 0,0
  1054. MFDIAG_1 (28)
  1055. shrpd ret0,%r0,%sar,%r1
  1056. MTDIAG_1 (1)
  1057. STDIAG (14)
  1058. ssm 0,0
  1059. b,n         perf_rdr_shift_in_U_leave
  1060. SFDIAG (15) ; RDR 15 read sequence
  1061. ssm 0,0
  1062. MFDIAG_1 (28)
  1063. shrpd ret0,%r0,%sar,%r1
  1064. MTDIAG_1 (1)
  1065. STDIAG (15)
  1066. ssm 0,0
  1067. b,n         perf_rdr_shift_in_U_leave
  1068. sync ; RDR 16 read sequence
  1069. ssm 0,0
  1070. SFDIAG (16)
  1071. ssm 0,0
  1072. MFDIAG_1 (28)
  1073. b,n         perf_rdr_shift_in_U_leave
  1074. ssm 0,0
  1075. nop
  1076. SFDIAG (17) ; RDR 17 read sequence
  1077. ssm 0,0
  1078. MFDIAG_1 (28)
  1079. shrpd ret0,%r0,%sar,%r1
  1080. MTDIAG_1 (1)
  1081. STDIAG (17)
  1082. ssm 0,0
  1083. b,n         perf_rdr_shift_in_U_leave
  1084. SFDIAG (18) ; RDR 18 read sequence
  1085. ssm 0,0
  1086. MFDIAG_1 (28)
  1087. shrpd ret0,%r0,%sar,%r1
  1088. MTDIAG_1 (1)
  1089. STDIAG (18)
  1090. ssm 0,0
  1091. b,n         perf_rdr_shift_in_U_leave
  1092. b,n         perf_rdr_shift_in_U_leave
  1093. nop
  1094. nop
  1095. nop
  1096. nop
  1097. nop
  1098. nop
  1099. nop
  1100. sync ; RDR 20 read sequence
  1101. ssm 0,0
  1102. SFDIAG (20)
  1103. ssm 0,0
  1104. MFDIAG_1 (28)
  1105. b,n         perf_rdr_shift_in_U_leave
  1106. ssm 0,0
  1107. nop
  1108. sync ; RDR 21 read sequence
  1109. ssm 0,0
  1110. SFDIAG (21)
  1111. ssm 0,0
  1112. MFDIAG_1 (28)
  1113. b,n         perf_rdr_shift_in_U_leave
  1114. ssm 0,0
  1115. nop
  1116. sync ; RDR 22 read sequence
  1117. ssm 0,0
  1118. SFDIAG (22)
  1119. ssm 0,0
  1120. MFDIAG_1 (28)
  1121. b,n         perf_rdr_shift_in_U_leave
  1122. ssm 0,0
  1123. nop
  1124. sync ; RDR 23 read sequence
  1125. ssm 0,0
  1126. SFDIAG (23)
  1127. ssm 0,0
  1128. MFDIAG_1 (28)
  1129. b,n         perf_rdr_shift_in_U_leave
  1130. ssm 0,0
  1131. nop
  1132. sync ; RDR 24 read sequence
  1133. ssm 0,0
  1134. SFDIAG (24)
  1135. ssm 0,0
  1136. MFDIAG_1 (28)
  1137. b,n         perf_rdr_shift_in_U_leave
  1138. ssm 0,0
  1139. nop
  1140. sync ; RDR 25 read sequence
  1141. ssm 0,0
  1142. SFDIAG (25)
  1143. ssm 0,0
  1144. MFDIAG_1 (28)
  1145. b,n         perf_rdr_shift_in_U_leave
  1146. ssm 0,0
  1147. nop
  1148. SFDIAG (26) ; RDR 26 read sequence
  1149. ssm 0,0
  1150. MFDIAG_1 (28)
  1151. shrpd ret0,%r0,%sar,%r1
  1152. MTDIAG_1 (1)
  1153. STDIAG (26)
  1154. ssm 0,0
  1155. b,n         perf_rdr_shift_in_U_leave
  1156. SFDIAG (27) ; RDR 27 read sequence
  1157. ssm 0,0
  1158. MFDIAG_1 (28)
  1159. shrpd ret0,%r0,%sar,%r1
  1160. MTDIAG_1 (1)
  1161. STDIAG (27)
  1162. ssm 0,0
  1163. b,n         perf_rdr_shift_in_U_leave
  1164. sync ; RDR 28 read sequence
  1165. ssm 0,0
  1166. SFDIAG (28)
  1167. ssm 0,0
  1168. MFDIAG_1 (28)
  1169. b,n         perf_rdr_shift_in_U_leave
  1170. ssm 0,0
  1171. nop
  1172. b,n         perf_rdr_shift_in_U_leave
  1173. nop
  1174. nop
  1175. nop
  1176. nop
  1177. nop
  1178. nop
  1179. nop
  1180. SFDIAG (30) ; RDR 30 read sequence
  1181. ssm 0,0
  1182. MFDIAG_1 (28)
  1183. shrpd ret0,%r0,%sar,%r1
  1184. MTDIAG_1 (1)
  1185. STDIAG (30)
  1186. ssm 0,0
  1187. b,n         perf_rdr_shift_in_U_leave
  1188. SFDIAG (31) ; RDR 31 read sequence
  1189. ssm 0,0
  1190. MFDIAG_1 (28)
  1191. shrpd ret0,%r0,%sar,%r1
  1192. MTDIAG_1 (1)
  1193. STDIAG (31)
  1194. ssm 0,0
  1195. b,n         perf_rdr_shift_in_U_leave
  1196. nop
  1197. perf_rdr_shift_in_U_leave:
  1198. bve     (%r2)
  1199. .exit
  1200. MTDIAG_2 (24) ; restore DR2
  1201. .procend
  1202. ;************************************************************************
  1203. ;* *
  1204. ;* Name: rdr_shift_out_U *
  1205. ;* *
  1206. ;* Description: *
  1207. ;* This routine moves data to the RDR's.  The double-word that *
  1208. ;* arg1 points to is loaded and moved into the staging register. *
  1209. ;* Then the STDIAG instruction for the RDR # in arg0 is called *
  1210. ;* to move the data to the RDR. *
  1211. ;* *
  1212. ;* Arguments: *
  1213. ;* arg0 = rdr target *
  1214. ;* arg1 = buffer pointer *
  1215. ;* *
  1216. ;* Returns: *
  1217. ;* None *
  1218. ;* *
  1219. ;* Register usage: *
  1220. ;* arg0 = rdr target *
  1221. ;* arg1 = buffer pointer *
  1222. ;* %r24 - DR2 | DR2_SLOW_RET *
  1223. ;* %r23 - original DR2 value *
  1224. ;* *
  1225. ;************************************************************************
  1226. .export perf_rdr_shift_out_U,code
  1227. perf_rdr_shift_out_U:
  1228. .proc
  1229. .callinfo frame=0,NO_CALLS
  1230. .entry
  1231. ;
  1232. ; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any
  1233. ; shifting is done, from or to, the remote diagnose registers.
  1234. ;
  1235. depdi,z 1,DR2_SLOW_RET,1,%r24
  1236. MFDIAG_2 (23)
  1237. or %r24,%r23,%r24
  1238. MTDIAG_2 (24) ; set DR2_SLOW_RET
  1239. MTDIAG_1 (25) ; data to the staging register
  1240. shladd  arg0,2,%r0,%r1 ; %r1 = 4 * RDR number
  1241. blr     %r1,%r0     ; branch to 8-instruction sequence
  1242. nop
  1243. ;
  1244. ; 32-byte cachline aligned
  1245. ;
  1246. sync ; RDR 0 write sequence
  1247. ssm 0,0
  1248. STDIAG (0)
  1249. ssm 0,0
  1250. b,n         perf_rdr_shift_out_U_leave
  1251. nop
  1252. ssm 0,0
  1253. nop
  1254. sync ; RDR 1 write sequence
  1255. ssm 0,0
  1256. STDIAG (1)
  1257. ssm 0,0
  1258. b,n         perf_rdr_shift_out_U_leave
  1259. nop
  1260. ssm 0,0
  1261. nop
  1262. sync ; RDR 2 write sequence
  1263. ssm 0,0
  1264. STDIAG (2)
  1265. ssm 0,0
  1266. b,n         perf_rdr_shift_out_U_leave
  1267. nop
  1268. ssm 0,0
  1269. nop
  1270. sync ; RDR 3 write sequence
  1271. ssm 0,0
  1272. STDIAG (3)
  1273. ssm 0,0
  1274. b,n         perf_rdr_shift_out_U_leave
  1275. nop
  1276. ssm 0,0
  1277. nop
  1278. sync ; RDR 4 write sequence
  1279. ssm 0,0
  1280. STDIAG (4)
  1281. ssm 0,0
  1282. b,n         perf_rdr_shift_out_U_leave
  1283. nop
  1284. ssm 0,0
  1285. nop
  1286. sync ; RDR 5 write sequence
  1287. ssm 0,0
  1288. STDIAG (5)
  1289. ssm 0,0
  1290. b,n         perf_rdr_shift_out_U_leave
  1291. nop
  1292. ssm 0,0
  1293. nop
  1294. sync ; RDR 6 write sequence
  1295. ssm 0,0
  1296. STDIAG (6)
  1297. ssm 0,0
  1298. b,n         perf_rdr_shift_out_U_leave
  1299. nop
  1300. ssm 0,0
  1301. nop
  1302. sync ; RDR 7 write sequence
  1303. ssm 0,0
  1304. STDIAG (7)
  1305. ssm 0,0
  1306. b,n         perf_rdr_shift_out_U_leave
  1307. nop
  1308. ssm 0,0
  1309. nop
  1310. sync ; RDR 8 write sequence
  1311. ssm 0,0
  1312. STDIAG (8)
  1313. ssm 0,0
  1314. b,n         perf_rdr_shift_out_U_leave
  1315. nop
  1316. ssm 0,0
  1317. nop
  1318. sync ; RDR 9 write sequence
  1319. ssm 0,0
  1320. STDIAG (9)
  1321. ssm 0,0
  1322. b,n         perf_rdr_shift_out_U_leave
  1323. nop
  1324. ssm 0,0
  1325. nop
  1326. sync ; RDR 10 write sequence
  1327. ssm 0,0
  1328. STDIAG (10)
  1329. ssm 0,0
  1330. b,n         perf_rdr_shift_out_U_leave
  1331. nop
  1332. ssm 0,0
  1333. nop
  1334. sync ; RDR 11 write sequence
  1335. ssm 0,0
  1336. STDIAG (11)
  1337. ssm 0,0
  1338. b,n         perf_rdr_shift_out_U_leave
  1339. nop
  1340. ssm 0,0
  1341. nop
  1342. sync ; RDR 12 write sequence
  1343. ssm 0,0
  1344. STDIAG (12)
  1345. ssm 0,0
  1346. b,n         perf_rdr_shift_out_U_leave
  1347. nop
  1348. ssm 0,0
  1349. nop
  1350. sync ; RDR 13 write sequence
  1351. ssm 0,0
  1352. STDIAG (13)
  1353. ssm 0,0
  1354. b,n         perf_rdr_shift_out_U_leave
  1355. nop
  1356. ssm 0,0
  1357. nop
  1358. sync ; RDR 14 write sequence
  1359. ssm 0,0
  1360. STDIAG (14)
  1361. ssm 0,0
  1362. b,n         perf_rdr_shift_out_U_leave
  1363. nop
  1364. ssm 0,0
  1365. nop
  1366. sync ; RDR 15 write sequence
  1367. ssm 0,0
  1368. STDIAG (15)
  1369. ssm 0,0
  1370. b,n         perf_rdr_shift_out_U_leave
  1371. nop
  1372. ssm 0,0
  1373. nop
  1374. sync ; RDR 16 write sequence
  1375. ssm 0,0
  1376. STDIAG (16)
  1377. ssm 0,0
  1378. b,n         perf_rdr_shift_out_U_leave
  1379. nop
  1380. ssm 0,0
  1381. nop
  1382. sync ; RDR 17 write sequence
  1383. ssm 0,0
  1384. STDIAG (17)
  1385. ssm 0,0
  1386. b,n         perf_rdr_shift_out_U_leave
  1387. nop
  1388. ssm 0,0
  1389. nop
  1390. sync ; RDR 18 write sequence
  1391. ssm 0,0
  1392. STDIAG (18)
  1393. ssm 0,0
  1394. b,n         perf_rdr_shift_out_U_leave
  1395. nop
  1396. ssm 0,0
  1397. nop
  1398. sync ; RDR 19 write sequence
  1399. ssm 0,0
  1400. STDIAG (19)
  1401. ssm 0,0
  1402. b,n         perf_rdr_shift_out_U_leave
  1403. nop
  1404. ssm 0,0
  1405. nop
  1406. sync ; RDR 20 write sequence
  1407. ssm 0,0
  1408. STDIAG (20)
  1409. ssm 0,0
  1410. b,n         perf_rdr_shift_out_U_leave
  1411. nop
  1412. ssm 0,0
  1413. nop
  1414. sync ; RDR 21 write sequence
  1415. ssm 0,0
  1416. STDIAG (21)
  1417. ssm 0,0
  1418. b,n         perf_rdr_shift_out_U_leave
  1419. nop
  1420. ssm 0,0
  1421. nop
  1422. sync ; RDR 22 write sequence
  1423. ssm 0,0
  1424. STDIAG (22)
  1425. ssm 0,0
  1426. b,n         perf_rdr_shift_out_U_leave
  1427. nop
  1428. ssm 0,0
  1429. nop
  1430. sync ; RDR 23 write sequence
  1431. ssm 0,0
  1432. STDIAG (23)
  1433. ssm 0,0
  1434. b,n         perf_rdr_shift_out_U_leave
  1435. nop
  1436. ssm 0,0
  1437. nop
  1438. sync ; RDR 24 write sequence
  1439. ssm 0,0
  1440. STDIAG (24)
  1441. ssm 0,0
  1442. b,n         perf_rdr_shift_out_U_leave
  1443. nop
  1444. ssm 0,0
  1445. nop
  1446. sync ; RDR 25 write sequence
  1447. ssm 0,0
  1448. STDIAG (25)
  1449. ssm 0,0
  1450. b,n         perf_rdr_shift_out_U_leave
  1451. nop
  1452. ssm 0,0
  1453. nop
  1454. sync ; RDR 26 write sequence
  1455. ssm 0,0
  1456. STDIAG (26)
  1457. ssm 0,0
  1458. b,n         perf_rdr_shift_out_U_leave
  1459. nop
  1460. ssm 0,0
  1461. nop
  1462. sync ; RDR 27 write sequence
  1463. ssm 0,0
  1464. STDIAG (27)
  1465. ssm 0,0
  1466. b,n         perf_rdr_shift_out_U_leave
  1467. nop
  1468. ssm 0,0
  1469. nop
  1470. sync ; RDR 28 write sequence
  1471. ssm 0,0
  1472. STDIAG (28)
  1473. ssm 0,0
  1474. b,n         perf_rdr_shift_out_U_leave
  1475. nop
  1476. ssm 0,0
  1477. nop
  1478. sync ; RDR 29 write sequence
  1479. ssm 0,0
  1480. STDIAG (29)
  1481. ssm 0,0
  1482. b,n         perf_rdr_shift_out_U_leave
  1483. nop
  1484. ssm 0,0
  1485. nop
  1486. sync ; RDR 30 write sequence
  1487. ssm 0,0
  1488. STDIAG (30)
  1489. ssm 0,0
  1490. b,n         perf_rdr_shift_out_U_leave
  1491. nop
  1492. ssm 0,0
  1493. nop
  1494. sync ; RDR 31 write sequence
  1495. ssm 0,0
  1496. STDIAG (31)
  1497. ssm 0,0
  1498. b,n         perf_rdr_shift_out_U_leave
  1499. nop
  1500. ssm 0,0
  1501. nop
  1502. perf_rdr_shift_out_U_leave:
  1503. bve (%r2)
  1504. .exit
  1505. MTDIAG_2 (23) ; restore DR2
  1506. .procend