1/****************************************************************************
2
3		THIS SOFTWARE IS NOT COPYRIGHTED
4
5   HP offers the following for use in the public domain.  HP makes no
6   warranty with regard to the software or it's performance and the
7   user accepts the software "AS IS" with all faults.
8
9   HP DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD
10   TO THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES
11   OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
12
13****************************************************************************/
14	.space	$TEXT$
15	.subspa	$CODE$,access=0x2c
16
17#if 1
18#include	"diagnose.h"
19#endif
20
21i13BREAK	.equ    0xa5a			; im13 field for specified functions
22i5REG		.equ	0x06			; Init registers
23i5BP		.equ	0x09			; GDB breakpoin
24i5PSW		.equ	0x0b			; Get PSW
25i5INLINE	.equ	0x0e			; Get INLINE
26R_gr0		.equ	 0
27R_gr1		.equ	 4
28R_gr2		.equ	 8
29R_gr3		.equ	12
30R_gr4		.equ	16
31R_gr5		.equ	20
32R_gr6		.equ	24
33R_gr7		.equ	28
34R_gr8		.equ	32
35R_gr9		.equ	36
36R_gr10		.equ	40
37R_gr11		.equ	44
38R_gr12		.equ	48
39R_gr13		.equ	52
40R_gr14		.equ	56
41R_gr15		.equ	60
42R_gr16		.equ	64
43R_gr17		.equ	68
44R_gr18		.equ	72
45R_gr19		.equ	76
46R_gr20		.equ	80
47R_gr21		.equ	84
48R_gr22		.equ	88
49R_gr23		.equ	92
50R_gr24		.equ	96
51R_gr25		.equ	100
52R_gr26		.equ	104
53R_gr27		.equ	108
54R_gr28		.equ	112
55R_gr29		.equ	116
56R_gr30		.equ	120
57R_gr31		.equ	124
58
59R_sr0		.equ	128
60R_sr1		.equ	132
61R_sr2		.equ	136
62R_sr3		.equ	140
63R_sr4		.equ	144
64R_sr5		.equ	148
65R_sr6		.equ	152
66R_sr7		.equ	156
67
68R_cr0		.equ	160
69R_cr1		.equ	164
70R_cr2		.equ	168
71R_cr3		.equ	172
72R_cr4		.equ	176
73R_cr5		.equ	180
74R_cr6		.equ	184
75R_cr7		.equ	188
76R_cr8		.equ	192
77R_cr9		.equ	196
78R_cr10		.equ	200
79R_cr11		.equ	204
80R_cr12		.equ	208
81R_cr13		.equ	212
82R_cr14		.equ	216
83R_cr15		.equ	220
84R_cr16		.equ	224
85R_cr17H		.equ	228
86R_cr18H		.equ	232
87R_cr19		.equ	236
88R_cr20		.equ	240
89R_cr21		.equ	244
90R_cr22		.equ	248
91R_cr23		.equ	252
92R_cr24		.equ	256
93R_cr25		.equ	260
94R_cr26		.equ	264
95R_cr27		.equ	268
96R_cr28		.equ	272
97R_cr29		.equ	276
98R_cr30		.equ	280
99R_cr31		.equ	284
100
101R_cr17T		.equ	288
102R_cr18T		.equ	292
103
104R_cpu0		.equ	296
105
106R_SIZE          .equ	300
107
108min_stack	.equ     64
109
110	.import	handle_exception
111	.import $global$, data
112	.IMPORT putnum, code
113	.IMPORT led_putnum, code
114	.IMPORT delay, code
115
116        .export FICE
117	.export	DEBUG_GO
118	.export	DEBUG_SS
119	.export	STUB_RESTORE
120
121	.export	save_regs
122	.export	RegBlk
123	.export Exception_index
124
125;-------------------------------------------------------------------------------
126        .EXPORT breakpoint,ENTRY,ARGW0=GR,RTNVAL=GR
127breakpoint
128	.PROC
129	.CALLINFO CALLER,FRAME=128,SAVE_RP
130	.ENTRY
131
132	stw     %r2,-20(0,%r30)			; stash the return pointer
133	ldo	128(%r30),%r30			; push up the stack pointer
134
135;;; debug
136	ldi	6, %r26
137	bl,n	led_putnum,%r2
138	nop
139        ldil 	L'900000,%r26
140        ldo 	R'900000(%r26),%r26
141	bl,n	delay,%r2
142	nop
143;;;
144	break   i5INLINE,i13BREAK
145;;; more debug
146	ldi	7, %r26
147	bl,n	led_putnum,%r2
148	nop
149        ldil 	L'900000,%r26
150        ldo 	R'900000(%r26),%r26
151	bl,n	delay,%r2
152	nop
153;;;
154
155FICE	fice	0(0,%r26)			; Flush the i cache entry
156	sync
157
158	ldw 	-148(0,%r30),%r2		; retrieve the return pointer
159	ldo 	-128(%r30),%r30			; reset the stack pointer
160	bv,n    0(%r2)				; return to caller
161	nop
162
163	.EXIT
164	.PROCEND
165
166;-------------------------------------------------------------------------------
167DEBUG_GO
168	or,tr	%r0,%r0,%r10	; if go, do not set R-bit to 1
169
170DEBUG_SS
171	ldi	1,%r10		; else set R-bit to 1
172
173DEBUG_EXEC
174
175	bl	DGO_0,%r8			; r8 points to register block
176	addil	L%RegBlk-DGO_0,%r8
177DGO_0
178	ldo	R%RegBlk-DGO_0(%r1),%r8
179
180; load space registers
181
182	ldw	R_sr0(%r8),%r1
183	mtsp	%r1,%sr0
184	ldw	R_sr1(%r8),%r1
185	mtsp	%r1,%sr1
186	ldw	R_sr2(%r8),%r1
187	mtsp	%r1,%sr2
188	ldw	R_sr3(%r8),%r1
189	mtsp	%r1,%sr3
190	ldw	R_sr4(%r8),%r1
191	mtsp	%r1,%sr4
192	ldw	R_sr5(%r8),%r1
193	mtsp	%r1,%sr5
194	ldw	R_sr6(%r8),%r1
195	mtsp	%r1,%sr6
196	ldw	R_sr7(%r8),%r1
197	mtsp	%r1,%sr7
198
199; clear Q-bit for rfi
200
201	rsm	0x08,%r0
202
203; load control registers
204
205	ldw	R_cr0(%r8),%r1
206	or,=	%r10,%r0,%r0		; if single step
207	copy	%r0,%r1			;   set %cr0 to 0
208	mtctl	%r1,%cr0
209	ldw	R_cr8(%r8),%r1
210	mtctl	%r1,%cr8
211	ldw	R_cr9(%r8),%r1
212	mtctl	%r1,%cr9
213	ldw	R_cr10(%r8),%r1
214	mtctl	%r1,%cr10
215	ldw	R_cr11(%r8),%r1
216	mtctl	%r1,%cr11
217	ldw	R_cr12(%r8),%r1
218	mtctl	%r1,%cr12
219	ldw	R_cr13(%r8),%r1
220	mtctl	%r1,%cr13
221	ldw	R_cr14(%r8),%r1
222	mtctl	%r1,%cr14
223	ldw	R_cr15(%r8),%r1
224	mtctl	%r1,%cr15
225	ldw	R_cr16(%r8),%r1
226	mtctl	%r1,%cr16
227	ldw	R_cr17H(%r8),%r1	; load iiasq.head
228	mtctl	%r1,%cr17
229	ldw	R_cr18H(%r8),%r1	; load iiaoq.head
230	mtctl	%r1,%cr18
231	ldw	R_cr17T(%r8),%r1	; load iiasq.tail
232	mtctl	%r1,%cr17
233	ldw	R_cr18T(%r8),%r1	; load iiaoq.tail
234	mtctl	%r1,%cr18
235	ldw	R_cr19(%r8),%r1
236	mtctl	%r1,%cr19
237	ldw	R_cr20(%r8),%r1
238	mtctl	%r1,%cr20
239	ldw	R_cr21(%r8),%r1
240	mtctl	%r1,%cr21
241	ldw	R_cr22(%r8),%r1
242	dep	%r10,27,1,%r1		; set R-bit if applicable
243	mtctl	%r1,%cr22
244	ldw	R_cr23(%r8),%r1
245	mtctl	%r1,%cr23
246	ldw	R_cr24(%r8),%r1
247	mtctl	%r1,%cr24
248	ldw	R_cr25(%r8),%r1
249	mtctl	%r1,%cr25
250	ldw	R_cr26(%r8),%r1
251	mtctl	%r1,%cr26
252	ldw	R_cr27(%r8),%r1
253	mtctl	%r1,%cr27
254	ldw	R_cr28(%r8),%r1
255	mtctl	%r1,%cr28
256	ldw	R_cr29(%r8),%r1
257	mtctl	%r1,%cr29
258	ldw	R_cr30(%r8),%r1
259	mtctl	%r1,%cr30
260	ldw	R_cr31(%r8),%r1
261	mtctl	%r1,%cr31
262
263; load diagnose registers
264
265	ldw	R_cpu0(%r8),%r1
266	ldil	L%CPU0_MASK,%r2
267	ldo	R%CPU0_MASK(%r2),%r2
268	xor	%r1,%r2,%r1		; xor the read/clear bits
269	nop
270	mtcpu	%r1,0
271	mtcpu	%r1,0
272
273; load general registers
274
275	ldw	R_gr1(%r8),%r1
276	ldw	R_gr2(%r8),%r2
277	ldw	R_gr3(%r8),%r3
278	ldw	R_gr4(%r8),%r4
279	ldw	R_gr5(%r8),%r5
280	ldw	R_gr6(%r8),%r6
281	ldw	R_gr7(%r8),%r7
282	ldw	R_gr9(%r8),%r9
283	ldw	R_gr10(%r8),%r10
284	ldw	R_gr11(%r8),%r11
285	ldw	R_gr12(%r8),%r12
286	ldw	R_gr13(%r8),%r13
287	ldw	R_gr14(%r8),%r14
288	ldw	R_gr15(%r8),%r15
289	ldw	R_gr16(%r8),%r16
290	ldw	R_gr17(%r8),%r17
291	ldw	R_gr18(%r8),%r18
292	ldw	R_gr19(%r8),%r19
293	ldw	R_gr20(%r8),%r20
294	ldw	R_gr21(%r8),%r21
295	ldw	R_gr22(%r8),%r22
296	ldw	R_gr23(%r8),%r23
297	ldw	R_gr24(%r8),%r24
298	ldw	R_gr25(%r8),%r25
299	ldw	R_gr26(%r8),%r26
300	ldw	R_gr27(%r8),%r27
301	ldw	R_gr28(%r8),%r28
302	ldw	R_gr29(%r8),%r29
303	ldw	R_gr30(%r8),%r30
304	ldw	R_gr31(%r8),%r31
305	ldw	R_gr8(%r8),%r8
306
307; execute user program
308
309	nop
310	rfi		; switch to user code
311	nop
312
313;-------------------------------------------------------------------------------
314
315STUB_RESTORE
316	copy	%r1,%r9	; save exception index
317	bl	SR_00,%r8
318	addil	L%Exception_index-SR_00,%r8
319SR_00
320	ldo	R%Exception_index-SR_00(%r1),%r8
321	stw	%r9,(%r8)
322
323	bl	save_regs,%r25
324	nop
325
326#ifdef	DEBUG_DEBUGGER1
327	stwm	%r1,8(%sp)
328	bl	putc,%rp
329	ldi	CR,%arg0
330	bl	putc,%rp
331	ldi	LF,%arg0
332	bl	printit,%mrp
333	mfctl	%pcoq,%arg0
334
335	mfctl	%pcoq,%r1
336	mtctl	%r1,%pcoq
337	mfctl	%pcoq,%arg0
338	bl	printit,%mrp
339	mtctl	%arg0,%pcoq
340
341	bl	printit,%mrp
342	ldw	-8(%sp),%arg0
343
344	ldwm	-8(%sp),%r1
345#endif
346
347#ifdef	DEBUG_DEBUGGER2
348	stwm	%r1,8(%sp)
349	bl	putc,%rp
350	ldi	LF,%arg0
351	ldwm	-8(%sp),%r1
352#endif
353
354#ifdef	DEBUG_DEBUGGER3
355	bl	printit,%mrp
356	copy	iptr,%arg0
357	bl	printit,%mrp
358	copy	rstack,%arg0
359	bl	printit,%mrp
360	copy	gspace,%arg0
361	bl	printit,%mrp
362	copy	dstack,%arg0
363	bl	printit,%mrp
364	copy	nextptr,%arg0
365	bl	printit,%mrp
366	copy	%dp,%arg0
367	bl	printit,%mrp
368	copy	%sp,%arg0
369	bl	printit,%mrp
370	mfctl	%rctr,%arg0
371	bl	printit,%mrp
372	mfctl	%iva,%arg0
373	bl	printit,%mrp
374	mfctl	%eiem,%arg0
375	bl	printit,%mrp
376	mfctl	%ipsw,%arg0
377	bl	printit,%mrp
378	copy	%r0,%arg0
379#endif
380	bl	SR_1,%sp
381	addil	L%Stub_stack-SR_1,%sp
382SR_1
383	ldo	R%Stub_stack-SR_1(%r1),%sp	; set the stack pointer
384
385	bl	SR_2,%arg0
386	addil	L%RegBlk-SR_2,%arg0
387SR_2
388	ldo	R%RegBlk-SR_2(%r1),%arg0	; set arg0 (save register area)
389
390	bl	SR_3,%arg1
391	addil	L%Exception_index-SR_3,%arg1	; set arg1 address
392SR_3
393	ldo	R%Exception_index-SR_3(%r1),%arg1	; set arg1 address
394
395	addi	min_stack,%sp,%sp		; allocate min stack frame
396
397	bl	handle_exception,%r2
398	ldw	0(%arg1),%arg1			; load arg1
399        addi	-min_stack,%sp,%sp		; de allocate min stack frame
400
401	b	DEBUG_EXEC			;
402	copy	%r28,%r10
403;-------------------------------------------------------------------------------
404
405save_regs	; return address is in %r25
406
407	bl	SR_0,%r1			; r1 points to Register block
408	addil   L%RegBlk-SR_0,%r1
409SR_0
410	ldo     R%RegBlk-SR_0(%r1),%r1
411
412; save general registers
413
414	stw	%r0,R_gr0(%r1)
415	; don't store %r1 yet
416	stw	%r2,R_gr2(%r1)
417	stw	%r3,R_gr3(%r1)
418	stw	%r4,R_gr4(%r1)
419	stw	%r5,R_gr5(%r1)
420	stw	%r6,R_gr6(%r1)
421	stw	%r7,R_gr7(%r1)
422	; don't store %r8 yet
423	; don't store %r9 yet
424	stw	%r10,R_gr10(%r1)
425	stw	%r11,R_gr11(%r1)
426	stw	%r12,R_gr12(%r1)
427	stw	%r13,R_gr13(%r1)
428	stw	%r14,R_gr14(%r1)
429	stw	%r15,R_gr15(%r1)
430	; don't store %r16 yet
431	; don't store %r17 yet
432	stw	%r18,R_gr18(%r1)
433	stw	%r19,R_gr19(%r1)
434	stw	%r20,R_gr20(%r1)
435	stw	%r21,R_gr21(%r1)
436	stw	%r22,R_gr22(%r1)
437	stw	%r23,R_gr23(%r1)
438	; don't store %r24 yet
439	; don't store %r25 yet
440	stw	%r26,R_gr26(%r1)
441	stw	%r27,R_gr27(%r1)
442	stw	%r28,R_gr28(%r1)
443	stw	%r29,R_gr29(%r1)
444	stw	%r30,R_gr30(%r1)
445	stw	%r31,R_gr31(%r1)
446
447; restore general registers from shadow registers and save them
448
449	copy	%r1,%r10	; hold Register block pointer
450	copy	%r25,%rp	; hold return pointer
451	shdw_gr
452	shdw_gr
453	stw	%r1,R_gr1(%r10)
454	stw	%r8,R_gr8(%r10)
455	stw	%r9,R_gr9(%r10)
456	stw	%r16,R_gr16(%r10)
457	stw	%r17,R_gr17(%r10)
458	stw	%r24,R_gr24(%r10)
459	stw	%r25,R_gr25(%r10)
460
461; save control registers
462
463	mfctl	%cr0,%r1
464	stw	%r1,R_cr0(%r10)
465	stw	%r0,R_cr1(%r10)
466	stw	%r0,R_cr2(%r10)
467	stw	%r0,R_cr3(%r10)
468	stw	%r0,R_cr4(%r10)
469	stw	%r0,R_cr5(%r10)
470	stw	%r0,R_cr6(%r10)
471	stw	%r0,R_cr7(%r10)
472	mfctl	%cr8,%r1
473	stw	%r1,R_cr8(%r10)
474	mfctl	%cr9,%r1
475	stw	%r1,R_cr9(%r10)
476	mfctl	%cr10,%r1
477	stw	%r1,R_cr10(%r10)
478	mfctl	%cr11,%r1
479	stw	%r1,R_cr11(%r10)
480	mfctl	%cr12,%r1
481	stw	%r1,R_cr12(%r10)
482	mfctl	%cr13,%r1
483	stw	%r1,R_cr13(%r10)
484	mfctl	%cr14,%r1
485	stw	%r1,R_cr14(%r10)
486	mfctl	%cr15,%r1
487	stw	%r1,R_cr15(%r10)
488	mfctl	%cr16,%r1
489	stw	%r1,R_cr16(%r10)
490	mfctl	%cr17,%r1
491	stw	%r1,R_cr17H(%r10)
492	mtctl	%r1,%cr17
493	mfctl	%cr17,%r1
494	stw	%r1,R_cr17T(%r10)
495	mtctl	%r1,%cr17
496	mfctl	%cr18,%r1
497	stw	%r1,R_cr18H(%r10)
498	mtctl	%r1,%cr18
499	mfctl	%cr18,%r1
500	stw	%r1,R_cr18T(%r10)
501	mtctl	%r1,%cr18
502	mfctl	%cr19,%r1
503	stw	%r1,R_cr19(%r10)
504	mfctl	%cr20,%r1
505	stw	%r1,R_cr20(%r10)
506	mfctl	%cr21,%r1
507	stw	%r1,R_cr21(%r10)
508	mfctl	%cr22,%r1
509	stw	%r1,R_cr22(%r10)
510	mfctl	%cr23,%r1
511	stw	%r1,R_cr23(%r10)
512	mfctl	%cr24,%r1
513	stw	%r1,R_cr24(%r10)
514	mfctl	%cr25,%r1
515	stw	%r1,R_cr25(%r10)
516	mfctl	%cr26,%r1
517	stw	%r1,R_cr26(%r10)
518	mfctl	%cr27,%r1
519	stw	%r1,R_cr27(%r10)
520	mfctl	%cr28,%r1
521	stw	%r1,R_cr28(%r10)
522	mfctl	%cr29,%r1
523	stw	%r1,R_cr29(%r10)
524	mfctl	%cr30,%r1
525	stw	%r1,R_cr30(%r10)
526	mfctl	%cr31,%r1
527	stw	%r1,R_cr31(%r10)
528
529; save diagnose registers
530
531	mfcpu_c	0,%r1
532	mfcpu_c	0,%r1
533	stw	%r1,R_cpu0(%r10)
534
535; save space registers
536
537	mfsp	%sr0,%r1
538	stw	%r1,R_sr0(%r10)
539	mfsp	%sr1,%r1
540	stw	%r1,R_sr1(%r10)
541	mfsp	%sr2,%r1
542	stw	%r1,R_sr2(%r10)
543	mfsp	%sr3,%r1
544	stw	%r1,R_sr3(%r10)
545	mfsp	%sr4,%r1
546	stw	%r1,R_sr4(%r10)
547	mfsp	%sr5,%r1
548	stw	%r1,R_sr5(%r10)
549	mfsp	%sr6,%r1
550	stw	%r1,R_sr6(%r10)
551	mfsp	%sr7,%r1
552	bv	(%rp)
553	stw	%r1,R_sr7(%r10)
554
555#ifdef	DEBUG_DEBUGGER
556;-------------------------------------------------------------------------------
557printit
558	mtctl	%rp,%tr0
559	mtctl	%r1,%tr1
560	bl	putnum,%rp
561	copy	%rp,%arg0
562
563	mtctl	%mrp,%tr2
564	bl	putc,%rp
565	ldi	CR,%arg0
566	bl	putc,%rp
567	ldi	LF,%arg0
568	mfctl	%tr2,%mrp
569	mfctl	%tr1,%r1
570	bv	(%mrp)
571	mfctl	%tr0,%rp
572#endif
573	.space	$PRIVATE$
574	.subspa	$DATA$,align=4,access=0x1f
575
576Exception_index
577	.word	0
578
579RegBlk
580	.block	R_SIZE		; register block
581
582Stub_stack
583	.block	1024
584
585	.end
586