1*3e12c5d1SDavid du Colombier/* 2*3e12c5d1SDavid du Colombier * Memory and machine-specific definitions. Used in C and assembler. 3*3e12c5d1SDavid du Colombier */ 4*3e12c5d1SDavid du Colombier 5*3e12c5d1SDavid du Colombier/* 6*3e12c5d1SDavid du Colombier * Sizes 7*3e12c5d1SDavid du Colombier */ 8*3e12c5d1SDavid du Colombier 9*3e12c5d1SDavid du Colombier#define BI2BY 8 /* bits per byte */ 10*3e12c5d1SDavid du Colombier#define BI2WD 32 /* bits per word */ 11*3e12c5d1SDavid du Colombier#define BY2WD 4 /* bytes per word */ 12*3e12c5d1SDavid du Colombier#define BY2PG 4096 /* bytes per page */ 13*3e12c5d1SDavid du Colombier#define WD2PG (BY2PG/BY2WD) /* words per page */ 14*3e12c5d1SDavid du Colombier#define PGSHIFT 12 /* log(BY2PG) */ 15*3e12c5d1SDavid du Colombier#define PGROUND(s) (((s)+(BY2PG-1))&~(BY2PG-1)) 16*3e12c5d1SDavid du Colombier 17*3e12c5d1SDavid du Colombier#define MAXMACH 1 /* max # cpus system can run */ 18*3e12c5d1SDavid du Colombier 19*3e12c5d1SDavid du Colombier/* 20*3e12c5d1SDavid du Colombier * Time 21*3e12c5d1SDavid du Colombier */ 22*3e12c5d1SDavid du Colombier#define HZ 20 /* clock frequency */ 23*3e12c5d1SDavid du Colombier#define MS2HZ (1000/HZ) /* millisec per clock tick */ 24*3e12c5d1SDavid du Colombier#define TK2SEC(t) ((t)/HZ) /* ticks to seconds */ 25*3e12c5d1SDavid du Colombier#define TK2MS(t) ((((ulong)(t))*1000)/HZ) /* ticks to milliseconds */ 26*3e12c5d1SDavid du Colombier#define MS2TK(t) ((((ulong)(t))*HZ)/1000) /* milliseconds to ticks */ 27*3e12c5d1SDavid du Colombier 28*3e12c5d1SDavid du Colombier/* 29*3e12c5d1SDavid du Colombier * PSR bits 30*3e12c5d1SDavid du Colombier */ 31*3e12c5d1SDavid du Colombier#define PSREC 0x00002000 32*3e12c5d1SDavid du Colombier#define PSREF 0x00001000 33*3e12c5d1SDavid du Colombier#define PSRSUPER 0x00000080 34*3e12c5d1SDavid du Colombier#define PSRPSUPER 0x00000040 35*3e12c5d1SDavid du Colombier#define PSRET 0x00000020 36*3e12c5d1SDavid du Colombier#define SPL(n) (n<<8) 37*3e12c5d1SDavid du Colombier 38*3e12c5d1SDavid du Colombier/* 39*3e12c5d1SDavid du Colombier * Magic registers 40*3e12c5d1SDavid du Colombier */ 41*3e12c5d1SDavid du Colombier 42*3e12c5d1SDavid du Colombier#define MACH 6 /* R6 is m-> */ 43*3e12c5d1SDavid du Colombier#define USER 5 /* R5 is u-> */ 44*3e12c5d1SDavid du Colombier 45*3e12c5d1SDavid du Colombier/* 46*3e12c5d1SDavid du Colombier * Fundamental addresses 47*3e12c5d1SDavid du Colombier */ 48*3e12c5d1SDavid du Colombier 49*3e12c5d1SDavid du Colombier#define USERADDR 0xE0000000 50*3e12c5d1SDavid du Colombier#define UREGADDR (USERADDR+BY2PG-((32+6)*BY2WD)) 51*3e12c5d1SDavid du Colombier#define BOOTSTACK (KTZERO-0*BY2PG) 52*3e12c5d1SDavid du Colombier#define TRAPS (KTZERO-2*BY2PG) 53*3e12c5d1SDavid du Colombier 54*3e12c5d1SDavid du Colombier/* 55*3e12c5d1SDavid du Colombier * MMU 56*3e12c5d1SDavid du Colombier */ 57*3e12c5d1SDavid du Colombier 58*3e12c5d1SDavid du Colombier#define VAMASK 0x3FFFFFFF 59*3e12c5d1SDavid du Colombier#define NPMEG (1<<12) 60*3e12c5d1SDavid du Colombier#define BY2SEGM (1<<18) 61*3e12c5d1SDavid du Colombier#define PG2SEGM (1<<6) 62*3e12c5d1SDavid du Colombier#define NTLBPID (1+NCONTEXT) /* TLBPID 0 is unallocated */ 63*3e12c5d1SDavid du Colombier#define NCONTEXT 8 64*3e12c5d1SDavid du Colombier#define CONTEXT 0x30000000 /* in ASI 2 */ 65*3e12c5d1SDavid du Colombier 66*3e12c5d1SDavid du Colombier/* 67*3e12c5d1SDavid du Colombier * MMU regions 68*3e12c5d1SDavid du Colombier */ 69*3e12c5d1SDavid du Colombier#define INVALIDSEGM 0xFFFC0000 /* highest seg of VA reserved as invalid */ 70*3e12c5d1SDavid du Colombier#define INVALIDPMEG 0x7F 71*3e12c5d1SDavid du Colombier#define SCREENSEGM 0xFFF80000 72*3e12c5d1SDavid du Colombier#define SCREENPMEG 0x7E 73*3e12c5d1SDavid du Colombier#define ROMSEGM 0xFFE80000 74*3e12c5d1SDavid du Colombier#define ROMEND 0xFFEA0000 75*3e12c5d1SDavid du Colombier#define PG2ROM ((ROMEND-ROMSEGM)/BY2PG) 76*3e12c5d1SDavid du Colombier#define IOSEGM0 ROMSEGM /* see mmuinit() */ 77*3e12c5d1SDavid du Colombier#define NIOSEGM ((SCREENSEGM-ROMSEGM)/BY2SEGM) 78*3e12c5d1SDavid du Colombier#define IOPMEG0 (SCREENPMEG-NIOSEGM) 79*3e12c5d1SDavid du Colombier#define IOSEGM ROMEND 80*3e12c5d1SDavid du Colombier#define IOEND SCREENSEGM 81*3e12c5d1SDavid du Colombier#define TOPPMEG IOPMEG0 82*3e12c5d1SDavid du Colombier 83*3e12c5d1SDavid du Colombier/* 84*3e12c5d1SDavid du Colombier * MMU entries 85*3e12c5d1SDavid du Colombier */ 86*3e12c5d1SDavid du Colombier#define PTEVALID (1<<31) 87*3e12c5d1SDavid du Colombier#define PTERONLY (0<<30) 88*3e12c5d1SDavid du Colombier#define PTEWRITE (1<<30) 89*3e12c5d1SDavid du Colombier#define PTEKERNEL (1<<29) 90*3e12c5d1SDavid du Colombier#define PTENOCACHE (1<<28) 91*3e12c5d1SDavid du Colombier#define PTEMAINMEM (0<<26) 92*3e12c5d1SDavid du Colombier#define PTEIO (1<<26) 93*3e12c5d1SDavid du Colombier#define PTEACCESS (1<<25) 94*3e12c5d1SDavid du Colombier#define PTEMODIFY (1<<24) 95*3e12c5d1SDavid du Colombier#define PTEUNCACHED 0 96*3e12c5d1SDavid du Colombier#define PTEMAPMEM (1024*1024) 97*3e12c5d1SDavid du Colombier#define PTEPERTAB (PTEMAPMEM/BY2PG) 98*3e12c5d1SDavid du Colombier#define SEGMAPSIZE 16 99*3e12c5d1SDavid du Colombier 100*3e12c5d1SDavid du Colombier#define INVALIDPTE 0 101*3e12c5d1SDavid du Colombier#define PPN(pa) ((pa>>12)&0xFFFF) 102*3e12c5d1SDavid du Colombier 103*3e12c5d1SDavid du Colombier/* 104*3e12c5d1SDavid du Colombier * Weird addresses in various ASI's 105*3e12c5d1SDavid du Colombier */ 106*3e12c5d1SDavid du Colombier#define CACHETAGS 0x80000000 /* ASI 2 */ 107*3e12c5d1SDavid du Colombier#define CACHEDATA 0x90000000 /* ASI 2 */ 108*3e12c5d1SDavid du Colombier#define SER 0x60000000 /* ASI 2 */ 109*3e12c5d1SDavid du Colombier#define SEVAR 0x60000004 /* ASI 2 */ 110*3e12c5d1SDavid du Colombier#define ASER 0x60000008 /* ASI 2 */ 111*3e12c5d1SDavid du Colombier#define ASEVAR 0x6000000C /* ASI 2 */ 112*3e12c5d1SDavid du Colombier#define ENAB 0x40000000 /* ASI 2 */ 113*3e12c5d1SDavid du Colombier#define ENABCACHE 0x10 114*3e12c5d1SDavid du Colombier#define ENABRESET 0x04 115*3e12c5d1SDavid du Colombier 116*3e12c5d1SDavid du Colombier/* 117*3e12c5d1SDavid du Colombier * Virtual addresses 118*3e12c5d1SDavid du Colombier */ 119*3e12c5d1SDavid du Colombier#define VTAG(va) ((va>>22)&0x03F) 120*3e12c5d1SDavid du Colombier#define VPN(va) ((va>>13)&0x1FF) 121*3e12c5d1SDavid du Colombier 122*3e12c5d1SDavid du Colombier#define PARAM ((char*)0x40500000) 123*3e12c5d1SDavid du Colombier#define TLBFLUSH_ 0x01 124*3e12c5d1SDavid du Colombier 125*3e12c5d1SDavid du Colombier/* 126*3e12c5d1SDavid du Colombier * Address spaces 127*3e12c5d1SDavid du Colombier */ 128*3e12c5d1SDavid du Colombier 129*3e12c5d1SDavid du Colombier#define UZERO 0x00000000 /* base of user address space */ 130*3e12c5d1SDavid du Colombier#define UTZERO (UZERO+BY2PG) /* first address in user text */ 131*3e12c5d1SDavid du Colombier#define TSTKTOP 0x10000000 /* end of new stack in sysexec */ 132*3e12c5d1SDavid du Colombier#define TSTKSIZ 32 133*3e12c5d1SDavid du Colombier#define USTKTOP (TSTKTOP-TSTKSIZ*BY2PG) /* byte just beyond user stack */ 134*3e12c5d1SDavid du Colombier#define KZERO 0xE0000000 /* base of kernel address space */ 135*3e12c5d1SDavid du Colombier#define KTZERO (KZERO+4*BY2PG) /* first address in kernel text */ 136*3e12c5d1SDavid du Colombier#define USTKSIZE (4*1024*1024) /* size of user stack */ 137*3e12c5d1SDavid du Colombier 138*3e12c5d1SDavid du Colombier#define MACHSIZE 4096 139*3e12c5d1SDavid du Colombier 140*3e12c5d1SDavid du Colombier#define isphys(x) (((ulong)(x)&0xF0000000) == KZERO) 141*3e12c5d1SDavid du Colombier 142*3e12c5d1SDavid du Colombier#define SYSPSR (SPL(0x0)|PSREF|PSRSUPER|0) 143*3e12c5d1SDavid du Colombier#define NOOP OR R0, R0; OR R0, R0; OR R0, R0 144*3e12c5d1SDavid du Colombier 145*3e12c5d1SDavid du ColombierTEXT start(SB), $-4 146*3e12c5d1SDavid du Colombier 147*3e12c5d1SDavid du Colombier /* get virtual, fast */ 148*3e12c5d1SDavid du Colombier /* we are executing in segment 0, mapped to pmeg 0. stack is there too */ 149*3e12c5d1SDavid du Colombier /* get virtual by mapping segment(KZERO) to pmeg 0., and next to 1 */ 150*3e12c5d1SDavid du Colombier MOVW $KZERO, R7 151*3e12c5d1SDavid du Colombier MOVB R0, (R7, 3) 152*3e12c5d1SDavid du Colombier MOVW $(KZERO+BY2SEGM), R7 153*3e12c5d1SDavid du Colombier MOVW $1, R8 154*3e12c5d1SDavid du Colombier MOVB R8, (R7, 3) 155*3e12c5d1SDavid du Colombier /* now mapped correctly. jmpl to where we want to be */ 156*3e12c5d1SDavid du Colombier MOVW $setSB(SB), R2 157*3e12c5d1SDavid du Colombier MOVW $startvirt(SB), R7 158*3e12c5d1SDavid du Colombier JMPL (R7) 159*3e12c5d1SDavid du Colombier MOVW $_mul(SB), R0 /* touch _mul etc.; doesn't need to execute */ 160*3e12c5d1SDavid du Colombier RETURN /* can't get here */ 161*3e12c5d1SDavid du Colombier 162*3e12c5d1SDavid du ColombierTEXT startvirt(SB), $-4 163*3e12c5d1SDavid du Colombier 164*3e12c5d1SDavid du Colombier MOVW $BOOTSTACK, R1 165*3e12c5d1SDavid du Colombier 166*3e12c5d1SDavid du Colombier MOVW $(SPL(0xF)|PSREF|PSRSUPER), R7 167*3e12c5d1SDavid du Colombier MOVW R7, PSR 168*3e12c5d1SDavid du Colombier 169*3e12c5d1SDavid du Colombier MOVW $(0x35<<22), R7 /* NVM OFM DZM AU */ 170*3e12c5d1SDavid du Colombier MOVW R7, fsr+0(SB) 171*3e12c5d1SDavid du Colombier MOVW fsr+0(SB), FSR 172*3e12c5d1SDavid du Colombier FMOVD $0.5, F26 /* 0.5 -> F26 */ 173*3e12c5d1SDavid du Colombier FSUBD F26, F26, F24 /* 0.0 -> F24 */ 174*3e12c5d1SDavid du Colombier FADDD F26, F26, F28 /* 1.0 -> F28 */ 175*3e12c5d1SDavid du Colombier FADDD F28, F28, F30 /* 2.0 -> F30 */ 176*3e12c5d1SDavid du Colombier 177*3e12c5d1SDavid du Colombier FMOVD F24, F0 178*3e12c5d1SDavid du Colombier FMOVD F24, F2 179*3e12c5d1SDavid du Colombier FMOVD F24, F4 180*3e12c5d1SDavid du Colombier FMOVD F24, F6 181*3e12c5d1SDavid du Colombier FMOVD F24, F8 182*3e12c5d1SDavid du Colombier FMOVD F24, F10 183*3e12c5d1SDavid du Colombier FMOVD F24, F12 184*3e12c5d1SDavid du Colombier FMOVD F24, F14 185*3e12c5d1SDavid du Colombier FMOVD F24, F16 186*3e12c5d1SDavid du Colombier FMOVD F24, F18 187*3e12c5d1SDavid du Colombier FMOVD F24, F20 188*3e12c5d1SDavid du Colombier FMOVD F24, F22 189*3e12c5d1SDavid du Colombier 190*3e12c5d1SDavid du Colombier MOVW $mach0(SB), R(MACH) 191*3e12c5d1SDavid du Colombier/* MOVW $0x8, R7 /**/ 192*3e12c5d1SDavid du Colombier MOVW R0, WIM 193*3e12c5d1SDavid du Colombier JMPL main(SB) 194*3e12c5d1SDavid du Colombier MOVW (R0), R0 195*3e12c5d1SDavid du Colombier RETURN 196*3e12c5d1SDavid du Colombier 197*3e12c5d1SDavid du ColombierTEXT swap1(SB), $0 198*3e12c5d1SDavid du Colombier 199*3e12c5d1SDavid du Colombier TAS (R7), R7 /* LDSTUB, thank you ken */ 200*3e12c5d1SDavid du Colombier RETURN 201*3e12c5d1SDavid du Colombier 202*3e12c5d1SDavid du ColombierTEXT swap1_should_work(SB), $0 203*3e12c5d1SDavid du Colombier 204*3e12c5d1SDavid du Colombier MOVW R7, R8 205*3e12c5d1SDavid du Colombier MOVW $1, R7 206*3e12c5d1SDavid du Colombier SWAP (R8), R7 207*3e12c5d1SDavid du Colombier RETURN 208*3e12c5d1SDavid du Colombier 209*3e12c5d1SDavid du ColombierTEXT swap1x(SB), $0 210*3e12c5d1SDavid du Colombier 211*3e12c5d1SDavid du Colombier MOVW PSR, R9 212*3e12c5d1SDavid du Colombier MOVW R9, R10 213*3e12c5d1SDavid du Colombier AND $~PSRET, R10 /* BUG: book says this is buggy */ 214*3e12c5d1SDavid du Colombier MOVW R10, PSR 215*3e12c5d1SDavid du Colombier NOOP 216*3e12c5d1SDavid du Colombier MOVW (R7), R7 217*3e12c5d1SDavid du Colombier CMP R7, R0 218*3e12c5d1SDavid du Colombier BNE was1 219*3e12c5d1SDavid du Colombier MOVW $1, R10 220*3e12c5d1SDavid du Colombier MOVW R10, (R8) 221*3e12c5d1SDavid du Colombierwas1: 222*3e12c5d1SDavid du Colombier MOVW R9, PSR 223*3e12c5d1SDavid du Colombier RETURN 224*3e12c5d1SDavid du Colombier 225*3e12c5d1SDavid du ColombierTEXT spllo(SB), $0 226*3e12c5d1SDavid du Colombier 227*3e12c5d1SDavid du Colombier MOVW PSR, R7 228*3e12c5d1SDavid du Colombier MOVW R7, R10 229*3e12c5d1SDavid du Colombier OR $PSRET, R10 230*3e12c5d1SDavid du Colombier MOVW R10, PSR 231*3e12c5d1SDavid du Colombier NOOP 232*3e12c5d1SDavid du Colombier RETURN 233*3e12c5d1SDavid du Colombier 234*3e12c5d1SDavid du ColombierTEXT splhi(SB), $0 235*3e12c5d1SDavid du Colombier 236*3e12c5d1SDavid du Colombier MOVW R15, 4(R(MACH)) /* save PC in m->splpc */ 237*3e12c5d1SDavid du Colombier MOVW PSR, R7 238*3e12c5d1SDavid du Colombier MOVW R7, R10 239*3e12c5d1SDavid du Colombier AND $~PSRET, R10 /* BUG: book says this is buggy */ 240*3e12c5d1SDavid du Colombier MOVW R10, PSR 241*3e12c5d1SDavid du Colombier NOOP 242*3e12c5d1SDavid du Colombier RETURN 243*3e12c5d1SDavid du Colombier 244*3e12c5d1SDavid du ColombierTEXT splx(SB), $0 245*3e12c5d1SDavid du Colombier 246*3e12c5d1SDavid du Colombier MOVW R15, 4(R(MACH)) /* save PC in m->splpc */ 247*3e12c5d1SDavid du Colombier MOVW R7, PSR /* BUG: book says this is buggy */ 248*3e12c5d1SDavid du Colombier NOOP 249*3e12c5d1SDavid du Colombier RETURN 250*3e12c5d1SDavid du Colombier 251*3e12c5d1SDavid du ColombierTEXT spldone(SB), $0 252*3e12c5d1SDavid du Colombier 253*3e12c5d1SDavid du Colombier RETURN 254*3e12c5d1SDavid du Colombier 255*3e12c5d1SDavid du ColombierTEXT touser(SB), $0 256*3e12c5d1SDavid du Colombier MOVW $(SYSPSR&~PSREF), R8 257*3e12c5d1SDavid du Colombier MOVW R8, PSR 258*3e12c5d1SDavid du Colombier NOOP 259*3e12c5d1SDavid du Colombier 260*3e12c5d1SDavid du Colombier MOVW R7, R1 261*3e12c5d1SDavid du Colombier SAVE R0, R0 /* RETT is implicit RESTORE */ 262*3e12c5d1SDavid du Colombier MOVW $(UTZERO+32), R7 /* PC; header appears in text */ 263*3e12c5d1SDavid du Colombier MOVW $(UTZERO+32+4), R8 /* nPC */ 264*3e12c5d1SDavid du Colombier RETT R7, R8 265*3e12c5d1SDavid du Colombier 266*3e12c5d1SDavid du ColombierTEXT rfnote(SB), $0 267*3e12c5d1SDavid du Colombier 268*3e12c5d1SDavid du Colombier MOVW R7, R1 /* 1st arg is &uregpointer */ 269*3e12c5d1SDavid du Colombier ADD $4, R1 /* point at ureg */ 270*3e12c5d1SDavid du Colombier JMP restore 271*3e12c5d1SDavid du Colombier 272*3e12c5d1SDavid du ColombierTEXT traplink(SB), $-4 273*3e12c5d1SDavid du Colombier 274*3e12c5d1SDavid du Colombier /* R8 to R23 are free to play with */ 275*3e12c5d1SDavid du Colombier /* R17 contains PC, R18 contains nPC */ 276*3e12c5d1SDavid du Colombier /* R19 has PSR loaded from vector code */ 277*3e12c5d1SDavid du Colombier 278*3e12c5d1SDavid du Colombier ANDCC $PSRPSUPER, R19, R0 279*3e12c5d1SDavid du Colombier BE usertrap 280*3e12c5d1SDavid du Colombier 281*3e12c5d1SDavid du Colombierkerneltrap: 282*3e12c5d1SDavid du Colombier /* 283*3e12c5d1SDavid du Colombier * Interrupt or fault from kernel 284*3e12c5d1SDavid du Colombier */ 285*3e12c5d1SDavid du Colombier ANDN $7, R1, R20 /* dbl aligned */ 286*3e12c5d1SDavid du Colombier MOVW R1, (0-(4*(32+6))+(4*1))(R20) /* save R1=SP */ 287*3e12c5d1SDavid du Colombier /* really clumsy: store these in Ureg so can be restored below */ 288*3e12c5d1SDavid du Colombier MOVW R2, (0-(4*(32+6))+(4*2))(R20) /* SB */ 289*3e12c5d1SDavid du Colombier MOVW R5, (0-(4*(32+6))+(4*5))(R20) /* USER */ 290*3e12c5d1SDavid du Colombier MOVW R6, (0-(4*(32+6))+(4*6))(R20) /* MACH */ 291*3e12c5d1SDavid du Colombier SUB $(4*(32+6)), R20, R1 292*3e12c5d1SDavid du Colombier 293*3e12c5d1SDavid du Colombiertrap1: 294*3e12c5d1SDavid du Colombier MOVW Y, R20 295*3e12c5d1SDavid du Colombier MOVW R20, (4*(32+0))(R1) /* Y */ 296*3e12c5d1SDavid du Colombier MOVW TBR, R20 297*3e12c5d1SDavid du Colombier MOVW R20, (4*(32+1))(R1) /* TBR */ 298*3e12c5d1SDavid du Colombier AND $~0x1F, R19 /* force CWP=0 */ 299*3e12c5d1SDavid du Colombier MOVW R19, (4*(32+2))(R1) /* PSR */ 300*3e12c5d1SDavid du Colombier MOVW R18, (4*(32+3))(R1) /* nPC */ 301*3e12c5d1SDavid du Colombier MOVW R17, (4*(32+4))(R1) /* PC */ 302*3e12c5d1SDavid du Colombier MOVW R0, (4*0)(R1) 303*3e12c5d1SDavid du Colombier MOVW R3, (4*3)(R1) 304*3e12c5d1SDavid du Colombier MOVW R4, (4*4)(R1) 305*3e12c5d1SDavid du Colombier MOVW R7, (4*7)(R1) 306*3e12c5d1SDavid du Colombier RESTORE R0, R0 307*3e12c5d1SDavid du Colombier /* now our registers R8-R31 are same as before trap */ 308*3e12c5d1SDavid du Colombier /* save registers two at a time */ 309*3e12c5d1SDavid du Colombier MOVD R8, (4*8)(R1) 310*3e12c5d1SDavid du Colombier MOVD R10, (4*10)(R1) 311*3e12c5d1SDavid du Colombier MOVD R12, (4*12)(R1) 312*3e12c5d1SDavid du Colombier MOVD R14, (4*14)(R1) 313*3e12c5d1SDavid du Colombier MOVD R16, (4*16)(R1) 314*3e12c5d1SDavid du Colombier MOVD R18, (4*18)(R1) 315*3e12c5d1SDavid du Colombier MOVD R20, (4*20)(R1) 316*3e12c5d1SDavid du Colombier MOVD R22, (4*22)(R1) 317*3e12c5d1SDavid du Colombier MOVD R24, (4*24)(R1) 318*3e12c5d1SDavid du Colombier MOVD R26, (4*26)(R1) 319*3e12c5d1SDavid du Colombier MOVD R28, (4*28)(R1) 320*3e12c5d1SDavid du Colombier MOVD R30, (4*30)(R1) 321*3e12c5d1SDavid du Colombier /* SP and SB and u and m are already set; away we go */ 322*3e12c5d1SDavid du Colombier MOVW R1, R7 /* pointer to Ureg */ 323*3e12c5d1SDavid du Colombier SUB $8, R1 324*3e12c5d1SDavid du Colombier MOVW $SYSPSR, R8 325*3e12c5d1SDavid du Colombier MOVW R8, PSR 326*3e12c5d1SDavid du Colombier NOOP 327*3e12c5d1SDavid du Colombier JMPL trap(SB) 328*3e12c5d1SDavid du Colombier 329*3e12c5d1SDavid du Colombier ADD $8, R1 330*3e12c5d1SDavid du Colombierrestore: 331*3e12c5d1SDavid du Colombier MOVW (4*(32+2))(R1), R8 /* PSR */ 332*3e12c5d1SDavid du Colombier MOVW R8, PSR 333*3e12c5d1SDavid du Colombier NOOP 334*3e12c5d1SDavid du Colombier 335*3e12c5d1SDavid du Colombier MOVD (4*30)(R1), R30 336*3e12c5d1SDavid du Colombier MOVD (4*28)(R1), R28 337*3e12c5d1SDavid du Colombier MOVD (4*26)(R1), R26 338*3e12c5d1SDavid du Colombier MOVD (4*24)(R1), R24 339*3e12c5d1SDavid du Colombier MOVD (4*22)(R1), R22 340*3e12c5d1SDavid du Colombier MOVD (4*20)(R1), R20 341*3e12c5d1SDavid du Colombier MOVD (4*18)(R1), R18 342*3e12c5d1SDavid du Colombier MOVD (4*16)(R1), R16 343*3e12c5d1SDavid du Colombier MOVD (4*14)(R1), R14 344*3e12c5d1SDavid du Colombier MOVD (4*12)(R1), R12 345*3e12c5d1SDavid du Colombier MOVD (4*10)(R1), R10 346*3e12c5d1SDavid du Colombier MOVD (4*8)(R1), R8 347*3e12c5d1SDavid du Colombier SAVE R0, R0 348*3e12c5d1SDavid du Colombier MOVD (4*6)(R1), R6 349*3e12c5d1SDavid du Colombier MOVD (4*4)(R1), R4 350*3e12c5d1SDavid du Colombier MOVD (4*2)(R1), R2 351*3e12c5d1SDavid du Colombier MOVW (4*(32+0))(R1), R20 /* Y */ 352*3e12c5d1SDavid du Colombier MOVW R20, Y 353*3e12c5d1SDavid du Colombier MOVW (4*(32+4))(R1), R17 /* PC */ 354*3e12c5d1SDavid du Colombier MOVW (4*(32+3))(R1), R18 /* nPC */ 355*3e12c5d1SDavid du Colombier MOVW (4*1)(R1), R1 /* restore R1=SP */ 356*3e12c5d1SDavid du Colombier RETT R17, R18 357*3e12c5d1SDavid du Colombier 358*3e12c5d1SDavid du Colombierusertrap: 359*3e12c5d1SDavid du Colombier /* 360*3e12c5d1SDavid du Colombier * Interrupt or fault from user 361*3e12c5d1SDavid du Colombier */ 362*3e12c5d1SDavid du Colombier MOVW R1, R8 363*3e12c5d1SDavid du Colombier MOVW R2, R9 364*3e12c5d1SDavid du Colombier MOVW $setSB(SB), R2 365*3e12c5d1SDavid du Colombier MOVW $(USERADDR+BY2PG), R1 366*3e12c5d1SDavid du Colombier MOVW R8, (0-(4*(32+6))+(4*1))(R1) /* save R1=SP */ 367*3e12c5d1SDavid du Colombier MOVW R9, (0-(4*(32+6))+(4*2))(R1) /* save R2=SB */ 368*3e12c5d1SDavid du Colombier MOVW R5, (0-(4*(32+6))+(4*5))(R1) /* save R5=USER */ 369*3e12c5d1SDavid du Colombier MOVW R6, (0-(4*(32+6))+(4*6))(R1) /* save R6=MACH */ 370*3e12c5d1SDavid du Colombier MOVW $USERADDR, R(USER) 371*3e12c5d1SDavid du Colombier MOVW $mach0(SB), R(MACH) 372*3e12c5d1SDavid du Colombier SUB $(4*(32+6)), R1 373*3e12c5d1SDavid du Colombier JMP trap1 374*3e12c5d1SDavid du Colombier 375*3e12c5d1SDavid du ColombierTEXT syslink(SB), $-4 376*3e12c5d1SDavid du Colombier 377*3e12c5d1SDavid du Colombier /* R8 to R23 are free to play with */ 378*3e12c5d1SDavid du Colombier /* R17 contains PC, R18 contains nPC */ 379*3e12c5d1SDavid du Colombier /* R19 has PSR loaded from vector code */ 380*3e12c5d1SDavid du Colombier /* assume user did it; syscall checks */ 381*3e12c5d1SDavid du Colombier 382*3e12c5d1SDavid du Colombier MOVW R1, R8 383*3e12c5d1SDavid du Colombier MOVW R2, R9 384*3e12c5d1SDavid du Colombier MOVW $setSB(SB), R2 385*3e12c5d1SDavid du Colombier MOVW $(USERADDR+BY2PG), R1 386*3e12c5d1SDavid du Colombier MOVW R8, (0-(4*(32+6))+4)(R1) /* save R1=SP */ 387*3e12c5d1SDavid du Colombier SUB $(4*(32+6)), R1 388*3e12c5d1SDavid du Colombier MOVW R9, (4*2)(R1) /* save R2=SB */ 389*3e12c5d1SDavid du Colombier MOVW R3, (4*3)(R1) /* global register */ 390*3e12c5d1SDavid du Colombier MOVD R4, (4*4)(R1) /* global register, R5=USER */ 391*3e12c5d1SDavid du Colombier MOVD R6, (4*6)(R1) /* save R6=MACH, R7=syscall# */ 392*3e12c5d1SDavid du Colombier MOVW $USERADDR, R(USER) 393*3e12c5d1SDavid du Colombier MOVW $mach0(SB), R(MACH) 394*3e12c5d1SDavid du Colombier MOVW TBR, R20 395*3e12c5d1SDavid du Colombier MOVW R20, (4*(32+1))(R1) /* TBR */ 396*3e12c5d1SDavid du Colombier AND $~0x1F, R19 397*3e12c5d1SDavid du Colombier MOVW R19, (4*(32+2))(R1) /* PSR */ 398*3e12c5d1SDavid du Colombier MOVW R18, (4*(32+3))(R1) /* nPC */ 399*3e12c5d1SDavid du Colombier MOVW R17, (4*(32+4))(R1) /* PC */ 400*3e12c5d1SDavid du Colombier RESTORE R0, R0 401*3e12c5d1SDavid du Colombier /* now our registers R8-R31 are same as before trap */ 402*3e12c5d1SDavid du Colombier MOVW R15, (4*15)(R1) 403*3e12c5d1SDavid du Colombier /* SP and SB and u and m are already set; away we go */ 404*3e12c5d1SDavid du Colombier MOVW R1, R7 /* pointer to Ureg */ 405*3e12c5d1SDavid du Colombier SUB $8, R1 406*3e12c5d1SDavid du Colombier MOVW $SYSPSR, R8 407*3e12c5d1SDavid du Colombier MOVW R8, PSR 408*3e12c5d1SDavid du Colombier JMPL syscall(SB) 409*3e12c5d1SDavid du Colombier /* R7 contains return value from syscall */ 410*3e12c5d1SDavid du Colombier 411*3e12c5d1SDavid du Colombier ADD $8, R1 412*3e12c5d1SDavid du Colombier MOVW (4*(32+2))(R1), R8 /* PSR */ 413*3e12c5d1SDavid du Colombier MOVW R8, PSR 414*3e12c5d1SDavid du Colombier NOOP 415*3e12c5d1SDavid du Colombier 416*3e12c5d1SDavid du Colombier MOVW (4*15)(R1), R15 417*3e12c5d1SDavid du Colombier SAVE R0, R0 418*3e12c5d1SDavid du Colombier MOVW (4*6)(R1), R6 419*3e12c5d1SDavid du Colombier MOVD (4*4)(R1), R4 420*3e12c5d1SDavid du Colombier MOVD (4*2)(R1), R2 421*3e12c5d1SDavid du Colombier MOVW (4*(32+4))(R1), R17 /* PC */ 422*3e12c5d1SDavid du Colombier MOVW (4*(32+3))(R1), R18 /* nPC */ 423*3e12c5d1SDavid du Colombier MOVW (4*1)(R1), R1 /* restore R1=SP */ 424*3e12c5d1SDavid du Colombier RETT R17, R18 425*3e12c5d1SDavid du Colombier 426*3e12c5d1SDavid du ColombierTEXT puttbr(SB), $0 427*3e12c5d1SDavid du Colombier 428*3e12c5d1SDavid du Colombier MOVW R7, TBR 429*3e12c5d1SDavid du Colombier NOOP 430*3e12c5d1SDavid du Colombier RETURN 431*3e12c5d1SDavid du Colombier 432*3e12c5d1SDavid du ColombierTEXT gettbr(SB), $0 433*3e12c5d1SDavid du Colombier 434*3e12c5d1SDavid du Colombier MOVW TBR, R7 435*3e12c5d1SDavid du Colombier RETURN 436*3e12c5d1SDavid du Colombier 437*3e12c5d1SDavid du ColombierTEXT r1(SB), $0 438*3e12c5d1SDavid du Colombier 439*3e12c5d1SDavid du Colombier MOVW R1, R7 440*3e12c5d1SDavid du Colombier RETURN 441*3e12c5d1SDavid du Colombier 442*3e12c5d1SDavid du ColombierTEXT getwim(SB), $0 443*3e12c5d1SDavid du Colombier 444*3e12c5d1SDavid du Colombier MOVW WIM, R7 445*3e12c5d1SDavid du Colombier RETURN 446*3e12c5d1SDavid du Colombier 447*3e12c5d1SDavid du ColombierTEXT setlabel(SB), $0 448*3e12c5d1SDavid du Colombier 449*3e12c5d1SDavid du Colombier MOVW R1, (R7) 450*3e12c5d1SDavid du Colombier MOVW R15, 4(R7) 451*3e12c5d1SDavid du Colombier MOVW $0, R7 452*3e12c5d1SDavid du Colombier RETURN 453*3e12c5d1SDavid du Colombier 454*3e12c5d1SDavid du ColombierTEXT gotolabel(SB), $0 455*3e12c5d1SDavid du Colombier 456*3e12c5d1SDavid du Colombier MOVW (R7), R1 457*3e12c5d1SDavid du Colombier MOVW 4(R7), R15 458*3e12c5d1SDavid du Colombier MOVW $1, R7 459*3e12c5d1SDavid du Colombier RETURN 460*3e12c5d1SDavid du Colombier 461*3e12c5d1SDavid du ColombierTEXT putcxsegm(SB), $0 462*3e12c5d1SDavid du Colombier 463*3e12c5d1SDavid du Colombier MOVW R7, R8 /* context */ 464*3e12c5d1SDavid du Colombier MOVW 4(FP), R9 /* segment addr */ 465*3e12c5d1SDavid du Colombier MOVW 8(FP), R10 /* segment value */ 466*3e12c5d1SDavid du Colombier MOVW $0xFFE80118, R7 467*3e12c5d1SDavid du Colombier JMPL (R7) 468*3e12c5d1SDavid du Colombier RETURN 469*3e12c5d1SDavid du Colombier 470*3e12c5d1SDavid du ColombierTEXT getpsr(SB), $0 471*3e12c5d1SDavid du Colombier 472*3e12c5d1SDavid du Colombier MOVW PSR, R7 473*3e12c5d1SDavid du Colombier RETURN 474*3e12c5d1SDavid du Colombier 475*3e12c5d1SDavid du ColombierTEXT putcxreg(SB), $0 476*3e12c5d1SDavid du Colombier 477*3e12c5d1SDavid du Colombier MOVW $CONTEXT, R8 478*3e12c5d1SDavid du Colombier MOVB R7, (R8, 2) 479*3e12c5d1SDavid du Colombier RETURN 480*3e12c5d1SDavid du Colombier 481*3e12c5d1SDavid du ColombierTEXT putb2(SB), $0 482*3e12c5d1SDavid du Colombier 483*3e12c5d1SDavid du Colombier MOVW 4(FP), R8 484*3e12c5d1SDavid du Colombier MOVB R8, (R7, 2) 485*3e12c5d1SDavid du Colombier RETURN 486*3e12c5d1SDavid du Colombier 487*3e12c5d1SDavid du ColombierTEXT getb2(SB), $0 488*3e12c5d1SDavid du Colombier 489*3e12c5d1SDavid du Colombier MOVB (R7, 2), R7 490*3e12c5d1SDavid du Colombier RETURN 491*3e12c5d1SDavid du Colombier 492*3e12c5d1SDavid du ColombierTEXT getw2(SB), $0 493*3e12c5d1SDavid du Colombier 494*3e12c5d1SDavid du Colombier MOVW (R7, 2), R7 495*3e12c5d1SDavid du Colombier RETURN 496*3e12c5d1SDavid du Colombier 497*3e12c5d1SDavid du ColombierTEXT putw2(SB), $0 498*3e12c5d1SDavid du Colombier 499*3e12c5d1SDavid du Colombier MOVW 4(FP), R8 500*3e12c5d1SDavid du Colombier MOVW R8, (R7, 2) 501*3e12c5d1SDavid du Colombier RETURN 502*3e12c5d1SDavid du Colombier 503*3e12c5d1SDavid du ColombierTEXT putw4(SB), $0 504*3e12c5d1SDavid du Colombier 505*3e12c5d1SDavid du Colombier MOVW 4(FP), R8 506*3e12c5d1SDavid du Colombier MOVW R8, (R7, 4) 507*3e12c5d1SDavid du Colombier RETURN 508*3e12c5d1SDavid du Colombier 509*3e12c5d1SDavid du ColombierTEXT getw4(SB), $0 510*3e12c5d1SDavid du Colombier 511*3e12c5d1SDavid du Colombier MOVW (R7, 4), R7 512*3e12c5d1SDavid du Colombier RETURN 513*3e12c5d1SDavid du Colombier 514*3e12c5d1SDavid du ColombierTEXT putwC(SB), $0 515*3e12c5d1SDavid du Colombier 516*3e12c5d1SDavid du Colombier MOVW 4(FP), R8 517*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xC) 518*3e12c5d1SDavid du Colombier RETURN 519*3e12c5d1SDavid du Colombier 520*3e12c5d1SDavid du ColombierTEXT putwD(SB), $0 521*3e12c5d1SDavid du Colombier 522*3e12c5d1SDavid du Colombier MOVW 4(FP), R8 523*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 524*3e12c5d1SDavid du Colombier RETURN 525*3e12c5d1SDavid du Colombier 526*3e12c5d1SDavid du ColombierTEXT putwD16(SB), $0 527*3e12c5d1SDavid du Colombier 528*3e12c5d1SDavid du Colombier MOVW 4(FP), R8 529*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 530*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 531*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 532*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 533*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 534*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 535*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 536*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 537*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 538*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 539*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 540*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 541*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 542*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 543*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 544*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 545*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 546*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 547*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 548*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 549*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 550*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 551*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 552*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 553*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 554*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 555*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 556*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 557*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 558*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 559*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xD) 560*3e12c5d1SDavid du Colombier RETURN 561*3e12c5d1SDavid du Colombier 562*3e12c5d1SDavid du ColombierTEXT putwE(SB), $0 563*3e12c5d1SDavid du Colombier 564*3e12c5d1SDavid du Colombier MOVW 4(FP), R8 565*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 566*3e12c5d1SDavid du Colombier RETURN 567*3e12c5d1SDavid du Colombier 568*3e12c5d1SDavid du ColombierTEXT putwE16(SB), $0 569*3e12c5d1SDavid du Colombier 570*3e12c5d1SDavid du Colombier MOVW 4(FP), R8 571*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 572*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 573*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 574*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 575*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 576*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 577*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 578*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 579*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 580*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 581*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 582*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 583*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 584*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 585*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 586*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 587*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 588*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 589*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 590*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 591*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 592*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 593*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 594*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 595*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 596*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 597*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 598*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 599*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 600*3e12c5d1SDavid du Colombier ADD $(1<<4), R7 601*3e12c5d1SDavid du Colombier MOVW R8, (R7, 0xE) 602*3e12c5d1SDavid du Colombier RETURN 603*3e12c5d1SDavid du Colombier 604*3e12c5d1SDavid du ColombierTEXT putsegm(SB), $0 605*3e12c5d1SDavid du Colombier 606*3e12c5d1SDavid du Colombier MOVW 4(FP), R8 607*3e12c5d1SDavid du Colombier MOVW R8, (R7, 3) 608*3e12c5d1SDavid du Colombier RETURN 609*3e12c5d1SDavid du Colombier 610*3e12c5d1SDavid du Colombier/* 611*3e12c5d1SDavid du Colombier * in savefpregs and restfpregs, incoming R7 points to doubleword 612*3e12c5d1SDavid du Colombier * below where F0 will go; doubleword align in and backfill FSR 613*3e12c5d1SDavid du Colombier */ 614*3e12c5d1SDavid du ColombierTEXT savefpregs(SB), $0 615*3e12c5d1SDavid du Colombier 616*3e12c5d1SDavid du Colombier ADD $8, R7 617*3e12c5d1SDavid du Colombier ANDN $7, R7 /* now MOVD-aligned */ 618*3e12c5d1SDavid du Colombier MOVW FSR, -4(R7) 619*3e12c5d1SDavid du Colombier 620*3e12c5d1SDavid du Colombier MOVD F0, (0*4)(R7) 621*3e12c5d1SDavid du Colombier MOVD F2, (2*4)(R7) 622*3e12c5d1SDavid du Colombier MOVD F4, (4*4)(R7) 623*3e12c5d1SDavid du Colombier MOVD F6, (6*4)(R7) 624*3e12c5d1SDavid du Colombier MOVD F8, (8*4)(R7) 625*3e12c5d1SDavid du Colombier MOVD F10, (10*4)(R7) 626*3e12c5d1SDavid du Colombier MOVD F12, (12*4)(R7) 627*3e12c5d1SDavid du Colombier MOVD F14, (14*4)(R7) 628*3e12c5d1SDavid du Colombier MOVD F16, (16*4)(R7) 629*3e12c5d1SDavid du Colombier MOVD F18, (18*4)(R7) 630*3e12c5d1SDavid du Colombier MOVD F20, (20*4)(R7) 631*3e12c5d1SDavid du Colombier MOVD F22, (22*4)(R7) 632*3e12c5d1SDavid du Colombier MOVD F24, (24*4)(R7) 633*3e12c5d1SDavid du Colombier MOVD F26, (26*4)(R7) 634*3e12c5d1SDavid du Colombier MOVD F28, (28*4)(R7) 635*3e12c5d1SDavid du Colombier MOVD F30, (30*4)(R7) 636*3e12c5d1SDavid du Colombier 637*3e12c5d1SDavid du Colombier MOVW PSR, R8 638*3e12c5d1SDavid du Colombier ANDN $PSREF, R8 639*3e12c5d1SDavid du Colombier MOVW R8, PSR 640*3e12c5d1SDavid du Colombier RETURN 641*3e12c5d1SDavid du Colombier 642*3e12c5d1SDavid du ColombierTEXT restfpregs(SB), $0 643*3e12c5d1SDavid du Colombier 644*3e12c5d1SDavid du Colombier MOVW PSR, R8 645*3e12c5d1SDavid du Colombier OR $PSREF, R8 646*3e12c5d1SDavid du Colombier MOVW R8, PSR 647*3e12c5d1SDavid du Colombier 648*3e12c5d1SDavid du Colombier ADD $8, R7 649*3e12c5d1SDavid du Colombier ANDN $7, R7 /* now MOVD-aligned */ 650*3e12c5d1SDavid du Colombier OR R0, R0 651*3e12c5d1SDavid du Colombier 652*3e12c5d1SDavid du Colombier MOVW -4(R7), FSR 653*3e12c5d1SDavid du Colombier 654*3e12c5d1SDavid du Colombier MOVD (0*4)(R7), F0 655*3e12c5d1SDavid du Colombier MOVD (2*4)(R7), F2 656*3e12c5d1SDavid du Colombier MOVD (4*4)(R7), F4 657*3e12c5d1SDavid du Colombier MOVD (6*4)(R7), F6 658*3e12c5d1SDavid du Colombier MOVD (8*4)(R7), F8 659*3e12c5d1SDavid du Colombier MOVD (10*4)(R7), F10 660*3e12c5d1SDavid du Colombier MOVD (12*4)(R7), F12 661*3e12c5d1SDavid du Colombier MOVD (14*4)(R7), F14 662*3e12c5d1SDavid du Colombier MOVD (16*4)(R7), F16 663*3e12c5d1SDavid du Colombier MOVD (18*4)(R7), F18 664*3e12c5d1SDavid du Colombier MOVD (20*4)(R7), F20 665*3e12c5d1SDavid du Colombier MOVD (22*4)(R7), F22 666*3e12c5d1SDavid du Colombier MOVD (24*4)(R7), F24 667*3e12c5d1SDavid du Colombier MOVD (26*4)(R7), F26 668*3e12c5d1SDavid du Colombier MOVD (28*4)(R7), F28 669*3e12c5d1SDavid du Colombier MOVD (30*4)(R7), F30 670*3e12c5d1SDavid du Colombier 671*3e12c5d1SDavid du Colombier ANDN $PSREF, R8 672*3e12c5d1SDavid du Colombier MOVW R8, PSR 673*3e12c5d1SDavid du Colombier RETURN 674*3e12c5d1SDavid du Colombier 675*3e12c5d1SDavid du ColombierTEXT clearfpintr(SB), $0 676*3e12c5d1SDavid du Colombier 677*3e12c5d1SDavid du Colombier MOVW $fpq+BY2WD(SB), R7 678*3e12c5d1SDavid du Colombier ANDN $0x7, R7 /* must be D aligned */ 679*3e12c5d1SDavid du Colombier MOVW $fsr+0(SB), R9 680*3e12c5d1SDavid du Colombierclrq: 681*3e12c5d1SDavid du Colombier MOVD FQ, (R7) 682*3e12c5d1SDavid du Colombier MOVW FSR, (R9) 683*3e12c5d1SDavid du Colombier MOVW (R9), R8 684*3e12c5d1SDavid du Colombier AND $(1<<13), R8 /* queue not empty? */ 685*3e12c5d1SDavid du Colombier BNE clrq 686*3e12c5d1SDavid du Colombier RETURN 687*3e12c5d1SDavid du Colombier 688*3e12c5d1SDavid du ColombierTEXT getfsr(SB), $0 689*3e12c5d1SDavid du Colombier MOVW $fsr+0(SB), R7 690*3e12c5d1SDavid du Colombier MOVW FSR, (R7) 691*3e12c5d1SDavid du Colombier MOVW (R7), R7 692*3e12c5d1SDavid du Colombier RETURN 693*3e12c5d1SDavid du Colombier 694*3e12c5d1SDavid du ColombierGLOBL mach0+0(SB), $MACHSIZE 695*3e12c5d1SDavid du ColombierGLOBL fpq+0(SB), $(3*BY2WD) 696*3e12c5d1SDavid du ColombierGLOBL fsr+0(SB), $BY2WD 697