summaryrefslogtreecommitdiffstats
path: root/c/src/exec/score/cpu/a29k/pswmacro.ah
blob: 12f6dc6abd610b5fd01ba2255d348d12009181e5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
; /* @(#)pswmacro.ah	1.1 96/05/23 08:56:58, TEI */
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		 macros: Do_install and init_TLB
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; /* $Id$ */

;* File information and includes.

	.file	"macro.ah"
	.ident	"@(#)pswmacro.ah	1.1 96/05/23 08:56:58, TEI"


	.macro	CONST32, RegName, RegValue
		const	RegName, RegValue
		consth	RegName, RegValue
	.endm

	.macro	CONSTX, RegName, RegValue
		.if (RegValue) <= 0x0000ffff
			const	RegName, RegValue
		.else
			const	RegName, RegValue
			consth	RegName, RegValue
		.endif
	.endm

	.macro	PRODEV, RegName
		srl	RegName, RegName, 24
	.endm

;
;* MACRO TO INSTALL VECTOR TABLE ENTRIES
;
 
;* Assumes vector table address in v0
 
        .macro  _setvec, trapnum, trapaddr
                mfsr    v0, vab                 ;
                const   v2, trapnum             ;
                sll     v1, v2, 2               ;
                add     v1, v1, v0              ; v0 has location of vector tab
 
                const   v2, trapaddr            ;
                consth  v2, trapaddr            ;
                store   0, 0, v2, v1            ;
                nop                             ;
        .endm
 
        .macro  syscall, name
                const     tav, HIF_@name        ;
                asneq   V_SYSCALL, gr1, gr1     ;
                nop                             ;
                nop                             ;
        .endm



;* MACRO TO INSTALL VECTOR TABLE ENTRIES 

	.macro	Do_Install, V_Number, V_Address
		const	lr4, V_Address 
		consth	lr4, V_Address
		const	lr3, V_Number * 4
		consth	lr3, V_Number * 4
		call	lr0, V_Install
		nop
	.endm

	.macro	Do_InstallX, V_Number, V_Address
		const	lr4, V_Address 
		consth	lr4, V_Address
		const	lr3, V_Number * 4
		consth	lr3, V_Number * 4
		call	lr0, V_InstallX
		nop
	.endm



; push a register onto the stack
	.macro	pushreg, reg, sp
	sub	sp, sp, 4		; adjust stack pointer
	store	0, 0, reg, sp		; push register
	.endm

	.macro	push, sp, reg
		sub	sp, sp, 4
		store	0, 0, reg, sp
	.endm

; pop the register from stack
	.macro	popreg, reg, sp
	load	0, 0, reg, sp		; pop register
	add	sp, sp, 4		; adjust stack pointer
	.endm
	.macro	pop, reg, sp
		load	0, 0, reg, sp
		add	sp, sp, 4
	.endm

; push a special register onto stack
	.macro	pushspcl, spcl, tmpreg, sp
	sub	sp, sp, 4		; adjust stack pointer
	mfsr	tmpreg, spcl		; get spcl reg
	store	0, 0, tmpreg, sp	; push onto stack
	.endm

	.macro	pushsr, sp, reg, sreg
		mfsr	reg, sreg
		sub	sp, sp, 4
		store	0, 0, reg, sp
	.endm

; pop a special register from stack
	.macro	popspcl, spcl, tmpreg, sp
	load	0, 0, tmpreg, sp	; pop from stack
	add	sp, sp, 4		; adjust stack pointer
	mtsr	spcl, tmpreg		; set spcl reg
	.endm

	.macro	popsr, sreg, reg, sp
		load	0, 0, reg, sp
		add	sp, sp, 4
		mtsr	sreg, reg
	.endm

;
; save freeze mode registers on memory stack.
;

	.macro	SaveFZState,	tmp1, tmp2

		; save freeze mode registers.

		pushspcl pc0, tmp1, msp
		pushspcl pc1, tmp1, msp
		pushspcl alu, tmp1, msp

		pushspcl cha, tmp1, msp
		pushspcl chd, tmp1, msp
		pushspcl chc, tmp1, msp

		pushspcl ops, tmp1, msp

		; turn freeze off

		const	tmp2, FZ
		mfsr	tmp1, cps
		andn	tmp1, tmp1, tmp2
		mtsr	cps, tmp1
	.endm

