1 | ; /* @(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI */ |
---|
2 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
---|
3 | ; macros: Do_install and init_TLB |
---|
4 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
---|
5 | ; /* $Id$ */ |
---|
6 | |
---|
7 | ;* File information and includes. |
---|
8 | |
---|
9 | .file "macro.ah" |
---|
10 | .ident "@(#)pswmacro.ah 1.1 96/05/23 08:56:58, TEI" |
---|
11 | |
---|
12 | |
---|
13 | .macro CONST32, RegName, RegValue |
---|
14 | const RegName, RegValue |
---|
15 | consth RegName, RegValue |
---|
16 | .endm |
---|
17 | |
---|
18 | .macro CONSTX, RegName, RegValue |
---|
19 | .if (RegValue) <= 0x0000ffff |
---|
20 | const RegName, RegValue |
---|
21 | .else |
---|
22 | const RegName, RegValue |
---|
23 | consth RegName, RegValue |
---|
24 | .endif |
---|
25 | .endm |
---|
26 | |
---|
27 | .macro PRODEV, RegName |
---|
28 | srl RegName, RegName, 24 |
---|
29 | .endm |
---|
30 | |
---|
31 | ; |
---|
32 | ;* MACRO TO INSTALL VECTOR TABLE ENTRIES |
---|
33 | ; |
---|
34 | |
---|
35 | ;* Assumes vector table address in v0 |
---|
36 | |
---|
37 | .macro _setvec, trapnum, trapaddr |
---|
38 | mfsr v0, vab ; |
---|
39 | const v2, trapnum ; |
---|
40 | sll v1, v2, 2 ; |
---|
41 | add v1, v1, v0 ; v0 has location of vector tab |
---|
42 | |
---|
43 | const v2, trapaddr ; |
---|
44 | consth v2, trapaddr ; |
---|
45 | store 0, 0, v2, v1 ; |
---|
46 | nop ; |
---|
47 | .endm |
---|
48 | |
---|
49 | .macro syscall, name |
---|
50 | const tav, HIF_@name ; |
---|
51 | asneq V_SYSCALL, gr1, gr1 ; |
---|
52 | nop ; |
---|
53 | nop ; |
---|
54 | .endm |
---|
55 | |
---|
56 | |
---|
57 | |
---|
58 | ;* MACRO TO INSTALL VECTOR TABLE ENTRIES |
---|
59 | |
---|
60 | .macro Do_Install, V_Number, V_Address |
---|
61 | const lr4, V_Address |
---|
62 | consth lr4, V_Address |
---|
63 | const lr3, V_Number * 4 |
---|
64 | consth lr3, V_Number * 4 |
---|
65 | call lr0, V_Install |
---|
66 | nop |
---|
67 | .endm |
---|
68 | |
---|
69 | .macro Do_InstallX, V_Number, V_Address |
---|
70 | const lr4, V_Address |
---|
71 | consth lr4, V_Address |
---|
72 | const lr3, V_Number * 4 |
---|
73 | consth lr3, V_Number * 4 |
---|
74 | call lr0, V_InstallX |
---|
75 | nop |
---|
76 | .endm |
---|
77 | |
---|
78 | |
---|
79 | |
---|
80 | ; push a register onto the stack |
---|
81 | .macro pushreg, reg, sp |
---|
82 | sub sp, sp, 4 ; adjust stack pointer |
---|
83 | store 0, 0, reg, sp ; push register |
---|
84 | .endm |
---|
85 | |
---|
86 | .macro push, sp, reg |
---|
87 | sub sp, sp, 4 |
---|
88 | store 0, 0, reg, sp |
---|
89 | .endm |
---|
90 | |
---|
91 | ; pop the register from stack |
---|
92 | .macro popreg, reg, sp |
---|
93 | load 0, 0, reg, sp ; pop register |
---|
94 | add sp, sp, 4 ; adjust stack pointer |
---|
95 | .endm |
---|
96 | .macro pop, reg, sp |
---|
97 | load 0, 0, reg, sp |
---|
98 | add sp, sp, 4 |
---|
99 | .endm |
---|
100 | |
---|
101 | ; push a special register onto stack |
---|
102 | .macro pushspcl, spcl, tmpreg, sp |
---|
103 | sub sp, sp, 4 ; adjust stack pointer |
---|
104 | mfsr tmpreg, spcl ; get spcl reg |
---|
105 | store 0, 0, tmpreg, sp ; push onto stack |
---|
106 | .endm |
---|
107 | |
---|
108 | .macro pushsr, sp, reg, sreg |
---|
109 | mfsr reg, sreg |
---|
110 | sub sp, sp, 4 |
---|
111 | store 0, 0, reg, sp |
---|
112 | .endm |
---|
113 | |
---|
114 | ; pop a special register from stack |
---|
115 | .macro popspcl, spcl, tmpreg, sp |
---|
116 | load 0, 0, tmpreg, sp ; pop from stack |
---|
117 | add sp, sp, 4 ; adjust stack pointer |
---|
118 | mtsr spcl, tmpreg ; set spcl reg |
---|
119 | .endm |
---|
120 | |
---|
121 | .macro popsr, sreg, reg, sp |
---|
122 | load 0, 0, reg, sp |
---|
123 | add sp, sp, 4 |
---|
124 | mtsr sreg, reg |
---|
125 | .endm |
---|
126 | |
---|
127 | ; |
---|
128 | ; save freeze mode registers on memory stack. |
---|
129 | ; |
---|
130 | |
---|
131 | .macro SaveFZState, tmp1, tmp2 |
---|
132 | |
---|
133 | ; save freeze mode registers. |
---|
134 | |
---|
135 | pushspcl pc0, tmp1, msp |
---|
136 | pushspcl pc1, tmp1, msp |
---|
137 | pushspcl alu, tmp1, msp |
---|
138 | |
---|
139 | pushspcl cha, tmp1, msp |
---|
140 | pushspcl chd, tmp1, msp |
---|
141 | pushspcl chc, tmp1, msp |
---|
142 | |
---|
143 | pushspcl ops, tmp1, msp |
---|
144 | |
---|
145 | ; turn freeze off |
---|
146 | |
---|
147 | const tmp2, FZ |
---|
148 | mfsr tmp1, cps |
---|
149 | andn tmp1, tmp1, tmp2 |
---|
150 | mtsr cps, tmp1 |
---|
151 | .endm |
---|
152 | |
---|
153 | ; restore freeze mode registers from memory stack. |
---|
154 | |
---|
155 | .macro RestoreFZState, tmp1, tmp2 |
---|
156 | |
---|
157 | ; turn freeze on |
---|
158 | |
---|
159 | const tmp2, (FZ|DI|DA) |
---|
160 | mfsr tmp1, cps |
---|
161 | or tmp1, tmp1, tmp2 |
---|
162 | mtsr cps, tmp1 |
---|
163 | |
---|
164 | ; restore freeze mode registers. |
---|
165 | |
---|
166 | popspcl ops, tmp1, msp |
---|
167 | popspcl chc, tmp1, msp |
---|
168 | popspcl chd, tmp1, msp |
---|
169 | popspcl cha, tmp1, msp |
---|
170 | popspcl alu, tmp1, msp |
---|
171 | popspcl pc1, tmp1, msp |
---|
172 | popspcl pc0, tmp1, msp |
---|
173 | .endm |
---|
174 | |
---|
175 | ; |
---|
176 | ;* |
---|
177 | ; |
---|
178 | .equ WS, 512 ; window size |
---|
179 | .equ RALLOC, 4 * 4 ; stack alloc for C |
---|
180 | .equ SIGCTX_UM_SIZE, 40 * 4 ; |
---|
181 | .equ SIGCTX_RFB, (38) * 4 ; user mode saved |
---|
182 | .equ SIGCTX_SM_SIZE, 12 * 4 ; |
---|
183 | .equ SIGCTX_SIG, (11)*4 + SIGCTX_UM_SIZE ; |
---|
184 | .equ SIGCTX_GR1, (10)*4 + SIGCTX_UM_SIZE ; |
---|
185 | .equ SIGCTX_RAB, (9)*4 + SIGCTX_UM_SIZE ; |
---|
186 | .equ SIGCTX_PC0, (8)*4 + SIGCTX_UM_SIZE ; |
---|
187 | .equ SIGCTX_PC1, (7)*4 + SIGCTX_UM_SIZE ; |
---|
188 | .equ SIGCTX_PC2, (6)*4 + SIGCTX_UM_SIZE ; |
---|
189 | .equ SIGCTX_CHC, (3)*4 + SIGCTX_UM_SIZE ; |
---|
190 | .equ SIGCTX_OPS, (1)*4 + SIGCTX_UM_SIZE ; |
---|
191 | .equ SIGCTX_TAV, (0)*4 + SIGCTX_UM_SIZE ; |
---|
192 | |
---|
193 | .macro sup_sv |
---|
194 | add it2, trapreg, 0 ; transfer signal # |
---|
195 | sub msp, msp, 4 ; |
---|
196 | store 0, 0, it2, msp ; save signal number |
---|
197 | sub msp, msp, 4 ; push gr1 |
---|
198 | |
---|
199 | store 0, 0, gr1, msp ; |
---|
200 | sub msp, msp, 4 ; push rab |
---|
201 | store 0, 0, rab, msp ; |
---|
202 | const it0, WS ; Window size |
---|
203 | |
---|
204 | sub rab, rfb, it0 ; set rab = rfb-512 |
---|
205 | pushsr msp, it0, PC0 ; save program counter0 |
---|
206 | pushsr msp, it0, PC1 ; save program counter1 |
---|
207 | pushsr msp, it0, PC2 ; save program counter2 |
---|
208 | |
---|
209 | pushsr msp, it0, CHA ; save channel address |
---|
210 | pushsr msp, it0, CHD ; save channel data |
---|
211 | pushsr msp, it0, CHC ; save channel control |
---|
212 | pushsr msp, it0, ALU ; save alu |
---|
213 | |
---|
214 | pushsr msp, it0, OPS ; save ops |
---|
215 | sub msp, msp, 4 ; |
---|
216 | store 0, 0, tav, msp ; push tav |
---|
217 | mtsrim chc, 0 ; no loadm/storem |
---|
218 | |
---|
219 | mfsr it0, ops ; get ops value |
---|
220 | const it1, (TD | DI) ; disable interrupts |
---|
221 | consth it1, (TD | DI) ; disable interrupts |
---|
222 | or it0, it0, it1 ; set bits |
---|
223 | |
---|
224 | mtsr ops, it0 ; set new ops |
---|
225 | const it0, sigcode ; signal handler |
---|
226 | consth it0, sigcode ; signal handler |
---|
227 | mtsr pc1, it0 ; store pc1 |
---|
228 | |
---|
229 | add it1, it0, 4 ; next addr |
---|
230 | mtsr pc0, it1 ; store pc1 location |
---|
231 | iret ; return |
---|
232 | nop ; ALIGN |
---|
233 | .endm |
---|
234 | |
---|
235 | .macro sig_return |
---|
236 | mfsr it0, cps ; get processor status |
---|
237 | const it1, FZ|DA ; Freeze + traps disable |
---|
238 | or it0, it0, it1 ; to set FZ+DA |
---|
239 | mtsr cps, it0 ; in freeze mode |
---|
240 | |
---|
241 | load 0, 0, tav, msp ; restore tav |
---|
242 | add msp, msp, 4 ; |
---|
243 | |
---|
244 | popsr OPS,it0, msp ; |
---|
245 | popsr ALU,it0, msp ; |
---|
246 | popsr CHC,it0, msp ; |
---|
247 | popsr CHD,it0, msp ; |
---|
248 | |
---|
249 | popsr CHA,it0, msp ; |
---|
250 | popsr PC2,it0, msp ; |
---|
251 | popsr PC1,it0, msp ; |
---|
252 | popsr PC0,it0, msp ; |
---|
253 | |
---|
254 | load 0, 0, rab, msp ; |
---|
255 | add msp, msp, 4 ; |
---|
256 | load 0, 0, it0, msp ; |
---|
257 | add gr1, it0, 0 ; pop rsp |
---|
258 | |
---|
259 | add msp, msp, 8 ; discount signal # |
---|
260 | iret |
---|
261 | .endm |
---|
262 | |
---|
263 | .macro repair_R_stack |
---|
264 | add v0, msp, SIGCTX_GR1 ; interrupted gr1 |
---|
265 | load 0, 0, v2, v0 ; |
---|
266 | add v0, msp, SIGCTX_RFB ; |
---|
267 | load 0, 0, v3, v0 ; interupted rfb |
---|
268 | |
---|
269 | const v1, WS ; |
---|
270 | sub v1, v3, v1 ; rfb-512 |
---|
271 | cpltu v0, v2, v1 ; test gr1 < rfb-512 |
---|
272 | jmpf v0, $1 ; |
---|
273 | |
---|
274 | add gr1, rab, 0 ; |
---|
275 | add v2, v1, 0 ; set LB = rfb-512 |
---|
276 | $1: |
---|
277 | ;* if gr1 < rfb-512 yes LB = rfb-512 signalled during spill |
---|
278 | ;* if no, LB=gr1 interrupted cache < 126 registers |
---|
279 | cpleu v0, v2, rfb ; test LB<=rfb |
---|
280 | jmpf v0, $2 ; |
---|
281 | nop ; |
---|
282 | add v2, rfb, 0 ; |
---|
283 | $2: |
---|
284 | cpeq v0, v3, rfb ; fill rfb->'rfb |
---|
285 | jmpt v0, $3 ; if rfb==rfb' |
---|
286 | const tav, (0x80<<2) ; prepare for fill |
---|
287 | or tav, tav, v2 ; |
---|
288 | |
---|
289 | mtsr IPA, tav ; IPA=LA<<2 |
---|
290 | sub tav, v3, gr98 ; cache fill LA->rfb |
---|
291 | srl tav, tav, 2 ; convert to words |
---|
292 | sub tav, tav, 1 ; |
---|
293 | |
---|
294 | mtsr cr, tav ; |
---|
295 | loadm 0, 0, gr0, v2 ; fill from LA->rfb |
---|
296 | $3: |
---|
297 | add rfb, v3, 0 ; move rfb upto 'rfb |
---|
298 | sub rab, v1, 0 ; assign rab to rfb-512 |
---|
299 | |
---|
300 | add v0, msp, SIGCTX_GR1 ; |
---|
301 | load 0, 0, v2, v0 ; v0 = interrupted gr1 |
---|
302 | add gr1, v2, 0 ; move gr1 upto 'gr1 |
---|
303 | nop ; |
---|
304 | .endm |
---|
305 | |
---|
306 | .macro repair_regs |
---|
307 | mtsrim cr, 29 - 1 ; to restore locals |
---|
308 | loadm 0, 0, v0, msp ; |
---|
309 | add msp, msp, 29*4 ; |
---|
310 | popsr Q, tav, msp ; |
---|
311 | |
---|
312 | popsr IPC, tav, msp ; |
---|
313 | popsr IPB, tav, msp ; |
---|
314 | popsr IPA, tav, msp ; |
---|
315 | pop FPStat3, msp ; floating point regs |
---|
316 | |
---|
317 | pop FPStat2, msp ; floating point regs |
---|
318 | pop FPStat1, msp ; floating point regs |
---|
319 | pop FPStat0, msp ; floating point regs |
---|
320 | |
---|
321 | add msp, msp, 3*4 ; R-stack repaired |
---|
322 | .endm |
---|
323 | |
---|
324 | ; |
---|
325 | ;*HIF related... |
---|
326 | ; |
---|
327 | |
---|
328 | |
---|
329 | |
---|
330 | |
---|
331 | ; send the message in bufaddr to Montip. |
---|
332 | .macro SendMessageToMontip, bufaddr |
---|
333 | const lr2, bufaddr |
---|
334 | $1: |
---|
335 | call lr0, _msg_send |
---|
336 | consth lr2, bufaddr |
---|
337 | cpeq gr96, gr96, 0 |
---|
338 | jmpf gr96, $1 |
---|
339 | const lr2, bufaddr |
---|
340 | .endm |
---|
341 | |
---|
342 | ; build a HIF_CALL message in bufaddr to send to montip. |
---|
343 | .macro BuildHIFCALLMsg, bufaddr, tmp1, tmp2 |
---|
344 | const tmp1, bufaddr |
---|
345 | consth tmp1, bufaddr |
---|
346 | const tmp2, HIF_CALL_MSGCODE |
---|
347 | store 0, 0, tmp2, tmp1 ; msg code |
---|
348 | add tmp1, tmp1, 4 |
---|
349 | const tmp2, HIF_CALL_MSGLEN |
---|
350 | store 0, 0, tmp2, tmp1 ; msg len |
---|
351 | add tmp1, tmp1, 4 |
---|
352 | store 0, 0, gr121, tmp1 ; service number |
---|
353 | add tmp1, tmp1, 4 |
---|
354 | store 0, 0, lr2, tmp1 ; lr2 |
---|
355 | add tmp1, tmp1, 4 |
---|
356 | store 0, 0, lr3, tmp1 ; lr3 |
---|
357 | add tmp1, tmp1, 4 |
---|
358 | store 0, 0, lr4, tmp1 ; lr4 |
---|
359 | .endm |
---|
360 | |
---|
361 | ; |
---|
362 | ;* |
---|
363 | ;* All the funky AMD style macros go in here...simply for |
---|
364 | ;* compatility |
---|
365 | ; |
---|
366 | ; |
---|
367 | .macro IMPORT, symbol |
---|
368 | .extern symbol |
---|
369 | .endm |
---|
370 | |
---|
371 | .macro GLOBAL, symbol |
---|
372 | .global symbol |
---|
373 | .endm |
---|
374 | |
---|
375 | .macro USESECT, name, type |
---|
376 | .sect name, type |
---|
377 | .use name |
---|
378 | .endm |
---|
379 | |
---|
380 | .macro SECTION, name, type |
---|
381 | .sect name, type |
---|
382 | .endm |
---|
383 | |
---|
384 | .macro FUNC, fname, lineno |
---|
385 | .global fname |
---|
386 | fname: |
---|
387 | .endm |
---|
388 | |
---|
389 | .macro ENDFUNC, fname, lineno |
---|
390 | .endm |
---|
391 | |
---|
392 | ;*************************************LONG |
---|
393 | .macro LONG, varname |
---|
394 | varname: |
---|
395 | .block 4 |
---|
396 | .endm |
---|
397 | |
---|
398 | ;*************************************UNSIGNED LONG |
---|
399 | .macro ULONG, varname |
---|
400 | varname: |
---|
401 | .block 4 |
---|
402 | .endm |
---|
403 | |
---|
404 | ;*************************************SHORT |
---|
405 | .macro SHORT, varname |
---|
406 | varname: |
---|
407 | .block 2 |
---|
408 | .endm |
---|
409 | |
---|
410 | ;*************************************CHAR |
---|
411 | .macro CHAR, varname |
---|
412 | varname: |
---|
413 | .block 1 |
---|
414 | .endm |
---|
415 | |
---|
416 | ;*************************************LONGARRAY |
---|
417 | .macro LONGARRAY, name, count |
---|
418 | name: |
---|
419 | .block count*4 |
---|
420 | .endm |
---|
421 | |
---|
422 | ;*************************************SHORTARRAY |
---|
423 | |
---|
424 | .macro SHORTARRAY, name, count |
---|
425 | name: |
---|
426 | .block count*2 |
---|
427 | .endm |
---|
428 | |
---|
429 | ;*************************************CHARARRAY |
---|
430 | |
---|
431 | .macro CHARARRAY, name, count |
---|
432 | name: |
---|
433 | .block count |
---|
434 | .endm |
---|
435 | |
---|
436 | |
---|
437 | ;*************************************VOID_FPTR |
---|
438 | |
---|
439 | .macro VOID_FPTR, name |
---|
440 | name: |
---|
441 | .block 4 |
---|
442 | .endm |
---|