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 16*3e12c5d1SDavid du Colombier#define MAXMACH 4 /* max # cpus system can run */ 17*3e12c5d1SDavid du Colombier 18*3e12c5d1SDavid du Colombier/* 19*3e12c5d1SDavid du Colombier * Time 20*3e12c5d1SDavid du Colombier */ 21*3e12c5d1SDavid du Colombier#define MS2HZ 50 /* millisec per clock tick */ 22*3e12c5d1SDavid du Colombier#define TK2SEC(t) ((t)/20) /* ticks to seconds */ 23*3e12c5d1SDavid du Colombier#define TK2MS(t) ((t)*MS2HZ) /* ticks to milliseconds */ 24*3e12c5d1SDavid du Colombier#define MS2TK(t) ((t)/MS2HZ) /* milliseconds to ticks */ 25*3e12c5d1SDavid du Colombier 26*3e12c5d1SDavid du Colombier/* 27*3e12c5d1SDavid du Colombier * CP0 registers 28*3e12c5d1SDavid du Colombier */ 29*3e12c5d1SDavid du Colombier 30*3e12c5d1SDavid du Colombier#define INDEX 0 31*3e12c5d1SDavid du Colombier#define RANDOM 1 32*3e12c5d1SDavid du Colombier#define TLBPHYS 2 33*3e12c5d1SDavid du Colombier#define CONTEXT 4 34*3e12c5d1SDavid du Colombier#define BADVADDR 8 35*3e12c5d1SDavid du Colombier#define TLBVIRT 10 36*3e12c5d1SDavid du Colombier#define STATUS 12 37*3e12c5d1SDavid du Colombier#define CAUSE 13 38*3e12c5d1SDavid du Colombier#define EPC 14 39*3e12c5d1SDavid du Colombier#define PRID 15 40*3e12c5d1SDavid du Colombier 41*3e12c5d1SDavid du Colombier/* 42*3e12c5d1SDavid du Colombier * M(STATUS) bits 43*3e12c5d1SDavid du Colombier */ 44*3e12c5d1SDavid du Colombier#define IEC 0x00000001 45*3e12c5d1SDavid du Colombier#define KUC 0x00000002 46*3e12c5d1SDavid du Colombier#define IEP 0x00000004 47*3e12c5d1SDavid du Colombier#define KUP 0x00000008 48*3e12c5d1SDavid du Colombier#define INTMASK 0x0000ff00 49*3e12c5d1SDavid du Colombier#define SW0 0x00000100 50*3e12c5d1SDavid du Colombier#define SW1 0x00000200 51*3e12c5d1SDavid du Colombier#define INTR0 0x00000400 52*3e12c5d1SDavid du Colombier#define INTR1 0x00000800 53*3e12c5d1SDavid du Colombier#define INTR2 0x00001000 54*3e12c5d1SDavid du Colombier#define INTR3 0x00002000 55*3e12c5d1SDavid du Colombier#define INTR4 0x00004000 56*3e12c5d1SDavid du Colombier#define INTR5 0x00008000 57*3e12c5d1SDavid du Colombier#define ISC 0x00010000 58*3e12c5d1SDavid du Colombier#define SWC 0x00020000 59*3e12c5d1SDavid du Colombier#define CU1 0x20000000 60*3e12c5d1SDavid du Colombier 61*3e12c5d1SDavid du Colombier/* 62*3e12c5d1SDavid du Colombier * Traps 63*3e12c5d1SDavid du Colombier */ 64*3e12c5d1SDavid du Colombier 65*3e12c5d1SDavid du Colombier#define UTLBMISS (KSEG0+0x00) 66*3e12c5d1SDavid du Colombier#define EXCEPTION (KSEG0+0x80) 67*3e12c5d1SDavid du Colombier 68*3e12c5d1SDavid du Colombier/* 69*3e12c5d1SDavid du Colombier * Magic registers 70*3e12c5d1SDavid du Colombier */ 71*3e12c5d1SDavid du Colombier 72*3e12c5d1SDavid du Colombier#define MACH 25 /* R25 is m-> */ 73*3e12c5d1SDavid du Colombier#define USER 24 /* R24 is u-> */ 74*3e12c5d1SDavid du Colombier#define MPID 0xBF000000 /* long; low 3 bits identify mp bus slot */ 75*3e12c5d1SDavid du Colombier#define WBFLUSH 0xBC000000 /* D-CACHE data; used for write buffer flush */ 76*3e12c5d1SDavid du Colombier 77*3e12c5d1SDavid du Colombier/* 78*3e12c5d1SDavid du Colombier * Fundamental addresses 79*3e12c5d1SDavid du Colombier */ 80*3e12c5d1SDavid du Colombier 81*3e12c5d1SDavid du Colombier#define MACHADDR 0x80014000 82*3e12c5d1SDavid du Colombier#define USERADDR 0xC0000000 83*3e12c5d1SDavid du Colombier#define UREGADDR (USERADDR+BY2PG-4-0xA0) 84*3e12c5d1SDavid du Colombier/* 85*3e12c5d1SDavid du Colombier * MMU 86*3e12c5d1SDavid du Colombier */ 87*3e12c5d1SDavid du Colombier 88*3e12c5d1SDavid du Colombier#define KUSEG 0x00000000 89*3e12c5d1SDavid du Colombier#define KSEG0 0x80000000 90*3e12c5d1SDavid du Colombier#define KSEG1 0xA0000000 91*3e12c5d1SDavid du Colombier#define KSEG2 0xC0000000 92*3e12c5d1SDavid du Colombier#define KSEGM 0xE0000000 /* mask to check which seg */ 93*3e12c5d1SDavid du Colombier 94*3e12c5d1SDavid du Colombier#define PTEGLOBL (1<<8) 95*3e12c5d1SDavid du Colombier#define PTEVALID (1<<9) 96*3e12c5d1SDavid du Colombier#define PTEWRITE (1<<10) 97*3e12c5d1SDavid du Colombier#define PTEPID(n) ((n)<<6) 98*3e12c5d1SDavid du Colombier 99*3e12c5d1SDavid du Colombier#define NTLBPID 64 /* number of pids */ 100*3e12c5d1SDavid du Colombier#define NTLB 64 /* number of entries */ 101*3e12c5d1SDavid du Colombier#define TLBROFF 8 /* offset of first randomly indexed entry */ 102*3e12c5d1SDavid du Colombier 103*3e12c5d1SDavid du Colombier/* 104*3e12c5d1SDavid du Colombier * Address spaces 105*3e12c5d1SDavid du Colombier */ 106*3e12c5d1SDavid du Colombier 107*3e12c5d1SDavid du Colombier#define UZERO KUSEG /* base of user address space */ 108*3e12c5d1SDavid du Colombier#define UTZERO (UZERO+BY2PG) /* first address in user text */ 109*3e12c5d1SDavid du Colombier#define USTKTOP KZERO /* byte just beyond user stack */ 110*3e12c5d1SDavid du Colombier#define TSTKTOP (USERADDR+100*BY2PG) /* top of temporary stack */ 111*3e12c5d1SDavid du Colombier#define KZERO KSEG0 /* base of kernel address space */ 112*3e12c5d1SDavid du Colombier#define KTZERO (KSEG0+0x20000) /* first address in kernel text */ 113*3e12c5d1SDavid du Colombier#define USTACKSIZE (4*1024*1024) /* size of user stack */ 114*3e12c5d1SDavid du Colombier/* 115*3e12c5d1SDavid du Colombier * Exception codes 116*3e12c5d1SDavid du Colombier */ 117*3e12c5d1SDavid du Colombier#define CINT 0 /* external interrupt */ 118*3e12c5d1SDavid du Colombier#define CTLBM 1 /* TLB modification */ 119*3e12c5d1SDavid du Colombier#define CTLBL 2 /* TLB miss (load or fetch) */ 120*3e12c5d1SDavid du Colombier#define CTLBS 3 /* TLB miss (store) */ 121*3e12c5d1SDavid du Colombier#define CADREL 4 /* address error (load or fetch) */ 122*3e12c5d1SDavid du Colombier#define CADRES 5 /* address error (store) */ 123*3e12c5d1SDavid du Colombier#define CBUSI 6 /* bus error (fetch) */ 124*3e12c5d1SDavid du Colombier#define CBUSD 7 /* bus error (data load or store) */ 125*3e12c5d1SDavid du Colombier#define CSYS 8 /* system call */ 126*3e12c5d1SDavid du Colombier#define CBRK 9 /* breakpoint */ 127*3e12c5d1SDavid du Colombier#define CRES 10 /* reserved instruction */ 128*3e12c5d1SDavid du Colombier#define CCPU 11 /* coprocessor unusable */ 129*3e12c5d1SDavid du Colombier#define COVF 12 /* arithmetic overflow */ 130*3e12c5d1SDavid du Colombier#define CUNK13 13 /* undefined 13 */ 131*3e12c5d1SDavid du Colombier#define CUNK14 14 /* undefined 14 */ 132*3e12c5d1SDavid du Colombier#define CUNK15 15 /* undefined 15 */ 133*3e12c5d1SDavid du Colombier 134*3e12c5d1SDavid du Colombier#define NSEG 5 135*3e12c5d1SDavid du Colombier 136*3e12c5d1SDavid du Colombier#define SP R29 137*3e12c5d1SDavid du Colombier 138*3e12c5d1SDavid du Colombier#define PROM (KSEG1+0x1FC00000) 139*3e12c5d1SDavid du Colombier#define NOOP NOR R0,R0 140*3e12c5d1SDavid du Colombier#define WAIT NOOP; NOOP 141*3e12c5d1SDavid du Colombier 142*3e12c5d1SDavid du Colombier/* 143*3e12c5d1SDavid du Colombier * Boot first processor 144*3e12c5d1SDavid du Colombier * - why is the processor number loaded from R0 ????? 145*3e12c5d1SDavid du Colombier */ 146*3e12c5d1SDavid du ColombierTEXT start(SB), $-4 147*3e12c5d1SDavid du Colombier 148*3e12c5d1SDavid du Colombier MOVW $setR30(SB), R30 149*3e12c5d1SDavid du Colombier MOVW $(CU1|INTR5|INTR4|INTR3|INTR2|INTR1|SW1|SW0), R1 150*3e12c5d1SDavid du Colombier MOVW R1, M(STATUS) 151*3e12c5d1SDavid du Colombier WAIT 152*3e12c5d1SDavid du Colombier 153*3e12c5d1SDavid du Colombier MOVW $(0x1C<<7), R1 154*3e12c5d1SDavid du Colombier MOVW R1, FCR31 /* permit only inexact and underflow */ 155*3e12c5d1SDavid du Colombier NOOP 156*3e12c5d1SDavid du Colombier MOVD $0.5, F26 157*3e12c5d1SDavid du Colombier SUBD F26, F26, F24 158*3e12c5d1SDavid du Colombier ADDD F26, F26, F28 159*3e12c5d1SDavid du Colombier ADDD F28, F28, F30 160*3e12c5d1SDavid du Colombier 161*3e12c5d1SDavid du Colombier MOVD F24, F0 162*3e12c5d1SDavid du Colombier MOVD F24, F2 163*3e12c5d1SDavid du Colombier MOVD F24, F4 164*3e12c5d1SDavid du Colombier MOVD F24, F6 165*3e12c5d1SDavid du Colombier MOVD F24, F8 166*3e12c5d1SDavid du Colombier MOVD F24, F10 167*3e12c5d1SDavid du Colombier MOVD F24, F12 168*3e12c5d1SDavid du Colombier MOVD F24, F14 169*3e12c5d1SDavid du Colombier MOVD F24, F16 170*3e12c5d1SDavid du Colombier MOVD F24, F18 171*3e12c5d1SDavid du Colombier MOVD F24, F20 172*3e12c5d1SDavid du Colombier MOVD F24, F22 173*3e12c5d1SDavid du Colombier 174*3e12c5d1SDavid du Colombier MOVW $MACHADDR, R(MACH) 175*3e12c5d1SDavid du Colombier ADDU $(BY2PG-4), R(MACH), SP 176*3e12c5d1SDavid du Colombier MOVW $0, R(USER) 177*3e12c5d1SDavid du Colombier MOVW R0, 0(R(MACH)) 178*3e12c5d1SDavid du Colombier 179*3e12c5d1SDavid du Colombier MOVW $edata(SB), R1 180*3e12c5d1SDavid du Colombier MOVW $end(SB), R2 181*3e12c5d1SDavid du Colombier 182*3e12c5d1SDavid du Colombierclrbss: 183*3e12c5d1SDavid du Colombier MOVB $0, (R1) 184*3e12c5d1SDavid du Colombier ADDU $1, R1 185*3e12c5d1SDavid du Colombier BNE R1, R2, clrbss 186*3e12c5d1SDavid du Colombier 187*3e12c5d1SDavid du Colombier MOVW R4, _argc(SB) 188*3e12c5d1SDavid du Colombier MOVW R5, _argv(SB) 189*3e12c5d1SDavid du Colombier MOVW R6, _env(SB) 190*3e12c5d1SDavid du Colombier JAL main(SB) 191*3e12c5d1SDavid du Colombier JMP (R0) 192*3e12c5d1SDavid du Colombier 193*3e12c5d1SDavid du Colombier/* 194*3e12c5d1SDavid du Colombier * Take first processor into user mode 195*3e12c5d1SDavid du Colombier * - argument is stack pointer to user 196*3e12c5d1SDavid du Colombier */ 197*3e12c5d1SDavid du Colombier 198*3e12c5d1SDavid du ColombierTEXT touser(SB), $-4 199*3e12c5d1SDavid du Colombier 200*3e12c5d1SDavid du Colombier MOVW M(STATUS), R1 201*3e12c5d1SDavid du Colombier OR $(KUP|IEP), R1 202*3e12c5d1SDavid du Colombier MOVW R1, M(STATUS) 203*3e12c5d1SDavid du Colombier NOOP 204*3e12c5d1SDavid du Colombier MOVW 0(FP), SP 205*3e12c5d1SDavid du Colombier MOVW $(UTZERO+32), R26 /* header appears in text */ 206*3e12c5d1SDavid du Colombier RFE (R26) 207*3e12c5d1SDavid du Colombier 208*3e12c5d1SDavid du Colombier/* 209*3e12c5d1SDavid du Colombier * Bring subsequent processors on line 210*3e12c5d1SDavid du Colombier */ 211*3e12c5d1SDavid du ColombierTEXT newstart(SB), $0 212*3e12c5d1SDavid du Colombier 213*3e12c5d1SDavid du Colombier MOVW $setR30(SB), R30 214*3e12c5d1SDavid du Colombier MOVW $(INTR5|INTR4|INTR3|INTR2|INTR1|SW1|SW0), R1 215*3e12c5d1SDavid du Colombier MOVW R1, M(STATUS) 216*3e12c5d1SDavid du Colombier NOOP 217*3e12c5d1SDavid du Colombier MOVW $MACHADDR, R(MACH) 218*3e12c5d1SDavid du Colombier MOVB (MPID+3), R1 219*3e12c5d1SDavid du Colombier AND $7, R1 220*3e12c5d1SDavid du Colombier SLL $PGSHIFT, R1, R2 221*3e12c5d1SDavid du Colombier ADDU R2, R(MACH) 222*3e12c5d1SDavid du Colombier ADDU $(BY2PG-4), R(MACH), SP 223*3e12c5d1SDavid du Colombier MOVW $0, R(USER) 224*3e12c5d1SDavid du Colombier MOVW R1, 0(R(MACH)) 225*3e12c5d1SDavid du Colombier JAL online(SB) 226*3e12c5d1SDavid du Colombier JMP (R0) 227*3e12c5d1SDavid du Colombier 228*3e12c5d1SDavid du ColombierTEXT firmware(SB), $0 229*3e12c5d1SDavid du Colombier 230*3e12c5d1SDavid du Colombier MOVW $(PROM+0x18), R1 /**/ 231*3e12c5d1SDavid du Colombier/* MOVW $(PROM+0x00), R1 /**/ 232*3e12c5d1SDavid du Colombier JMP (R1) 233*3e12c5d1SDavid du Colombier 234*3e12c5d1SDavid du ColombierTEXT splhi(SB), $0 235*3e12c5d1SDavid du Colombier 236*3e12c5d1SDavid du Colombier MOVW M(STATUS), R1 237*3e12c5d1SDavid du Colombier AND $~IEC, R1, R2 238*3e12c5d1SDavid du Colombier MOVW R2, M(STATUS) 239*3e12c5d1SDavid du Colombier NOOP 240*3e12c5d1SDavid du Colombier RET 241*3e12c5d1SDavid du Colombier 242*3e12c5d1SDavid du ColombierTEXT spllo(SB), $0 243*3e12c5d1SDavid du Colombier 244*3e12c5d1SDavid du Colombier MOVW M(STATUS), R1 245*3e12c5d1SDavid du Colombier OR $IEC, R1, R2 246*3e12c5d1SDavid du Colombier MOVW R2, M(STATUS) 247*3e12c5d1SDavid du Colombier NOOP 248*3e12c5d1SDavid du Colombier RET 249*3e12c5d1SDavid du Colombier 250*3e12c5d1SDavid du ColombierTEXT splx(SB), $0 251*3e12c5d1SDavid du Colombier 252*3e12c5d1SDavid du Colombier MOVW 0(FP), R1 253*3e12c5d1SDavid du Colombier MOVW M(STATUS), R2 254*3e12c5d1SDavid du Colombier AND $IEC, R1 255*3e12c5d1SDavid du Colombier AND $~IEC, R2 256*3e12c5d1SDavid du Colombier OR R2, R1 257*3e12c5d1SDavid du Colombier MOVW R1, M(STATUS) 258*3e12c5d1SDavid du Colombier NOOP 259*3e12c5d1SDavid du Colombier RET 260*3e12c5d1SDavid du Colombier 261*3e12c5d1SDavid du ColombierTEXT wbflush(SB), $-4 262*3e12c5d1SDavid du Colombier 263*3e12c5d1SDavid du Colombier MOVW $WBFLUSH, R1 264*3e12c5d1SDavid du Colombier MOVW 0(R1), R1 265*3e12c5d1SDavid du Colombier RET 266*3e12c5d1SDavid du Colombier 267*3e12c5d1SDavid du ColombierTEXT setlabel(SB), $0 268*3e12c5d1SDavid du Colombier 269*3e12c5d1SDavid du Colombier MOVW 0(FP), R2 270*3e12c5d1SDavid du Colombier MOVW $0, R1 271*3e12c5d1SDavid du Colombier MOVW R31, 0(R2) 272*3e12c5d1SDavid du Colombier MOVW R29, 4(R2) 273*3e12c5d1SDavid du Colombier RET 274*3e12c5d1SDavid du Colombier 275*3e12c5d1SDavid du ColombierTEXT gotolabel(SB), $0 276*3e12c5d1SDavid du Colombier 277*3e12c5d1SDavid du Colombier MOVW 0(FP), R2 278*3e12c5d1SDavid du Colombier MOVW $1, R1 279*3e12c5d1SDavid du Colombier MOVW 0(R2), R31 280*3e12c5d1SDavid du Colombier MOVW 4(R2), R29 281*3e12c5d1SDavid du Colombier RET 282*3e12c5d1SDavid du Colombier 283*3e12c5d1SDavid du ColombierTEXT gotopc(SB), $8 284*3e12c5d1SDavid du Colombier 285*3e12c5d1SDavid du Colombier MOVW 0(FP), R7 /* save arguments for later */ 286*3e12c5d1SDavid du Colombier MOVW _argc(SB), R4 287*3e12c5d1SDavid du Colombier MOVW _argv(SB), R5 288*3e12c5d1SDavid du Colombier MOVW _env(SB), R6 289*3e12c5d1SDavid du Colombier MOVW R0, 4(SP) 290*3e12c5d1SDavid du Colombier MOVW $(64*1024), R1 291*3e12c5d1SDavid du Colombier MOVW R1, 8(SP) 292*3e12c5d1SDavid du Colombier JAL icflush(SB) 293*3e12c5d1SDavid du Colombier JMP (R7) 294*3e12c5d1SDavid du Colombier 295*3e12c5d1SDavid du ColombierTEXT puttlb(SB), $4 296*3e12c5d1SDavid du Colombier 297*3e12c5d1SDavid du Colombier JAL splhi(SB) 298*3e12c5d1SDavid du Colombier MOVW 0(FP), R2 299*3e12c5d1SDavid du Colombier MOVW 4(FP), R3 300*3e12c5d1SDavid du Colombier MOVW R1, 4(SP) 301*3e12c5d1SDavid du Colombier MOVW R2, M(TLBVIRT) 302*3e12c5d1SDavid du Colombier MOVW R3, M(TLBPHYS) 303*3e12c5d1SDavid du Colombier NOOP 304*3e12c5d1SDavid du Colombier TLBP 305*3e12c5d1SDavid du Colombier NOOP 306*3e12c5d1SDavid du Colombier MOVW M(INDEX), R4 307*3e12c5d1SDavid du Colombier BGEZ R4, index 308*3e12c5d1SDavid du Colombier TLBWR 309*3e12c5d1SDavid du Colombier NOOP 310*3e12c5d1SDavid du Colombier JAL splx(SB) 311*3e12c5d1SDavid du Colombier RET 312*3e12c5d1SDavid du Colombierindex: 313*3e12c5d1SDavid du Colombier TLBWI 314*3e12c5d1SDavid du Colombier NOOP 315*3e12c5d1SDavid du Colombier JAL splx(SB) 316*3e12c5d1SDavid du Colombier RET 317*3e12c5d1SDavid du Colombier 318*3e12c5d1SDavid du ColombierTEXT puttlbx(SB), $0 319*3e12c5d1SDavid du Colombier 320*3e12c5d1SDavid du Colombier MOVW 0(FP), R4 321*3e12c5d1SDavid du Colombier MOVW 4(FP), R2 322*3e12c5d1SDavid du Colombier MOVW 8(FP), R3 323*3e12c5d1SDavid du Colombier SLL $8, R4 324*3e12c5d1SDavid du Colombier MOVW R2, M(TLBVIRT) 325*3e12c5d1SDavid du Colombier MOVW R3, M(TLBPHYS) 326*3e12c5d1SDavid du Colombier MOVW R4, M(INDEX) 327*3e12c5d1SDavid du Colombier NOOP 328*3e12c5d1SDavid du Colombier TLBWI 329*3e12c5d1SDavid du Colombier NOOP 330*3e12c5d1SDavid du Colombier RET 331*3e12c5d1SDavid du Colombier 332*3e12c5d1SDavid du ColombierTEXT tlbp(SB), $0 333*3e12c5d1SDavid du Colombier TLBP 334*3e12c5d1SDavid du Colombier NOOP 335*3e12c5d1SDavid du Colombier MOVW M(INDEX), R1 336*3e12c5d1SDavid du Colombier RET 337*3e12c5d1SDavid du Colombier 338*3e12c5d1SDavid du ColombierTEXT tlbvirt(SB), $0 339*3e12c5d1SDavid du Colombier TLBP 340*3e12c5d1SDavid du Colombier NOOP 341*3e12c5d1SDavid du Colombier MOVW M(TLBVIRT), R1 342*3e12c5d1SDavid du Colombier RET 343*3e12c5d1SDavid du Colombier 344*3e12c5d1SDavid du Colombier 345*3e12c5d1SDavid du ColombierTEXT gettlb(SB), $0 346*3e12c5d1SDavid du Colombier 347*3e12c5d1SDavid du Colombier MOVW 0(FP), R3 348*3e12c5d1SDavid du Colombier MOVW 4(FP), R4 349*3e12c5d1SDavid du Colombier SLL $8, R3 350*3e12c5d1SDavid du Colombier MOVW R3, M(INDEX) 351*3e12c5d1SDavid du Colombier NOOP 352*3e12c5d1SDavid du Colombier TLBR 353*3e12c5d1SDavid du Colombier NOOP 354*3e12c5d1SDavid du Colombier MOVW M(TLBVIRT), R1 355*3e12c5d1SDavid du Colombier MOVW M(TLBPHYS), R2 356*3e12c5d1SDavid du Colombier NOOP 357*3e12c5d1SDavid du Colombier MOVW R1, 0(R4) 358*3e12c5d1SDavid du Colombier MOVW R2, 4(R4) 359*3e12c5d1SDavid du Colombier RET 360*3e12c5d1SDavid du Colombier 361*3e12c5d1SDavid du ColombierTEXT gettlbvirt(SB), $0 362*3e12c5d1SDavid du Colombier 363*3e12c5d1SDavid du Colombier MOVW 0(FP), R3 364*3e12c5d1SDavid du Colombier SLL $8, R3 365*3e12c5d1SDavid du Colombier MOVW R3, M(INDEX) 366*3e12c5d1SDavid du Colombier NOOP 367*3e12c5d1SDavid du Colombier TLBR 368*3e12c5d1SDavid du Colombier NOOP 369*3e12c5d1SDavid du Colombier MOVW M(TLBVIRT), R1 370*3e12c5d1SDavid du Colombier NOOP 371*3e12c5d1SDavid du Colombier RET 372*3e12c5d1SDavid du Colombier 373*3e12c5d1SDavid du ColombierTEXT vector80(SB), $-4 374*3e12c5d1SDavid du Colombier 375*3e12c5d1SDavid du Colombier MOVW $exception(SB), R26 376*3e12c5d1SDavid du Colombier JMP (R26) 377*3e12c5d1SDavid du Colombier 378*3e12c5d1SDavid du ColombierTEXT exception(SB), $-4 379*3e12c5d1SDavid du Colombier 380*3e12c5d1SDavid du Colombier MOVW M(STATUS), R26 381*3e12c5d1SDavid du Colombier AND $KUP, R26 382*3e12c5d1SDavid du Colombier BEQ R26, waskernel 383*3e12c5d1SDavid du Colombier 384*3e12c5d1SDavid du Colombierwasuser: 385*3e12c5d1SDavid du Colombier MOVW SP, R26 386*3e12c5d1SDavid du Colombier /* 387*3e12c5d1SDavid du Colombier * set kernel sp: ureg - ureg* - pc 388*3e12c5d1SDavid du Colombier * done in 2 steps because R30 is not set 389*3e12c5d1SDavid du Colombier * and the loader will make a literal 390*3e12c5d1SDavid du Colombier */ 391*3e12c5d1SDavid du Colombier MOVW $((UREGADDR-2*BY2WD) & 0xffff0000), SP 392*3e12c5d1SDavid du Colombier OR $((UREGADDR-2*BY2WD) & 0xffff), SP 393*3e12c5d1SDavid du Colombier MOVW R26, 0x10(SP) /* user SP */ 394*3e12c5d1SDavid du Colombier MOVW R31, 0x28(SP) 395*3e12c5d1SDavid du Colombier MOVW R30, 0x2C(SP) 396*3e12c5d1SDavid du Colombier MOVW M(CAUSE), R26 397*3e12c5d1SDavid du Colombier MOVW R(MACH), 0x3C(SP) 398*3e12c5d1SDavid du Colombier MOVW R(USER), 0x40(SP) 399*3e12c5d1SDavid du Colombier AND $(0xF<<2), R26 400*3e12c5d1SDavid du Colombier SUB $(CSYS<<2), R26 401*3e12c5d1SDavid du Colombier 402*3e12c5d1SDavid du Colombier JAL saveregs(SB) 403*3e12c5d1SDavid du Colombier 404*3e12c5d1SDavid du Colombier MOVW $setR30(SB), R30 405*3e12c5d1SDavid du Colombier SUBU $(UREGADDR-2*BY2WD-USERADDR), SP, R(USER) 406*3e12c5d1SDavid du Colombier MOVW $MPID, R1 407*3e12c5d1SDavid du Colombier MOVB 3(R1), R1 408*3e12c5d1SDavid du Colombier MOVW $MACHADDR, R(MACH) /* locn of mach 0 */ 409*3e12c5d1SDavid du Colombier AND $7, R1 410*3e12c5d1SDavid du Colombier SLL $PGSHIFT, R1 411*3e12c5d1SDavid du Colombier ADDU R1, R(MACH) /* add offset for mach # */ 412*3e12c5d1SDavid du Colombier 413*3e12c5d1SDavid du Colombier BNE R26, notsys 414*3e12c5d1SDavid du Colombier 415*3e12c5d1SDavid du Colombier JAL syscall(SB) 416*3e12c5d1SDavid du Colombier 417*3e12c5d1SDavid du Colombier MOVW 0x28(SP), R31 418*3e12c5d1SDavid du Colombier MOVW 0x08(SP), R26 419*3e12c5d1SDavid du Colombier MOVW 0x2C(SP), R30 420*3e12c5d1SDavid du Colombier MOVW R26, M(STATUS) 421*3e12c5d1SDavid du Colombier NOOP 422*3e12c5d1SDavid du Colombier MOVW 0x0C(SP), R26 /* old pc */ 423*3e12c5d1SDavid du Colombier MOVW 0x10(SP), SP 424*3e12c5d1SDavid du Colombier RFE (R26) 425*3e12c5d1SDavid du Colombier 426*3e12c5d1SDavid du Colombiernotsys: 427*3e12c5d1SDavid du Colombier JAL trap(SB) 428*3e12c5d1SDavid du Colombier 429*3e12c5d1SDavid du Colombierrestore: 430*3e12c5d1SDavid du Colombier JAL restregs(SB) 431*3e12c5d1SDavid du Colombier MOVW 0x28(SP), R31 432*3e12c5d1SDavid du Colombier MOVW 0x2C(SP), R30 433*3e12c5d1SDavid du Colombier MOVW 0x3C(SP), R(MACH) 434*3e12c5d1SDavid du Colombier MOVW 0x40(SP), R(USER) 435*3e12c5d1SDavid du Colombier MOVW 0x10(SP), SP 436*3e12c5d1SDavid du Colombier RFE (R26) 437*3e12c5d1SDavid du Colombier 438*3e12c5d1SDavid du Colombierwaskernel: 439*3e12c5d1SDavid du Colombier MOVW $1, R26 /* not sys call */ 440*3e12c5d1SDavid du Colombier MOVW SP, -0x90(SP) /* drop this if possible */ 441*3e12c5d1SDavid du Colombier SUB $0xA0, SP 442*3e12c5d1SDavid du Colombier MOVW R31, 0x28(SP) 443*3e12c5d1SDavid du Colombier JAL saveregs(SB) 444*3e12c5d1SDavid du Colombier JAL trap(SB) 445*3e12c5d1SDavid du Colombier JAL restregs(SB) 446*3e12c5d1SDavid du Colombier MOVW 0x28(SP), R31 447*3e12c5d1SDavid du Colombier ADD $0xA0, SP 448*3e12c5d1SDavid du Colombier RFE (R26) 449*3e12c5d1SDavid du Colombier 450*3e12c5d1SDavid du ColombierTEXT saveregs(SB), $-4 451*3e12c5d1SDavid du Colombier MOVW R1, 0x9C(SP) 452*3e12c5d1SDavid du Colombier MOVW R2, 0x98(SP) 453*3e12c5d1SDavid du Colombier ADDU $8, SP, R1 454*3e12c5d1SDavid du Colombier MOVW R1, 0x04(SP) /* arg to base of regs */ 455*3e12c5d1SDavid du Colombier MOVW M(STATUS), R1 456*3e12c5d1SDavid du Colombier MOVW M(EPC), R2 457*3e12c5d1SDavid du Colombier MOVW R1, 0x08(SP) 458*3e12c5d1SDavid du Colombier MOVW R2, 0x0C(SP) 459*3e12c5d1SDavid du Colombier 460*3e12c5d1SDavid du Colombier BEQ R26, return /* sys call, don't save */ 461*3e12c5d1SDavid du Colombier 462*3e12c5d1SDavid du Colombier MOVW M(CAUSE), R1 463*3e12c5d1SDavid du Colombier MOVW M(BADVADDR), R2 464*3e12c5d1SDavid du Colombier MOVW R1, 0x14(SP) 465*3e12c5d1SDavid du Colombier MOVW M(TLBVIRT), R1 466*3e12c5d1SDavid du Colombier MOVW R2, 0x18(SP) 467*3e12c5d1SDavid du Colombier MOVW R1, 0x1C(SP) 468*3e12c5d1SDavid du Colombier MOVW HI, R1 469*3e12c5d1SDavid du Colombier MOVW LO, R2 470*3e12c5d1SDavid du Colombier MOVW R1, 0x20(SP) 471*3e12c5d1SDavid du Colombier MOVW R2, 0x24(SP) 472*3e12c5d1SDavid du Colombier /* LINK,SB,SP missing */ 473*3e12c5d1SDavid du Colombier MOVW R28, 0x30(SP) 474*3e12c5d1SDavid du Colombier /* R27, R26 not saved */ 475*3e12c5d1SDavid du Colombier /* R25, R24 missing */ 476*3e12c5d1SDavid du Colombier MOVW R23, 0x44(SP) 477*3e12c5d1SDavid du Colombier MOVW R22, 0x48(SP) 478*3e12c5d1SDavid du Colombier MOVW R21, 0x4C(SP) 479*3e12c5d1SDavid du Colombier MOVW R20, 0x50(SP) 480*3e12c5d1SDavid du Colombier MOVW R19, 0x54(SP) 481*3e12c5d1SDavid du Colombier MOVW R18, 0x58(SP) 482*3e12c5d1SDavid du Colombier MOVW R17, 0x5C(SP) 483*3e12c5d1SDavid du Colombier MOVW R16, 0x60(SP) 484*3e12c5d1SDavid du Colombier MOVW R15, 0x64(SP) 485*3e12c5d1SDavid du Colombier MOVW R14, 0x68(SP) 486*3e12c5d1SDavid du Colombier MOVW R13, 0x6C(SP) 487*3e12c5d1SDavid du Colombier MOVW R12, 0x70(SP) 488*3e12c5d1SDavid du Colombier MOVW R11, 0x74(SP) 489*3e12c5d1SDavid du Colombier MOVW R10, 0x78(SP) 490*3e12c5d1SDavid du Colombier MOVW R9, 0x7C(SP) 491*3e12c5d1SDavid du Colombier MOVW R8, 0x80(SP) 492*3e12c5d1SDavid du Colombier MOVW R7, 0x84(SP) 493*3e12c5d1SDavid du Colombier MOVW R6, 0x88(SP) 494*3e12c5d1SDavid du Colombier MOVW R5, 0x8C(SP) 495*3e12c5d1SDavid du Colombier MOVW R4, 0x90(SP) 496*3e12c5d1SDavid du Colombier MOVW R3, 0x94(SP) 497*3e12c5d1SDavid du Colombierreturn: 498*3e12c5d1SDavid du Colombier RET 499*3e12c5d1SDavid du Colombier 500*3e12c5d1SDavid du ColombierTEXT restregs(SB), $-4 501*3e12c5d1SDavid du Colombier /* LINK,SB,SP missing */ 502*3e12c5d1SDavid du Colombier MOVW 0x30(SP), R28 503*3e12c5d1SDavid du Colombier /* R27, R26 not saved */ 504*3e12c5d1SDavid du Colombier /* R25, R24 missing */ 505*3e12c5d1SDavid du Colombier MOVW 0x44(SP), R23 506*3e12c5d1SDavid du Colombier MOVW 0x48(SP), R22 507*3e12c5d1SDavid du Colombier MOVW 0x4C(SP), R21 508*3e12c5d1SDavid du Colombier MOVW 0x50(SP), R20 509*3e12c5d1SDavid du Colombier MOVW 0x54(SP), R19 510*3e12c5d1SDavid du Colombier MOVW 0x58(SP), R18 511*3e12c5d1SDavid du Colombier MOVW 0x5C(SP), R17 512*3e12c5d1SDavid du Colombier MOVW 0x60(SP), R16 513*3e12c5d1SDavid du Colombier MOVW 0x64(SP), R15 514*3e12c5d1SDavid du Colombier MOVW 0x68(SP), R14 515*3e12c5d1SDavid du Colombier MOVW 0x6C(SP), R13 516*3e12c5d1SDavid du Colombier MOVW 0x70(SP), R12 517*3e12c5d1SDavid du Colombier MOVW 0x74(SP), R11 518*3e12c5d1SDavid du Colombier MOVW 0x78(SP), R10 519*3e12c5d1SDavid du Colombier MOVW 0x7C(SP), R9 520*3e12c5d1SDavid du Colombier MOVW 0x80(SP), R8 521*3e12c5d1SDavid du Colombier MOVW 0x84(SP), R7 522*3e12c5d1SDavid du Colombier MOVW 0x88(SP), R6 523*3e12c5d1SDavid du Colombier MOVW 0x8C(SP), R5 524*3e12c5d1SDavid du Colombier MOVW 0x90(SP), R4 525*3e12c5d1SDavid du Colombier MOVW 0x94(SP), R3 526*3e12c5d1SDavid du Colombier MOVW 0x24(SP), R2 527*3e12c5d1SDavid du Colombier MOVW 0x20(SP), R1 528*3e12c5d1SDavid du Colombier MOVW R2, LO 529*3e12c5d1SDavid du Colombier MOVW R1, HI 530*3e12c5d1SDavid du Colombier MOVW 0x08(SP), R1 531*3e12c5d1SDavid du Colombier MOVW 0x98(SP), R2 532*3e12c5d1SDavid du Colombier MOVW R1, M(STATUS) 533*3e12c5d1SDavid du Colombier NOOP 534*3e12c5d1SDavid du Colombier MOVW 0x9C(SP), R1 535*3e12c5d1SDavid du Colombier MOVW 0x0C(SP), R26 /* old pc */ 536*3e12c5d1SDavid du Colombier RET 537*3e12c5d1SDavid du Colombier 538*3e12c5d1SDavid du ColombierTEXT rfnote(SB), $0 539*3e12c5d1SDavid du Colombier MOVW 0(FP), R26 /* 1st arg is &uregpointer */ 540*3e12c5d1SDavid du Colombier SUBU $(BY2WD), R26, SP /* pc hole */ 541*3e12c5d1SDavid du Colombier BNE R26, restore 542*3e12c5d1SDavid du Colombier 543*3e12c5d1SDavid du Colombier 544*3e12c5d1SDavid du ColombierTEXT clrfpintr(SB), $0 545*3e12c5d1SDavid du Colombier MOVW FCR31, R1 546*3e12c5d1SDavid du Colombier MOVW R1, R2 547*3e12c5d1SDavid du Colombier AND $~(0x3F<<12), R2 548*3e12c5d1SDavid du Colombier MOVW R2, FCR31 549*3e12c5d1SDavid du Colombier RET 550*3e12c5d1SDavid du Colombier 551*3e12c5d1SDavid du ColombierTEXT savefpregs(SB), $0 552*3e12c5d1SDavid du Colombier MOVW M(STATUS), R3 553*3e12c5d1SDavid du Colombier MOVW 0(FP), R1 554*3e12c5d1SDavid du Colombier MOVW FCR31, R2 555*3e12c5d1SDavid du Colombier 556*3e12c5d1SDavid du Colombier MOVD F0, 0x00(R1) 557*3e12c5d1SDavid du Colombier MOVD F2, 0x08(R1) 558*3e12c5d1SDavid du Colombier MOVD F4, 0x10(R1) 559*3e12c5d1SDavid du Colombier MOVD F6, 0x18(R1) 560*3e12c5d1SDavid du Colombier MOVD F8, 0x20(R1) 561*3e12c5d1SDavid du Colombier MOVD F10, 0x28(R1) 562*3e12c5d1SDavid du Colombier MOVD F12, 0x30(R1) 563*3e12c5d1SDavid du Colombier MOVD F14, 0x38(R1) 564*3e12c5d1SDavid du Colombier MOVD F16, 0x40(R1) 565*3e12c5d1SDavid du Colombier MOVD F18, 0x48(R1) 566*3e12c5d1SDavid du Colombier MOVD F20, 0x50(R1) 567*3e12c5d1SDavid du Colombier MOVD F22, 0x58(R1) 568*3e12c5d1SDavid du Colombier MOVD F24, 0x60(R1) 569*3e12c5d1SDavid du Colombier MOVD F26, 0x68(R1) 570*3e12c5d1SDavid du Colombier MOVD F28, 0x70(R1) 571*3e12c5d1SDavid du Colombier MOVD F30, 0x78(R1) 572*3e12c5d1SDavid du Colombier 573*3e12c5d1SDavid du Colombier MOVW R2, 0x80(R1) 574*3e12c5d1SDavid du Colombier AND $~CU1, R3 575*3e12c5d1SDavid du Colombier MOVW R3, M(STATUS) 576*3e12c5d1SDavid du Colombier RET 577*3e12c5d1SDavid du Colombier 578*3e12c5d1SDavid du ColombierTEXT restfpregs(SB), $0 579*3e12c5d1SDavid du Colombier 580*3e12c5d1SDavid du Colombier MOVW M(STATUS), R3 581*3e12c5d1SDavid du Colombier MOVW 0(FP), R1 582*3e12c5d1SDavid du Colombier OR $CU1, R3 583*3e12c5d1SDavid du Colombier MOVW R3, M(STATUS) 584*3e12c5d1SDavid du Colombier MOVW 0x80(R1), R2 585*3e12c5d1SDavid du Colombier 586*3e12c5d1SDavid du Colombier MOVD 0x00(R1), F0 587*3e12c5d1SDavid du Colombier MOVD 0x08(R1), F2 588*3e12c5d1SDavid du Colombier MOVD 0x10(R1), F4 589*3e12c5d1SDavid du Colombier MOVD 0x18(R1), F6 590*3e12c5d1SDavid du Colombier MOVD 0x20(R1), F8 591*3e12c5d1SDavid du Colombier MOVD 0x28(R1), F10 592*3e12c5d1SDavid du Colombier MOVD 0x30(R1), F12 593*3e12c5d1SDavid du Colombier MOVD 0x38(R1), F14 594*3e12c5d1SDavid du Colombier MOVD 0x40(R1), F16 595*3e12c5d1SDavid du Colombier MOVD 0x48(R1), F18 596*3e12c5d1SDavid du Colombier MOVD 0x50(R1), F20 597*3e12c5d1SDavid du Colombier MOVD 0x58(R1), F22 598*3e12c5d1SDavid du Colombier MOVD 0x60(R1), F24 599*3e12c5d1SDavid du Colombier MOVD 0x68(R1), F26 600*3e12c5d1SDavid du Colombier MOVD 0x70(R1), F28 601*3e12c5d1SDavid du Colombier MOVD 0x78(R1), F30 602*3e12c5d1SDavid du Colombier 603*3e12c5d1SDavid du Colombier MOVW R2, FCR31 604*3e12c5d1SDavid du Colombier AND $~CU1, R3 605*3e12c5d1SDavid du Colombier MOVW R3, M(STATUS) 606*3e12c5d1SDavid du Colombier RET 607*3e12c5d1SDavid du Colombier 608*3e12c5d1SDavid du Colombier/* 609*3e12c5d1SDavid du Colombier * we avoid using R4, R5, R6, and R7 so gotopc can call us without saving them 610*3e12c5d1SDavid du Colombier */ 611*3e12c5d1SDavid du ColombierTEXT icflush(SB), $-4 /* icflush(physaddr, nbytes) */ 612*3e12c5d1SDavid du Colombier 613*3e12c5d1SDavid du Colombier MOVW M(STATUS), R10 614*3e12c5d1SDavid du Colombier MOVW 0(FP), R8 615*3e12c5d1SDavid du Colombier MOVW 4(FP), R9 616*3e12c5d1SDavid du Colombier MOVW $KSEG0, R3 617*3e12c5d1SDavid du Colombier OR R3, R8 618*3e12c5d1SDavid du Colombier MOVW $0, M(STATUS) 619*3e12c5d1SDavid du Colombier MOVW $WBFLUSH, R1 /* wbflush */ 620*3e12c5d1SDavid du Colombier MOVW 0(R1), R1 621*3e12c5d1SDavid du Colombier NOOP 622*3e12c5d1SDavid du Colombier MOVW $KSEG1, R3 623*3e12c5d1SDavid du Colombier MOVW $icflush0(SB), R2 /* make sure PC is in uncached address space */ 624*3e12c5d1SDavid du Colombier MOVW $(SWC|ISC), R1 625*3e12c5d1SDavid du Colombier OR R3, R2 626*3e12c5d1SDavid du Colombier JMP (R2) 627*3e12c5d1SDavid du Colombier 628*3e12c5d1SDavid du ColombierTEXT icflush0(SB), $-4 629*3e12c5d1SDavid du Colombier 630*3e12c5d1SDavid du Colombier MOVW R1, M(STATUS) /* swap and isolate cache, splhi */ 631*3e12c5d1SDavid du Colombier MOVW $icflush1(SB), R2 632*3e12c5d1SDavid du Colombier JMP (R2) 633*3e12c5d1SDavid du Colombier 634*3e12c5d1SDavid du ColombierTEXT icflush1(SB), $-4 635*3e12c5d1SDavid du Colombier 636*3e12c5d1SDavid du Colombier_icflush1: 637*3e12c5d1SDavid du Colombier MOVBU R0, 0x00(R8) 638*3e12c5d1SDavid du Colombier MOVBU R0, 0x04(R8) 639*3e12c5d1SDavid du Colombier MOVBU R0, 0x08(R8) 640*3e12c5d1SDavid du Colombier MOVBU R0, 0x0C(R8) 641*3e12c5d1SDavid du Colombier MOVBU R0, 0x10(R8) 642*3e12c5d1SDavid du Colombier MOVBU R0, 0x14(R8) 643*3e12c5d1SDavid du Colombier MOVBU R0, 0x18(R8) 644*3e12c5d1SDavid du Colombier MOVBU R0, 0x1C(R8) 645*3e12c5d1SDavid du Colombier MOVBU R0, 0x20(R8) 646*3e12c5d1SDavid du Colombier MOVBU R0, 0x24(R8) 647*3e12c5d1SDavid du Colombier MOVBU R0, 0x28(R8) 648*3e12c5d1SDavid du Colombier MOVBU R0, 0x2C(R8) 649*3e12c5d1SDavid du Colombier MOVBU R0, 0x30(R8) 650*3e12c5d1SDavid du Colombier MOVBU R0, 0x34(R8) 651*3e12c5d1SDavid du Colombier MOVBU R0, 0x38(R8) 652*3e12c5d1SDavid du Colombier MOVBU R0, 0x3C(R8) 653*3e12c5d1SDavid du Colombier SUB $0x40, R9 654*3e12c5d1SDavid du Colombier ADD $0x40, R8 655*3e12c5d1SDavid du Colombier BGTZ R9, _icflush1 656*3e12c5d1SDavid du Colombier MOVW $icflush2(SB), R2 /* make sure PC is in uncached address space */ 657*3e12c5d1SDavid du Colombier OR R3, R2 658*3e12c5d1SDavid du Colombier JMP (R2) 659*3e12c5d1SDavid du Colombier 660*3e12c5d1SDavid du ColombierTEXT icflush2(SB), $-4 661*3e12c5d1SDavid du Colombier 662*3e12c5d1SDavid du Colombier MOVW $0, M(STATUS) /* swap back caches, de-isolate them, and stay splhi */ 663*3e12c5d1SDavid du Colombier NOOP /* +++ */ 664*3e12c5d1SDavid du Colombier MOVW R10, M(STATUS) 665*3e12c5d1SDavid du Colombier RET 666*3e12c5d1SDavid du Colombier 667*3e12c5d1SDavid du ColombierTEXT dcflush(SB), $-4 /* dcflush(physaddr, nbytes) */ 668*3e12c5d1SDavid du Colombier 669*3e12c5d1SDavid du Colombier MOVW M(STATUS), R6 670*3e12c5d1SDavid du Colombier MOVW 0(FP), R4 671*3e12c5d1SDavid du Colombier MOVW 4(FP), R5 672*3e12c5d1SDavid du Colombier MOVW $KSEG0, R3 673*3e12c5d1SDavid du Colombier OR R3, R4 674*3e12c5d1SDavid du Colombier MOVW $0, M(STATUS) 675*3e12c5d1SDavid du Colombier MOVW $WBFLUSH, R1 676*3e12c5d1SDavid du Colombier MOVW 0(R1), R1 677*3e12c5d1SDavid du Colombier NOOP 678*3e12c5d1SDavid du Colombier MOVW $ISC, R1 679*3e12c5d1SDavid du Colombier MOVW R1, M(STATUS) 680*3e12c5d1SDavid du Colombier_dcflush0: 681*3e12c5d1SDavid du Colombier MOVBU R0, 0x00(R4) 682*3e12c5d1SDavid du Colombier MOVBU R0, 0x04(R4) 683*3e12c5d1SDavid du Colombier MOVBU R0, 0x08(R4) 684*3e12c5d1SDavid du Colombier MOVBU R0, 0x0C(R4) 685*3e12c5d1SDavid du Colombier MOVBU R0, 0x10(R4) 686*3e12c5d1SDavid du Colombier MOVBU R0, 0x14(R4) 687*3e12c5d1SDavid du Colombier MOVBU R0, 0x18(R4) 688*3e12c5d1SDavid du Colombier MOVBU R0, 0x1C(R4) 689*3e12c5d1SDavid du Colombier MOVBU R0, 0x20(R4) 690*3e12c5d1SDavid du Colombier MOVBU R0, 0x24(R4) 691*3e12c5d1SDavid du Colombier MOVBU R0, 0x28(R4) 692*3e12c5d1SDavid du Colombier MOVBU R0, 0x2C(R4) 693*3e12c5d1SDavid du Colombier MOVBU R0, 0x30(R4) 694*3e12c5d1SDavid du Colombier MOVBU R0, 0x34(R4) 695*3e12c5d1SDavid du Colombier MOVBU R0, 0x38(R4) 696*3e12c5d1SDavid du Colombier MOVBU R0, 0x3C(R4) 697*3e12c5d1SDavid du Colombier SUB $0x40, R5 698*3e12c5d1SDavid du Colombier ADD $0x40, R4 699*3e12c5d1SDavid du Colombier BGTZ R5, _dcflush0 700*3e12c5d1SDavid du Colombier MOVW $0, M(STATUS) 701*3e12c5d1SDavid du Colombier NOOP /* +++ */ 702*3e12c5d1SDavid du Colombier MOVW R6, M(STATUS) 703*3e12c5d1SDavid du Colombier RET 704