; restore freeze mode registers from memory stack.

	.macro	RestoreFZState, tmp1, tmp2

		; turn freeze on

		const	tmp2, (FZ|DI|DA)
		mfsr	tmp1, cps
		or	tmp1, tmp1, tmp2
		mtsr	cps, tmp1

		; restore freeze mode registers.

		popspcl	ops, tmp1, msp
		popspcl	chc, tmp1, msp
		popspcl	chd, tmp1, msp
		popspcl	cha, tmp1, msp
		popspcl	alu, tmp1, msp
		popspcl	pc1, tmp1, msp
		popspcl	pc0, tmp1, msp
	.endm

;
;*
;
	.equ	WS,	512				; window size
	.equ	RALLOC,	4 * 4				; stack alloc for C
	.equ	SIGCTX_UM_SIZE,	40 * 4			; 
	.equ	SIGCTX_RFB, (38) * 4			; user mode saved
	.equ	SIGCTX_SM_SIZE, 12 * 4			;
	.equ	SIGCTX_SIG, (11)*4 + SIGCTX_UM_SIZE	;
	.equ	SIGCTX_GR1, (10)*4 + SIGCTX_UM_SIZE	;
	.equ	SIGCTX_RAB, (9)*4 + SIGCTX_UM_SIZE	;
	.equ	SIGCTX_PC0, (8)*4 + SIGCTX_UM_SIZE	;
	.equ	SIGCTX_PC1, (7)*4 + SIGCTX_UM_SIZE	;
	.equ	SIGCTX_PC2, (6)*4 + SIGCTX_UM_SIZE	;
	.equ	SIGCTX_CHC, (3)*4 + SIGCTX_UM_SIZE	;
	.equ	SIGCTX_OPS, (1)*4 + SIGCTX_UM_SIZE	;
	.equ	SIGCTX_TAV, (0)*4 + SIGCTX_UM_SIZE	;

	.macro	sup_sv
		add	it2, trapreg, 0			; transfer signal #
		sub	msp, msp, 4			;
		store	0, 0, it2, msp			; save signal number
		sub	msp, msp, 4			; push gr1

		store	0, 0, gr1, msp			; 
		sub	msp, msp, 4			; push rab
		store	0, 0, rab, msp			; 
		const	it0, WS				; Window size	

		sub	rab, rfb, it0			; set rab = rfb-512
		pushsr	msp, it0, PC0			; save program counter0
		pushsr	msp, it0, PC1			; save program counter1
		pushsr	msp, it0, PC2			; save program counter2

		pushsr	msp, it0, CHA			; save channel address
		pushsr	msp, it0, CHD			; save channel data
		pushsr	msp, it0, CHC			; save channel control
		pushsr	msp, it0, ALU			; save alu

		pushsr	msp, it0, OPS			; save ops
		sub	msp, msp, 4			; 
		store	0, 0, tav, msp			; push tav
		mtsrim	chc, 0				; no loadm/storem

		mfsr	it0, ops			; get ops value
		const	it1, (TD | DI)			; disable interrupts
		consth	it1, (TD | DI)			; disable interrupts
		or	it0, it0, it1			; set bits

		mtsr	ops, it0			; set new ops
		const	it0, _sigcode			; signal handler
		consth	it0, _sigcode			; signal handler
		mtsr	pc1, it0			; store pc1

		add	it1, it0, 4			; next addr
		mtsr	pc0, it1			; store pc1 location
		iret					; return
		nop					; ALIGN
	.endm

	.macro	sig_return
		mfsr	it0, cps			; get processor status
		const	it1, FZ|DA			; Freeze + traps disable
		or	it0, it0, it1			; to set FZ+DA
		mtsr	cps, it0			; in freeze mode

		load	0, 0, tav, msp			; restore tav
		add	msp, msp, 4			;
		
		popsr	OPS,it0, msp			;
		popsr	ALU,it0, msp			;
		popsr	CHC,it0, msp			;
		popsr	CHD,it0, msp			;

		popsr	CHA,it0, msp			;
		popsr	PC2,it0, msp			;
		popsr	PC1,it0, msp			;
		popsr	PC0,it0, msp			;

		load	0, 0, rab, msp			;
		add	msp, msp, 4			;
		load	0, 0, it0, msp			;
		add	gr1, it0, 0			; pop rsp

		add	msp, msp, 8			; discount signal #
		iret
	.endm

	.macro	repair_R_stack
		add	v0, msp, SIGCTX_GR1		; interrupted gr1
		load 	0, 0, v2, v0			;
		add	v0, msp, SIGCTX_RFB		;
		load	0, 0, v3, v0			; interupted rfb

		const	v1, WS				;	
		sub	v1, v3, v1			; rfb-512
		cpltu	v0, v2, v1			; test gr1 < rfb-512
		jmpf	v0, $1				; 

		add	gr1, rab, 0			;
		add	v2, v1, 0			; set LB = rfb-512
