/* low-level asm for "intrigue" (PA8500-8700 CPU perf counters) * * Copyright (C) 2001 Randolph Chung <tausq at parisc-linux.org> * Copyright (C) 2001 Hewlett-Packard (Grant Grundler) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include <asm/assembly.h> #include <linux/init.h> #include <linux/linkage.h> #ifdef CONFIG_64BIT .level 2.0w #endif /* CONFIG_64BIT */ #define MTDIAG_1(gr) .word 0x14201840 + gr*0x10000 #define MTDIAG_2(gr) .word 0x14401840 + gr*0x10000 #define MFDIAG_1(gr) .word 0x142008A0 + gr #define MFDIAG_2(gr) .word 0x144008A0 + gr #define STDIAG(dr) .word 0x14000AA0 + dr*0x200000 #define SFDIAG(dr) .word 0x14000BA0 + dr*0x200000 #define DR2_SLOW_RET 53 ; ; Enable the performance counters ; ; The coprocessor only needs to be enabled when ; starting/stopping the coprocessor with the pmenb/pmdis. ; .text ENTRY(perf_intrigue_enable_perf_counters) .proc .callinfo frame=0,NO_CALLS .entry ldi 0x20,%r25 ; load up perfmon bit mfctl ccr,%r26 ; get coprocessor register or %r25,%r26,%r26 ; set bit mtctl %r26,ccr ; turn on performance coprocessor pmenb ; enable performance monitor ssm 0,0 ; dummy op to ensure completion sync ; follow ERS andcm %r26,%r25,%r26 ; clear bit now mtctl %r26,ccr ; turn off performance coprocessor nop ; NOPs as specified in ERS nop nop nop nop nop nop bve (%r2) nop .exit .procend ENDPROC(perf_intrigue_enable_perf_counters) ENTRY(perf_intrigue_disable_perf_counters) .proc .callinfo frame=0,NO_CALLS .entry ldi 0x20,%r25 ; load up perfmon bit mfctl ccr,%r26 ; get coprocessor register or %r25,%r26,%r26 ; set bit mtctl %r26,ccr ; turn on performance coprocessor pmdis ; disable performance monitor ssm 0,0 ; dummy op to ensure completion andcm %r26,%r25,%r26 ; clear bit now bve (%r2) mtctl %r26,ccr ; turn off performance coprocessor .exit .procend ENDPROC(perf_intrigue_disable_perf_counters) ;*********************************************************************** ;* ;* Name: perf_rdr_shift_in_W ;* ;* Description: ;* This routine shifts data in from the RDR in arg0 and returns ;* the result in ret0. If the RDR is <= 64 bits in length, it ;* is shifted shifted backup immediately. This is to compensate ;* for RDR10 which has bits that preclude PDC stack operations ;* when they are in the wrong state. ;* ;* Arguments: ;* arg0 : rdr to be read ;* arg1 : bit length of rdr ;* ;* Returns: ;* ret0 = next 64 bits of rdr data from staging register ;* ;* Register usage: ;* arg0 : rdr to be read ;* arg1 : bit length of rdr ;* %r24 - original DR2 value ;* %r1 - scratch ;* %r29 - scratch ;* ;* Returns: ;* ret0 = RDR data (right justified) ;* ;*********************************************************************** ENTRY(perf_rdr_shift_in_W) .proc .callinfo frame=0,NO_CALLS .entry ; ; read(shift in) the RDR. ; ; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any ; shifting is done, from or to, remote diagnose registers. ; depdi,z 1,DR2_SLOW_RET,1,%r29 MFDIAG_2 (24) or %r24,%r29,%r29 MTDIAG_2 (29) ; set DR2_SLOW_RET nop nop nop nop ; ; Cacheline start (32-byte cacheline) ; nop nop nop extrd,u arg1,63,6,%r1 ; setup shift amount by bits to move mtsar %r1 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number blr %r1,%r0 ; branch to 8-instruction sequence nop ; ; Cacheline start (32-byte cacheline) ; ; ; RDR 0 sequence ; SFDIAG (0) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) ; mtdiag %dr1, %r1 STDIAG (0) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 1 sequence ; sync ssm 0,0 SFDIAG (1) ssm 0,0 MFDIAG_1 (28) ssm 0,0 b,n perf_rdr_shift_in_W_leave nop ; ; RDR 2 read sequence ; SFDIAG (2) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (2) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 3 read sequence ; b,n perf_rdr_shift_in_W_leave nop nop nop nop nop nop nop ; ; RDR 4 read sequence ; sync ssm 0,0 SFDIAG (4) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 5 read sequence ; sync ssm 0,0 SFDIAG (5) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 6 read sequence ; sync ssm 0,0 SFDIAG (6) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 7 read sequence ; b,n perf_rdr_shift_in_W_leave nop nop nop nop nop nop nop ; ; RDR 8 read sequence ; b,n perf_rdr_shift_in_W_leave nop nop nop nop nop nop nop ; ; RDR 9 read sequence ; b,n perf_rdr_shift_in_W_leave nop nop nop nop nop nop nop ; ; RDR 10 read sequence ; SFDIAG (10) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (10) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 11 read sequence ; SFDIAG (11) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (11) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 12 read sequence ; b,n perf_rdr_shift_in_W_leave nop nop nop nop nop nop nop ; ; RDR 13 read sequence ; sync ssm 0,0 SFDIAG (13) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 14 read sequence ; SFDIAG (14) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (14) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 15 read sequence ; sync ssm 0,0 SFDIAG (15) ssm 0,0 MFDIAG_1 (28) ssm 0,0 b,n perf_rdr_shift_in_W_leave nop ; ; RDR 16 read sequence ; sync ssm 0,0 SFDIAG (16) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 17 read sequence ; SFDIAG (17) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (17) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 18 read sequence ; SFDIAG (18) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (18) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 19 read sequence ; b,n perf_rdr_shift_in_W_leave nop nop nop nop nop nop nop ; ; RDR 20 read sequence ; sync ssm 0,0 SFDIAG (20) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 21 read sequence ; sync ssm 0,0 SFDIAG (21) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 22 read sequence ; sync ssm 0,0 SFDIAG (22) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 23 read sequence ; sync ssm 0,0 SFDIAG (23) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 24 read sequence ; sync ssm 0,0 SFDIAG (24) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 25 read sequence ; sync ssm 0,0 SFDIAG (25) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 26 read sequence ; SFDIAG (26) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (26) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 27 read sequence ; SFDIAG (27) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (27) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 28 read sequence ; sync ssm 0,0 SFDIAG (28) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 29 read sequence ; sync ssm 0,0 SFDIAG (29) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_W_leave ssm 0,0 nop ; ; RDR 30 read sequence ; SFDIAG (30) ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (30) ssm 0,0 b,n perf_rdr_shift_in_W_leave ; ; RDR 31 read sequence ; sync ssm 0,0 SFDIAG (31) ssm 0,0 MFDIAG_1 (28) nop ssm 0,0 nop ; ; Fallthrough ; perf_rdr_shift_in_W_leave: bve (%r2) .exit MTDIAG_2 (24) ; restore DR2 .procend ENDPROC(perf_rdr_shift_in_W) ;*********************************************************************** ;* ;* Name: perf_rdr_shift_out_W ;* ;* Description: ;* This routine moves data to the RDR's. The double-word that ;* arg1 points to is loaded and moved into the staging register. ;* Then the STDIAG instruction for the RDR # in arg0 is called ;* to move the data to the RDR. ;* ;* Arguments: ;* arg0 = rdr number ;* arg1 = 64-bit value to write ;* %r24 - DR2 | DR2_SLOW_RET ;* %r23 - original DR2 value ;* ;* Returns: ;* None ;* ;* Register usage: ;* ;*********************************************************************** ENTRY(perf_rdr_shift_out_W) .proc .callinfo frame=0,NO_CALLS .entry ; ; NOTE: The PCX-W ERS states that DR2_SLOW_RET must be set before any ; shifting is done, from or to, the remote diagnose registers. ; depdi,z 1,DR2_SLOW_RET,1,%r24 MFDIAG_2 (23) or %r24,%r23,%r24 MTDIAG_2 (24) ; set DR2_SLOW_RET MTDIAG_1 (25) ; data to the staging register shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number blr %r1,%r0 ; branch to 8-instruction sequence nop ; ; RDR 0 write sequence ; sync ; RDR 0 write sequence ssm 0,0 STDIAG (0) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 1 write sequence ; sync ssm 0,0 STDIAG (1) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 2 write sequence ; sync ssm 0,0 STDIAG (2) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 3 write sequence ; sync ssm 0,0 STDIAG (3) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 4 write sequence ; sync ssm 0,0 STDIAG (4) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 5 write sequence ; sync ssm 0,0 STDIAG (5) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 6 write sequence ; sync ssm 0,0 STDIAG (6) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 7 write sequence ; sync ssm 0,0 STDIAG (7) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 8 write sequence ; sync ssm 0,0 STDIAG (8) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 9 write sequence ; sync ssm 0,0 STDIAG (9) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 10 write sequence ; sync ssm 0,0 STDIAG (10) STDIAG (26) ssm 0,0 b,n perf_rdr_shift_out_W_leave ssm 0,0 nop ; ; RDR 11 write sequence ; sync ssm 0,0 STDIAG (11) STDIAG (27) ssm 0,0 b,n perf_rdr_shift_out_W_leave ssm 0,0 nop ; ; RDR 12 write sequence ; sync ssm 0,0 STDIAG (12) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 13 write sequence ; sync ssm 0,0 STDIAG (13) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 14 write sequence ; sync ssm 0,0 STDIAG (14) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 15 write sequence ; sync ssm 0,0 STDIAG (15) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 16 write sequence ; sync ssm 0,0 STDIAG (16) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 17 write sequence ; sync ssm 0,0 STDIAG (17) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 18 write sequence ; sync ssm 0,0 STDIAG (18) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 19 write sequence ; sync ssm 0,0 STDIAG (19) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 20 write sequence ; sync ssm 0,0 STDIAG (20) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 21 write sequence ; sync ssm 0,0 STDIAG (21) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 22 write sequence ; sync ssm 0,0 STDIAG (22) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 23 write sequence ; sync ssm 0,0 STDIAG (23) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 24 write sequence ; sync ssm 0,0 STDIAG (24) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 25 write sequence ; sync ssm 0,0 STDIAG (25) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 26 write sequence ; sync ssm 0,0 STDIAG (10) STDIAG (26) ssm 0,0 b,n perf_rdr_shift_out_W_leave ssm 0,0 nop ; ; RDR 27 write sequence ; sync ssm 0,0 STDIAG (11) STDIAG (27) ssm 0,0 b,n perf_rdr_shift_out_W_leave ssm 0,0 nop ; ; RDR 28 write sequence ; sync ssm 0,0 STDIAG (28) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 29 write sequence ; sync ssm 0,0 STDIAG (29) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 30 write sequence ; sync ssm 0,0 STDIAG (30) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop ; ; RDR 31 write sequence ; sync ssm 0,0 STDIAG (31) ssm 0,0 b,n perf_rdr_shift_out_W_leave nop ssm 0,0 nop perf_rdr_shift_out_W_leave: bve (%r2) .exit MTDIAG_2 (23) ; restore DR2 .procend ENDPROC(perf_rdr_shift_out_W) ;*********************************************************************** ;* ;* Name: rdr_shift_in_U ;* ;* Description: ;* This routine shifts data in from the RDR in arg0 and returns ;* the result in ret0. If the RDR is <= 64 bits in length, it ;* is shifted shifted backup immediately. This is to compensate ;* for RDR10 which has bits that preclude PDC stack operations ;* when they are in the wrong state. ;* ;* Arguments: ;* arg0 : rdr to be read ;* arg1 : bit length of rdr ;* ;* Returns: ;* ret0 = next 64 bits of rdr data from staging register ;* ;* Register usage: ;* arg0 : rdr to be read ;* arg1 : bit length of rdr ;* %r24 - original DR2 value ;* %r23 - DR2 | DR2_SLOW_RET ;* %r1 - scratch ;* ;*********************************************************************** ENTRY(perf_rdr_shift_in_U) .proc .callinfo frame=0,NO_CALLS .entry ; read(shift in) the RDR. ; ; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any ; shifting is done, from or to, remote diagnose registers. depdi,z 1,DR2_SLOW_RET,1,%r29 MFDIAG_2 (24) or %r24,%r29,%r29 MTDIAG_2 (29) ; set DR2_SLOW_RET nop nop nop nop ; ; Start of next 32-byte cacheline ; nop nop nop extrd,u arg1,63,6,%r1 mtsar %r1 shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number blr %r1,%r0 ; branch to 8-instruction sequence nop ; ; Start of next 32-byte cacheline ; SFDIAG (0) ; RDR 0 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (0) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (1) ; RDR 1 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (1) ssm 0,0 b,n perf_rdr_shift_in_U_leave sync ; RDR 2 read sequence ssm 0,0 SFDIAG (4) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 3 read sequence ssm 0,0 SFDIAG (3) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 4 read sequence ssm 0,0 SFDIAG (4) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 5 read sequence ssm 0,0 SFDIAG (5) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 6 read sequence ssm 0,0 SFDIAG (6) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 7 read sequence ssm 0,0 SFDIAG (7) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop b,n perf_rdr_shift_in_U_leave nop nop nop nop nop nop nop SFDIAG (9) ; RDR 9 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (9) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (10) ; RDR 10 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (10) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (11) ; RDR 11 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (11) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (12) ; RDR 12 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (12) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (13) ; RDR 13 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (13) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (14) ; RDR 14 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (14) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (15) ; RDR 15 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (15) ssm 0,0 b,n perf_rdr_shift_in_U_leave sync ; RDR 16 read sequence ssm 0,0 SFDIAG (16) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop SFDIAG (17) ; RDR 17 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (17) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (18) ; RDR 18 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (18) ssm 0,0 b,n perf_rdr_shift_in_U_leave b,n perf_rdr_shift_in_U_leave nop nop nop nop nop nop nop sync ; RDR 20 read sequence ssm 0,0 SFDIAG (20) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 21 read sequence ssm 0,0 SFDIAG (21) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 22 read sequence ssm 0,0 SFDIAG (22) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 23 read sequence ssm 0,0 SFDIAG (23) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 24 read sequence ssm 0,0 SFDIAG (24) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop sync ; RDR 25 read sequence ssm 0,0 SFDIAG (25) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop SFDIAG (26) ; RDR 26 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (26) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (27) ; RDR 27 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (27) ssm 0,0 b,n perf_rdr_shift_in_U_leave sync ; RDR 28 read sequence ssm 0,0 SFDIAG (28) ssm 0,0 MFDIAG_1 (28) b,n perf_rdr_shift_in_U_leave ssm 0,0 nop b,n perf_rdr_shift_in_U_leave nop nop nop nop nop nop nop SFDIAG (30) ; RDR 30 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (30) ssm 0,0 b,n perf_rdr_shift_in_U_leave SFDIAG (31) ; RDR 31 read sequence ssm 0,0 MFDIAG_1 (28) shrpd ret0,%r0,%sar,%r1 MTDIAG_1 (1) STDIAG (31) ssm 0,0 b,n perf_rdr_shift_in_U_leave nop perf_rdr_shift_in_U_leave: bve (%r2) .exit MTDIAG_2 (24) ; restore DR2 .procend ENDPROC(perf_rdr_shift_in_U) ;*********************************************************************** ;* ;* Name: rdr_shift_out_U ;* ;* Description: ;* This routine moves data to the RDR's. The double-word that ;* arg1 points to is loaded and moved into the staging register. ;* Then the STDIAG instruction for the RDR # in arg0 is called ;* to move the data to the RDR. ;* ;* Arguments: ;* arg0 = rdr target ;* arg1 = buffer pointer ;* ;* Returns: ;* None ;* ;* Register usage: ;* arg0 = rdr target ;* arg1 = buffer pointer ;* %r24 - DR2 | DR2_SLOW_RET ;* %r23 - original DR2 value ;* ;*********************************************************************** ENTRY(perf_rdr_shift_out_U) .proc .callinfo frame=0,NO_CALLS .entry ; ; NOTE: The PCX-U ERS states that DR2_SLOW_RET must be set before any ; shifting is done, from or to, the remote diagnose registers. ; depdi,z 1,DR2_SLOW_RET,1,%r24 MFDIAG_2 (23) or %r24,%r23,%r24 MTDIAG_2 (24) ; set DR2_SLOW_RET MTDIAG_1 (25) ; data to the staging register shladd arg0,2,%r0,%r1 ; %r1 = 4 * RDR number blr %r1,%r0 ; branch to 8-instruction sequence nop ; ; 32-byte cachline aligned ; sync ; RDR 0 write sequence ssm 0,0 STDIAG (0) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 1 write sequence ssm 0,0 STDIAG (1) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 2 write sequence ssm 0,0 STDIAG (2) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 3 write sequence ssm 0,0 STDIAG (3) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 4 write sequence ssm 0,0 STDIAG (4) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 5 write sequence ssm 0,0 STDIAG (5) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 6 write sequence ssm 0,0 STDIAG (6) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 7 write sequence ssm 0,0 STDIAG (7) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 8 write sequence ssm 0,0 STDIAG (8) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 9 write sequence ssm 0,0 STDIAG (9) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 10 write sequence ssm 0,0 STDIAG (10) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 11 write sequence ssm 0,0 STDIAG (11) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 12 write sequence ssm 0,0 STDIAG (12) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 13 write sequence ssm 0,0 STDIAG (13) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 14 write sequence ssm 0,0 STDIAG (14) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 15 write sequence ssm 0,0 STDIAG (15) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 16 write sequence ssm 0,0 STDIAG (16) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 17 write sequence ssm 0,0 STDIAG (17) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 18 write sequence ssm 0,0 STDIAG (18) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 19 write sequence ssm 0,0 STDIAG (19) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 20 write sequence ssm 0,0 STDIAG (20) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 21 write sequence ssm 0,0 STDIAG (21) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 22 write sequence ssm 0,0 STDIAG (22) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 23 write sequence ssm 0,0 STDIAG (23) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 24 write sequence ssm 0,0 STDIAG (24) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 25 write sequence ssm 0,0 STDIAG (25) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 26 write sequence ssm 0,0 STDIAG (26) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 27 write sequence ssm 0,0 STDIAG (27) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 28 write sequence ssm 0,0 STDIAG (28) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 29 write sequence ssm 0,0 STDIAG (29) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 30 write sequence ssm 0,0 STDIAG (30) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop sync ; RDR 31 write sequence ssm 0,0 STDIAG (31) ssm 0,0 b,n perf_rdr_shift_out_U_leave nop ssm 0,0 nop perf_rdr_shift_out_U_leave: bve (%r2) .exit MTDIAG_2 (23) ; restore DR2 .procend ENDPROC(perf_rdr_shift_out_U)