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 0x2800100. 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+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 116ANDN R4, R4, R4 117 MOVW R4, SPR(158) /* cancel `show cycle' for normal instruction execution */ 118 119/* 120 * set other system configuration values 121 */ 122 MOVW SPR(IMMR), R5 /* save initial space pointer */ 123 MOVW $INTMEM, R4 124 MOVW R4, SPR(IMMR) /* set internal memory base */ 125 MOVW $0xFFFFFF88, R3 126 MOVW R3, 4(R4) /* disable watchdog in sypcr */ 127 MOVW $0x01012440, R3 128 MOVW R3, 0(R4) /* siumcr */ 129 130/* 131 * system initialisation (init and map DRAM) 132 */ 133 MOVW $0, R0 134 MOVW $setSB(SB), R2 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 165/* 166 * cpu 0 167 * relocate bootstrap to our link addresses for text and data 168 * set new PC 169 */ 170cpu0: 171 MOVW $setSB(SB), R2 /* set correct static base register */ 172 MOVW $start(SB), R4 173 MOVW $etext(SB), R5 174 SUB R4, R5 175 CMP R4, R3 /* already there? */ 176 BNE copytext 177 ADD R5, R3 /* start of data image */ 178 BR copydata 179 180copytext: 181 ADD $3, R5 182 SRAW $2, R5 183 MOVW R5, CTR 184 SUB $4, R4 185 SUB $4, R3 186copyt: /* copy text */ 187 MOVWU 4(R3), R5 188 MOVWU R5, 4(R4) 189 BDNZ copyt 190 ADD $4, R3 191 192copydata: 193 /* copy data */ 194 MOVW $bdata(SB), R4 195 CMP R4, R3 /* already there? */ 196 BEQ loadkpc 197 MOVW $edata(SB), R5 198 SUB R4, R5 199 ADD $3, R5 200 SRAW $2, R5 201 MOVW R5, CTR 202 SUB $4, R4 203 SUB $4, R3 204copyd: 205 MOVWU 4(R3), R5 206 MOVWU R5, 4(R4) 207 BDNZ copyd 208 209 /* load correct PC */ 210loadkpc: 211 MOVW $start1(SB), R3 212 MOVW R3, LR 213 BR (LR) 214TEXT start1(SB), $-4 215 MOVW $edata(SB), R3 216 MOVW $end(SB), R4 217 SUBCC R3, R4 218 BLE skipz 219 SRAW $2, R4 220 MOVW R4, CTR 221 SUB $4, R3 222 MOVW $0, R0 223zero: 224 MOVWU R0, 4(R3) 225 BDNZ zero 226skipz: 227 MOVW $mach0(SB), R1 228 MOVW R1, m(SB) 229 ADD $(MACHSIZE-8), R1 230 MOVW $0, R0 231 BL main(SB) 232 BR 0(PC) 233 234TEXT getmsr(SB), $0 235 MOVW MSR, R3 236 RETURN 237 238TEXT putmsr(SB), $0 239 SYNC 240 MOVW R3, MSR 241 WAITMSR 242 RETURN 243 244TEXT eieio(SB), $0 245 EIEIO 246 RETURN 247 248TEXT idle(SB), $0 249 RETURN 250 251TEXT spllo(SB), $0 252 MOVW MSR, R3 253 OR $EE, R3, R4 254 SYNC 255 MOVW R4, MSR 256 WAITMSR 257 RETURN 258 259TEXT splhi(SB), $0 260 MOVW MSR, R3 261 RLWNM $0, R3, $~EE, R4 262 SYNC 263 MOVW R4, MSR 264 WAITMSR 265 RETURN 266 267TEXT splx(SB), $0 268 MOVW MSR, R4 269 RLWMI $0, R3, $EE, R4 270 SYNC 271 MOVW R4, MSR 272 WAITMSR 273 RETURN 274 275TEXT gettbl(SB), $0 276/* MOVW SPR(TBRL), R3 */ 277 WORD $0x7c6c42e6 /* mftbl on 8xx series */ 278 RETURN 279 280TEXT getpvr(SB), $0 281 MOVW SPR(PVR), R3 282 RETURN 283 284TEXT getimmr(SB), $0 285 MOVW SPR(IMMR), R3 286 RETURN 287 288TEXT getdec(SB), $0 289 MOVW SPR(DEC), R3 290 RETURN 291 292TEXT putdec(SB), $0 293 MOVW R3, SPR(DEC) 294 RETURN 295 296/* 297 * save state in Ureg on kernel stack. 298 * enter with R0 giving the PC from the call to `exception' from the vector. 299 * on return, SB (R2) has been set, and R3 has the Ureg* 300 */ 301TEXT saveureg(SB), $-4 302 SUB $UREGSPACE, R1 303 MOVMW R2, 48(R1) /* r2:r31 */ 304 MOVW $setSB(SB), R2 305 MOVW SPR(SAVER1), R4 306 MOVW R4, 44(R1) 307 MOVW SPR(SAVER0), R5 308 MOVW R5, 40(R1) 309 MOVW CTR, R6 310 MOVW R6, 36(R1) 311 MOVW XER, R4 312 MOVW R4, 32(R1) 313 MOVW SPR(SAVECR), R5 /* CR */ 314 MOVW R5, 28(R1) 315 MOVW SPR(SAVELR), R6 /* LR */ 316 MOVW R6, 24(R1) 317 /* pad at 20(R1) */ 318 MOVW SPR(SRR0), R4 319 MOVW R4, 16(R1) /* old PC */ 320 MOVW SPR(SRR1), R5 321 MOVW R5, 12(R1) 322 MOVW R0, 8(R1) /* cause/vector, encoded in LR from vector */ 323 ADD $8, R1, R3 /* Ureg* */ 324 STWCCC R3, (R1) /* break any pending reservations */ 325 MOVW $0, R0 /* R0ISZERO */ 326 BR (LR) 327 328/* 329 * restore state from Ureg 330 * SB (R2) is unusable on return 331 */ 332TEXT restoreureg(SB), $-4 333 MOVMW 48(R1), R2 /* r2:r31 */ 334 /* defer R1 */ 335 MOVW 40(R1), R0 336 MOVW R0, SPR(SAVER0) 337 MOVW 36(R1), R0 338 MOVW R0, CTR 339 MOVW 32(R1), R0 340 MOVW R0, XER 341 MOVW 28(R1), R0 342 MOVW R0, CR /* CR */ 343 MOVW 24(R1), R0 344 MOVW R0, SPR(SAVELR) /* LR */ 345 /* pad, skip */ 346 MOVW 16(R1), R0 347 MOVW R0, SPR(SRR0) /* old PC */ 348 MOVW 12(R1), R0 349 MOVW R0, SPR(SRR1) /* old MSR */ 350 /* cause, skip */ 351 MOVW 44(R1), R1 /* old SP */ 352 BR (LR) 353 354TEXT exception(SB), $-4 355 MOVW R1, SPR(SAVER1) 356 MOVW CR, R0 357 MOVW R0, SPR(SAVECR) 358 MOVW LR, R0 359 BL saveureg(SB) 360 MOVW $0, R0 361 BL trap(SB) 362 BL restoreureg(SB) 363 MOVW SPR(SAVELR), R0 364 MOVW R0, LR 365 MOVW SPR(SAVER0), R0 366 ISYNC 367 RFI 368 369GLOBL mach0+0(SB), $MACHSIZE 370GLOBL m(SB), $4 371