1#include "mem.h" 2 3/* special instruction definitions */ 4#define BDNE BC 0,2, 5#define BDNZ BC 16,0, 6#define NOOP OR R0,R0,R0 7 8/* 9 * common ppc special purpose registers 10 */ 11#define DSISR 18 12#define DAR 19 /* Data Address Register */ 13#define DEC 22 /* Decrementer */ 14#define SRR0 26 /* Saved Registers (exception) */ 15#define SRR1 27 16#define SPRG0 272 /* Supervisor Private Registers */ 17#define SPRG1 273 18#define SPRG2 274 19#define SPRG3 275 20#define TBRU 269 /* Time base Upper/Lower (Reading) */ 21#define TBRL 268 22#define TBWU 285 /* Time base Upper/Lower (Writing) */ 23#define TBWL 284 24#define PVR 287 /* Processor Version */ 25 26/* 27 * mpc82x-specific special purpose registers of interest here 28 */ 29#define EIE 80 30#define EID 81 31#define NRI 82 32#define IMMR 638 33#define IC_CST 560 34#define IC_ADR 561 35#define IC_DAT 562 36#define DC_CST 568 37#define DC_ADR 569 38#define DC_DAT 570 39#define MI_CTR 784 40#define MI_AP 786 41#define MI_EPN 787 42#define MI_TWC 789 43#define MI_RPN 790 44#define MI_DBCAM 816 45#define MI_DBRAM0 817 46#define MI_DBRAM1 818 47#define MD_CTR 792 48#define M_CASID 793 49#define MD_AP 794 50#define MD_EPN 795 51#define M_TWB 796 52#define MD_TWC 797 53#define MD_RPN 798 54#define M_TW 799 55#define MD_DBCAM 824 56#define MD_DBRAM0 825 57#define MD_DBRAM1 826 58 59/* as on 603e, apparently mtmsr needs help in some chip revisions */ 60#define WAITMSR SYNC; ISYNC 61 62/* use of SPRG registers in save/restore */ 63#define SAVER0 SPRG0 64#define SAVER1 SPRG1 65#define SAVELR SPRG2 66#define SAVECR SPRG3 67 68#define UREGSIZE ((8+32)*4) 69#define UREGSPACE (UREGSIZE+8) /* allow for arg to trap, and align */ 70 71/* 72 * This code is loaded by the ROM loader at location 0x3000, 73 * or lives in flash memory at FLASHMEM+0x100 74 * Move it to high memory so that it can load the kernel at 0x0000. 75 */ 76 77#define LOADCODEBASE 0x3000 /* when downloaded in S records */ 78#define FLASHCODEBASE (FLASHMEM+0x20000+0x100) /* when in flash */ 79 80 TEXT start(SB), $-4 81 MOVW MSR, R3 82 MOVW $(EE|IP|RI), R4 83 ANDN R4, R3 84 OR $ME, R3 85 SYNC 86 MOVW R3, MSR /* turn off interrupts but enable traps */ 87 WAITMSR 88 89/* 90 * reset the caches and disable them for now 91 */ 92 MOVW SPR(IC_CST), R4 /* read and clear */ 93 MOVW $(5<<25), R4 94 MOVW R4, SPR(IC_CST) /* unlock all */ 95 ISYNC 96 MOVW $(6<<25), R4 97 MOVW R4, SPR(IC_CST) /* invalidate all */ 98 ISYNC 99 MOVW $(2<<25), R4 100 MOVW R4, SPR(IC_CST) /* disable i-cache */ 101 ISYNC 102 103 SYNC 104 MOVW SPR(DC_CST), R4 /* read and clear */ 105 MOVW $(10<<24), R4 106 MOVW R4, SPR(DC_CST) /* unlock all */ 107 ISYNC 108 MOVW $(12<<24), R4 109 MOVW R4, SPR(DC_CST) /* invalidate all */ 110 ISYNC 111 MOVW $(4<<24), R4 112 MOVW R4, SPR(DC_CST) /* disable i-cache */ 113 ISYNC 114 115 MOVW $7, R4 116 MOVW R4, SPR(158) /* cancel `show cycle' for normal instruction execution */ 117 118/* 119 * set other system configuration values 120 */ 121 MOVW SPR(IMMR), R5 /* save initial space pointer */ 122 MOVW $INTMEM, R4 123 MOVW R4, SPR(IMMR) /* set internal memory base */ 124 MOVW $0xFFFFFF88, R3 125 MOVW R3, 4(R4) /* disable watchdog in sypcr */ 126 MOVW $0x01012440, R3 127 MOVW R3, 0(R4) /* siumcr */ 128 129/* 130 * system initialisation (init and map DRAM) 131 */ 132 MOVW $0, R0 133 MOVW $setSB(SB), R2 134#ifndef confrpcg 135 MOVW $(0xF000<<16), R3 136/*MOVW R0, R3*/ 137 ANDCC R5, R3 /* initial space is high? */ 138 BEQ notrom 139 MOVW $FLASHCODEBASE, R5 /* where $start(SB) actually is now */ 140 MOVW $start(SB), R4 /* logical start address */ 141 SUB R4, R5, R6 /* text relocation value */ 142 MOVW $etext(SB), R7 143 SUB R4, R7 144 ADD R5, R7 /* data address in ROM */ 145 MOVW $bdata(SB), R8 146 SUB R8, R2 147 ADD R7, R2 /* relocate SB: SB' = romdata+(SB-bdata) */ 148 MOVW $sysinit0(SB), R4 149 ADD R6, R4 /* relocate sysinit0's address */ 150 MOVW R4, CTR 151 MOVW $inmem(SB), R4 152 ADD R6, R4 153 MOVW R4, LR /* and the return address */ 154 BR (CTR) /* call sysinit0 */ 155 TEXT inmem(SB), $-4 156 MOVW $FLASHCODEBASE, R3 157 BR cpu0 158notrom: 159 MOVW $start(SB), R6 160 SUB R6, R2 161 ADD $LOADCODEBASE, R2 162 BL sysinit0(SB) 163 MOVW $LOADCODEBASE, R3 164#endif 165 166/* 167 * cpu 0 168 * relocate bootstrap to our link addresses for text and data 169 * set new PC 170 */ 171cpu0: 172 MOVW $setSB(SB), R2 /* set correct static base register */ 173#ifndef confrpcg 174 MOVW $start(SB), R4 175 MOVW $etext(SB), R5 176 SUB R4, R5 177 CMP R4, R3 /* already there? */ 178 BNE copytext 179 ADD R5, R3 /* start of data image */ 180#else 181 MOVW $etext(SB), R3 182#endif 183 BR copydata 184 185copytext: 186 ADD $3, R5 187 SRAW $2, R5 188 MOVW R5, CTR 189 SUB $4, R4 190 SUB $4, R3 191copyt: /* copy text */ 192 MOVWU 4(R3), R5 193 MOVWU R5, 4(R4) 194 BDNZ copyt 195 ADD $4, R3 196 197copydata: 198 /* copy data */ 199 MOVW $bdata(SB), R4 200 CMP R4, R3 /* already there? */ 201 BEQ loadkpc 202 MOVW $edata(SB), R5 203 SUB R4, R5 204 ADD $3, R5 205 SRAW $2, R5 206 MOVW R5, CTR 207 SUB $4, R4 208 SUB $4, R3 209copyd: 210 MOVWU 4(R3), R5 211 MOVWU R5, 4(R4) 212 BDNZ copyd 213#endif 214 215 /* load correct PC */ 216loadkpc: 217 MOVW $start1(SB), R3 218 MOVW R3, LR 219 BR (LR) 220TEXT start1(SB), $-4 221 MOVW $edata(SB), R3 222 MOVW $end(SB), R4 223 SUBCC R3, R4 224 BLE skipz 225 SRAW $2, R4 226 MOVW R4, CTR 227 SUB $4, R3 228 MOVW $0, R0 229zero: 230 MOVWU R0, 4(R3) 231 BDNZ zero 232skipz: 233 MOVW $mach0(SB), R1 234 MOVW R1, m(SB) 235 ADD $(MACHSIZE-8), R1 236 MOVW $0, R0 237 238 BL sysinit0(SB) 239 240 BL main(SB) 241 BR 0(PC) 242 243TEXT ledx(SB), $0 244 245 MOVW $BCSRMEM, R8 246 MOVW 0(R8), R3 247 MOVW $(0x0800<<16), R5 248 ANDN R5, R3, R3 249 MOVW R3, 0(R8) 250 BR 0(PC) 251 252TEXT getmsr(SB), $0 253 MOVW MSR, R3 254 RETURN 255 256TEXT putmsr(SB), $0 257 SYNC 258 MOVW R3, MSR 259 WAITMSR 260 RETURN 261 262TEXT eieio(SB), $0 263 EIEIO 264 RETURN 265 266TEXT idle(SB), $0 267 RETURN 268 269TEXT spllo(SB), $0 270 MOVW MSR, R3 271 OR $EE, R3, R4 272 SYNC 273 MOVW R4, MSR 274 WAITMSR 275 RETURN 276 277TEXT splhi(SB), $0 278 MOVW MSR, R3 279 RLWNM $0, R3, $~EE, R4 280 SYNC 281 MOVW R4, MSR 282 WAITMSR 283 RETURN 284 285TEXT splx(SB), $0 286 MOVW MSR, R4 287 RLWMI $0, R3, $EE, R4 288 SYNC 289 MOVW R4, MSR 290 WAITMSR 291 RETURN 292 293TEXT gettbl(SB), $0 294/* MOVW SPR(TBRL), R3 */ 295 WORD $0x7c6c42e6 /* mftbl on 8xx series */ 296 RETURN 297 298TEXT getpvr(SB), $0 299 MOVW SPR(PVR), R3 300 RETURN 301 302TEXT getimmr(SB), $0 303 MOVW SPR(IMMR), R3 304 RETURN 305 306TEXT getdec(SB), $0 307 MOVW SPR(DEC), R3 308 RETURN 309 310TEXT putdec(SB), $0 311 MOVW R3, SPR(DEC) 312 RETURN 313 314/* 315 * save state in Ureg on kernel stack. 316 * enter with R0 giving the PC from the call to `exception' from the vector. 317 * on return, SB (R2) has been set, and R3 has the Ureg* 318 */ 319TEXT saveureg(SB), $-4 320 SUB $UREGSPACE, R1 321 MOVMW R2, 48(R1) /* r2:r31 */ 322 MOVW $setSB(SB), R2 323 MOVW SPR(SAVER1), R4 324 MOVW R4, 44(R1) 325 MOVW SPR(SAVER0), R5 326 MOVW R5, 40(R1) 327 MOVW CTR, R6 328 MOVW R6, 36(R1) 329 MOVW XER, R4 330 MOVW R4, 32(R1) 331 MOVW SPR(SAVECR), R5 /* CR */ 332 MOVW R5, 28(R1) 333 MOVW SPR(SAVELR), R6 /* LR */ 334 MOVW R6, 24(R1) 335 /* pad at 20(R1) */ 336 MOVW SPR(SRR0), R4 337 MOVW R4, 16(R1) /* old PC */ 338 MOVW SPR(SRR1), R5 339 MOVW R5, 12(R1) 340 MOVW R0, 8(R1) /* cause/vector, encoded in LR from vector */ 341 ADD $8, R1, R3 /* Ureg* */ 342 STWCCC R3, (R1) /* break any pending reservations */ 343 MOVW $0, R0 /* R0ISZERO */ 344 BR (LR) 345 346/* 347 * restore state from Ureg 348 * SB (R2) is unusable on return 349 */ 350TEXT restoreureg(SB), $-4 351 MOVMW 48(R1), R2 /* r2:r31 */ 352 /* defer R1 */ 353 MOVW 40(R1), R0 354 MOVW R0, SPR(SAVER0) 355 MOVW 36(R1), R0 356 MOVW R0, CTR 357 MOVW 32(R1), R0 358 MOVW R0, XER 359 MOVW 28(R1), R0 360 MOVW R0, CR /* CR */ 361 MOVW 24(R1), R0 362 MOVW R0, SPR(SAVELR) /* LR */ 363 /* pad, skip */ 364 MOVW 16(R1), R0 365 MOVW R0, SPR(SRR0) /* old PC */ 366 MOVW 12(R1), R0 367 MOVW R0, SPR(SRR1) /* old MSR */ 368 /* cause, skip */ 369 MOVW 44(R1), R1 /* old SP */ 370 BR (LR) 371 372TEXT exception(SB), $-4 373 MOVW R1, SPR(SAVER1) 374 MOVW CR, R0 375 MOVW R0, SPR(SAVECR) 376 MOVW LR, R0 377 BL saveureg(SB) 378 MOVW $0, R0 379 BL trap(SB) 380 BL restoreureg(SB) 381 MOVW SPR(SAVELR), R0 382 MOVW R0, LR 383 MOVW SPR(SAVER0), R0 384 ISYNC 385 RFI 386 387GLOBL mach0+0(SB), $MACHSIZE 388GLOBL m(SB), $4 389