$1:
;* if gr1 < rfb-512 yes LB = rfb-512 signalled during spill
;* if no, LB=gr1 interrupted cache < 126 registers
		cpleu	v0, v2, rfb			; test LB<=rfb
		jmpf	v0, $2				;
		nop					;
		add	v2, rfb, 0			;
$2:
		cpeq	v0, v3, rfb			; fill rfb->rfb
		jmpt	v0, $3				; if rfb==rfb
		const	tav, (0x80<<2)			; prepare for fill
		or	tav, tav, v2			; 

		mtsr	IPA, tav			; IPA=LA<<2
		sub	tav, v3, gr98			; cache fill LA->rfb
		srl	tav, tav, 2			; convert to words
		sub	tav, tav, 1			; 

		mtsr	cr, tav				;
		loadm	0, 0, gr0, v2			; fill from LA->rfb
$3:
		add	rfb, v3, 0			; move rfb upto rfb
		sub	rab, v1, 0			; assign rab to rfb-512

		add	v0, msp, SIGCTX_GR1		;
		load	0, 0, v2, v0			; v0 = interrupted gr1
		add	gr1, v2, 0			; move gr1 upto gr1
		nop					;
	.endm	
		
	.macro	repair_regs
		mtsrim	cr, 29 - 1			; to restore locals
		loadm	0, 0, v0, msp			;
		add	msp, msp, 29*4			; 
		popsr	Q, tav, msp			; 

		popsr	IPC, tav, msp			; 
		popsr	IPB, tav, msp			; 
		popsr	IPA, tav, msp			; 
		pop	FPStat3, msp			; floating point regs

		pop	FPStat2, msp			; floating point regs
		pop	FPStat1, msp			; floating point regs
		pop	FPStat0, msp			; floating point regs

		add	msp, msp, 3*4			; R-stack repaired
	.endm

;
;*HIF related...
;




; send the message in bufaddr to Montip.
	.macro	SendMessageToMontip,	bufaddr
	const	lr2, bufaddr
$1:
	call	lr0, _msg_send
	consth	lr2, bufaddr
	cpeq	gr96, gr96, 0
	jmpf	gr96, $1
	const	lr2, bufaddr
	.endm

; build a HIF_CALL message in bufaddr to send to montip.
	.macro	BuildHIFCALLMsg,	bufaddr, tmp1, tmp2
	const	tmp1, bufaddr
	consth	tmp1, bufaddr
	const	tmp2, HIF_CALL_MSGCODE
	store	0, 0, tmp2, tmp1	; msg code
	add	tmp1, tmp1, 4
	const	tmp2, HIF_CALL_MSGLEN	
	store	0, 0, tmp2, tmp1	; msg len
	add	tmp1, tmp1, 4
	store	0, 0, gr121, tmp1	; service number
	add	tmp1, tmp1, 4
	store	0, 0, lr2, tmp1		; lr2
	add	tmp1, tmp1, 4
	store	0, 0, lr3, tmp1		; lr3
	add	tmp1, tmp1, 4
	store	0, 0, lr4, tmp1		; lr4
	.endm

;
;* 
;* All the funky AMD style macros go in here...simply for 
;* compatility
;
;
  .macro        IMPORT, symbol
        .extern symbol
  .endm

  .macro        GLOBAL, symbol
        .global symbol
  .endm

  .macro        USESECT, name, type
        .sect   name, type
        .use    name
  .endm

  .macro        SECTION, name, type
        .sect   name, type
  .endm

 .macro FUNC, fname, lineno
        .global fname
fname:
 .endm

 .macro ENDFUNC, fname, lineno
 .endm

;*************************************LONG
 .macro LONG, varname
varname:
        .block  4
 .endm

;*************************************UNSIGNED LONG
 .macro ULONG, varname
varname:
        .block  4
 .endm

;*************************************SHORT
 .macro SHORT, varname
varname:
        .block  2
 .endm

;*************************************CHAR
 .macro CHAR, varname
varname:
        .block  1
 .endm 

;*************************************LONGARRAY
 .macro LONGARRAY, name, count
name:
        .block  count*4
 .endm

;*************************************SHORTARRAY

 .macro SHORTARRAY, name, count
name:
        .block  count*2
 .endm

;*************************************CHARARRAY

 .macro CHARARRAY, name, count
name:
        .block  count
 .endm


;*************************************VOID_FPTR

 .macro VOID_FPTR, name
name:
        .block  4
 .endm