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