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