6 #define HI_IPL 6 /* use 7 to disable mchecks */
12 MOVQ $mach0(SB), R(MACH)
13 MOVQ $(BY2PG-8)(R(MACH)), R30
25 MOVL R0, bootconf(SB) /* passed in from boot loader */
31 MOVQ initfpcr(SB), R1 /* MOVQ $0x2800800000000000, R1 */
69 MOVQ $_divq(SB), R31 /* touch _divq etc.; doesn't need to execute */
70 MOVQ $_divl(SB), R31 /* touch _divl etc.; doesn't need to execute */
75 AND $0x7FFFFFFF, R0, R16 /* make address physical */
79 GLOBL mach0(SB), $(MAXMACH*BY2PG)
80 GLOBL init_ptbr(SB), $8
82 TEXT firmware(SB), $-8
85 TEXT xxfirmware(SB), $-8
90 MOVL R26, 4(R(MACH)) /* save PC in m->splpc */
101 MOVL R26, 4(R(MACH)) /* save PC in m->splpc */
103 TEXT splxpc(SB), $0 /* for iunlock */
121 TEXT icflush(SB), $-8
125 TEXT tlbflush(SB), $-8
133 AND $0x7FFFFFFF, R16 /* make address physical */
143 TEXT wrvptptr(SB), $-8
145 CALL_PAL $PALwrvptptr
154 TEXT setlabel(SB), $-8
160 TEXT gotolabel(SB), $-8
169 MOVLL (R1), R0 /* l->key */
172 MOVLC R2, (R1) /* l->key = 1 */
173 BEQ R2, tas1 /* write failed, try again? */
180 MOVLL (R1), R0 /* *p */
183 MOVLC R2, (R1) /* --(*p) */
184 BEQ R2, dec1 /* write failed, retry */
190 MOVLL (R1), R0 /* *p */
192 MOVLC R0, (R1) /* (*p)++ */
193 BEQ R0, inc1 /* write failed, retry */
196 TEXT cmpswap(SB), $-8
202 BEQ R4, fail /* if R0 != [sic] R2, goto fail */
218 WORD $0x6000C000 /* RPCC R0 */
225 * Exception handlers. The stack frame looks like this:
227 * R30+0: (unused) link reg storage (R26) (32 bits)
228 * R30+4: padding for alignment (32 bits)
229 * R30+8: trap()'s first arg storage (R0) (32 bits -- type Ureg*)
230 * R30+12: padding for alignment (32 bits)
231 * R30+16: first 31 fields of Ureg, saved here (31*64 bits)
232 * R30+264: other 6 fields of Ureg, saved by PALcode (6*64 bits)
233 * R30+312: previous value of KSP before trap
237 SUBQ $(4*BY2WD+31*BY2V), R30
238 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
242 TEXT illegal0(SB), $-8
243 SUBQ $(4*BY2WD+31*BY2V), R30
244 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
249 SUBQ $(4*BY2WD+31*BY2V), R30
250 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
254 TEXT unaligned(SB), $-8
255 SUBQ $(4*BY2WD+31*BY2V), R30
256 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
261 SUBQ $(4*BY2WD+31*BY2V), R30
262 MOVQ R0, (4*BY2WD+4*BY2V)(R30)
266 MOVQ R0, (4*BY2WD+0*BY2V)(R30)
267 MOVQ R16, (4*BY2WD+1*BY2V)(R30)
268 MOVQ R17, (4*BY2WD+2*BY2V)(R30)
269 MOVQ R18, (4*BY2WD+3*BY2V)(R30)
271 /* R0 already saved, (4*BY2WD+4*BY2V)(R30) */
272 MOVQ R1, (4*BY2WD+5*BY2V)(R30)
273 MOVQ R2, (4*BY2WD+6*BY2V)(R30)
274 MOVQ R3, (4*BY2WD+7*BY2V)(R30)
275 MOVQ R4, (4*BY2WD+8*BY2V)(R30)
276 MOVQ R5, (4*BY2WD+9*BY2V)(R30)
277 MOVQ R6, (4*BY2WD+10*BY2V)(R30)
278 MOVQ R7, (4*BY2WD+11*BY2V)(R30)
279 MOVQ R8, (4*BY2WD+12*BY2V)(R30)
280 MOVQ R9, (4*BY2WD+13*BY2V)(R30)
281 MOVQ R10, (4*BY2WD+14*BY2V)(R30)
282 MOVQ R11, (4*BY2WD+15*BY2V)(R30)
283 MOVQ R12, (4*BY2WD+16*BY2V)(R30)
284 MOVQ R13, (4*BY2WD+17*BY2V)(R30)
285 MOVQ R14, (4*BY2WD+18*BY2V)(R30)
286 MOVQ R15, (4*BY2WD+19*BY2V)(R30)
287 MOVQ R19, (4*BY2WD+20*BY2V)(R30)
288 MOVQ R20, (4*BY2WD+21*BY2V)(R30)
289 MOVQ R21, (4*BY2WD+22*BY2V)(R30)
290 MOVQ R22, (4*BY2WD+23*BY2V)(R30)
291 MOVQ R23, (4*BY2WD+24*BY2V)(R30)
292 MOVQ R24, (4*BY2WD+25*BY2V)(R30)
293 MOVQ R25, (4*BY2WD+26*BY2V)(R30)
294 MOVQ R26, (4*BY2WD+27*BY2V)(R30)
295 MOVQ R27, (4*BY2WD+28*BY2V)(R30)
296 MOVQ R28, (4*BY2WD+29*BY2V)(R30)
302 MOVQ R0, (4*BY2WD+30*BY2V)(R30) /* save USP */
304 MOVQ $mach0(SB), R(MACH)
305 MOVQ $(4*BY2WD)(R30), R0
308 MOVQ (4*BY2WD+30*BY2V)(R30), R16 /* USP */
309 CALL_PAL $PALwrusp /* ... */
310 MOVQ (4*BY2WD+4*BY2V)(R30), R0
311 MOVQ (4*BY2WD+5*BY2V)(R30), R1
312 MOVQ (4*BY2WD+6*BY2V)(R30), R2
313 MOVQ (4*BY2WD+7*BY2V)(R30), R3
314 MOVQ (4*BY2WD+8*BY2V)(R30), R4
315 MOVQ (4*BY2WD+9*BY2V)(R30), R5
316 MOVQ (4*BY2WD+10*BY2V)(R30), R6
317 MOVQ (4*BY2WD+11*BY2V)(R30), R7
318 MOVQ (4*BY2WD+12*BY2V)(R30), R8
319 MOVQ (4*BY2WD+13*BY2V)(R30), R9
320 MOVQ (4*BY2WD+14*BY2V)(R30), R10
321 MOVQ (4*BY2WD+15*BY2V)(R30), R11
322 MOVQ (4*BY2WD+16*BY2V)(R30), R12
323 MOVQ (4*BY2WD+17*BY2V)(R30), R13
324 MOVQ (4*BY2WD+18*BY2V)(R30), R14
325 MOVQ (4*BY2WD+19*BY2V)(R30), R15
326 MOVQ (4*BY2WD+20*BY2V)(R30), R19
327 MOVQ (4*BY2WD+21*BY2V)(R30), R20
328 MOVQ (4*BY2WD+22*BY2V)(R30), R21
329 MOVQ (4*BY2WD+23*BY2V)(R30), R22
330 MOVQ (4*BY2WD+24*BY2V)(R30), R23
331 MOVQ (4*BY2WD+25*BY2V)(R30), R24
332 MOVQ (4*BY2WD+26*BY2V)(R30), R25
333 MOVQ (4*BY2WD+27*BY2V)(R30), R26
334 MOVQ (4*BY2WD+28*BY2V)(R30), R27
335 MOVQ (4*BY2WD+29*BY2V)(R30), R28
336 /* USP already restored from (4*BY2WD+30*BY2V)(R30) */
337 ADDQ $(4*BY2WD+31*BY2V), R30
341 MOVQ R31, R0 /* Fake out system call return */
344 TEXT syscall0(SB), $-8
345 SUBQ $(4*BY2WD+31*BY2V), R30
346 MOVQ R0, (4*BY2WD+4*BY2V)(R30) /* save scallnr in R0 */
349 MOVQ $mach0(SB), R(MACH)
351 MOVQ R0, (4*BY2WD+30*BY2V)(R30) /* save USP */
352 MOVQ R26, (4*BY2WD+27*BY2V)(R30) /* save last return address */
353 MOVQ $(4*BY2WD)(R30), R0 /* pass address of Ureg */
356 MOVQ (4*BY2WD+30*BY2V)(R30), R16 /* USP */
357 CALL_PAL $PALwrusp /* consider doing this in execregs... */
358 MOVQ (4*BY2WD+27*BY2V)(R30), R26 /* restore last return address */
359 ADDQ $(4*BY2WD+31*BY2V), R30
363 * Take first processor into user mode
364 * - argument is stack pointer to user
369 CALL_PAL $PALwrusp /* set USP to value passed */
370 SUBQ $(6*BY2V), R30 /* create frame for retsys */
371 MOVQ $(UTZERO+32), R26 /* header appears in text */
372 MOVQ R26, (1*BY2V)(R30) /* PC -- only reg that matters */
376 SUBL $(2*BY2WD), R0, SP
379 TEXT savefpregs(SB), $-8
416 CALL_PAL $PALwrfen /* disable */
419 TEXT restfpregs(SB), $-8
421 CALL_PAL $PALwrfen /* enable */