0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #include <linux/sys.h>
0013 #include <asm/unistd.h>
0014 #include <asm/errno.h>
0015 #include <asm/processor.h>
0016 #include <asm/page.h>
0017 #include <asm/cache.h>
0018 #include <asm/ppc_asm.h>
0019 #include <asm/asm-offsets.h>
0020 #include <asm/cputable.h>
0021 #include <asm/thread_info.h>
0022 #include <asm/kexec.h>
0023 #include <asm/ptrace.h>
0024 #include <asm/mmu.h>
0025 #include <asm/export.h>
0026 #include <asm/feature-fixups.h>
0027
0028 .text
0029
0030 _GLOBAL(__bswapdi2)
0031 EXPORT_SYMBOL(__bswapdi2)
0032 srdi r8,r3,32
0033 rlwinm r7,r3,8,0xffffffff
0034 rlwimi r7,r3,24,0,7
0035 rlwinm r9,r8,8,0xffffffff
0036 rlwimi r7,r3,24,16,23
0037 rlwimi r9,r8,24,0,7
0038 rlwimi r9,r8,24,16,23
0039 sldi r7,r7,32
0040 or r3,r7,r9
0041 blr
0042
0043
0044 #ifdef CONFIG_PPC_EARLY_DEBUG_BOOTX
0045 _GLOBAL(rmci_on)
0046 sync
0047 isync
0048 li r3,0x100
0049 rldicl r3,r3,32,0
0050 mfspr r5,SPRN_HID4
0051 or r5,r5,r3
0052 sync
0053 mtspr SPRN_HID4,r5
0054 isync
0055 slbia
0056 isync
0057 sync
0058 blr
0059
0060 _GLOBAL(rmci_off)
0061 sync
0062 isync
0063 li r3,0x100
0064 rldicl r3,r3,32,0
0065 mfspr r5,SPRN_HID4
0066 andc r5,r5,r3
0067 sync
0068 mtspr SPRN_HID4,r5
0069 isync
0070 slbia
0071 isync
0072 sync
0073 blr
0074 #endif
0075
0076 #if defined(CONFIG_PPC_PMAC) || defined(CONFIG_PPC_MAPLE)
0077
0078
0079
0080
0081 _GLOBAL(real_readb)
0082 mfmsr r7
0083 ori r0,r7,MSR_DR
0084 xori r0,r0,MSR_DR
0085 sync
0086 mtmsrd r0
0087 sync
0088 isync
0089 mfspr r6,SPRN_HID4
0090 rldicl r5,r6,32,0
0091 ori r5,r5,0x100
0092 rldicl r5,r5,32,0
0093 sync
0094 mtspr SPRN_HID4,r5
0095 isync
0096 slbia
0097 isync
0098 lbz r3,0(r3)
0099 sync
0100 mtspr SPRN_HID4,r6
0101 isync
0102 slbia
0103 isync
0104 mtmsrd r7
0105 sync
0106 isync
0107 blr
0108
0109
0110
0111
0112 _GLOBAL(real_writeb)
0113 mfmsr r7
0114 ori r0,r7,MSR_DR
0115 xori r0,r0,MSR_DR
0116 sync
0117 mtmsrd r0
0118 sync
0119 isync
0120 mfspr r6,SPRN_HID4
0121 rldicl r5,r6,32,0
0122 ori r5,r5,0x100
0123 rldicl r5,r5,32,0
0124 sync
0125 mtspr SPRN_HID4,r5
0126 isync
0127 slbia
0128 isync
0129 stb r3,0(r4)
0130 sync
0131 mtspr SPRN_HID4,r6
0132 isync
0133 slbia
0134 isync
0135 mtmsrd r7
0136 sync
0137 isync
0138 blr
0139 #endif
0140
0141 #ifdef CONFIG_PPC_PASEMI
0142
0143 _GLOBAL(real_205_readb)
0144 mfmsr r7
0145 ori r0,r7,MSR_DR
0146 xori r0,r0,MSR_DR
0147 sync
0148 mtmsrd r0
0149 sync
0150 isync
0151 LBZCIX(R3,R0,R3)
0152 isync
0153 mtmsrd r7
0154 sync
0155 isync
0156 blr
0157
0158 _GLOBAL(real_205_writeb)
0159 mfmsr r7
0160 ori r0,r7,MSR_DR
0161 xori r0,r0,MSR_DR
0162 sync
0163 mtmsrd r0
0164 sync
0165 isync
0166 STBCIX(R3,R0,R4)
0167 isync
0168 mtmsrd r7
0169 sync
0170 isync
0171 blr
0172
0173 #endif
0174
0175
0176 #if defined(CONFIG_CPU_FREQ_PMAC64) || defined(CONFIG_CPU_FREQ_MAPLE)
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187 _GLOBAL(scom970_read)
0188
0189 mfmsr r4
0190 ori r0,r4,MSR_EE
0191 xori r0,r0,MSR_EE
0192 mtmsrd r0,1
0193
0194
0195
0196
0197
0198 rlwinm r3,r3,8,0,15
0199 ori r3,r3,0x8000
0200
0201
0202 sync
0203 mtspr SPRN_SCOMC,r3
0204 isync
0205 mfspr r3,SPRN_SCOMD
0206 isync
0207 mfspr r0,SPRN_SCOMC
0208 isync
0209
0210
0211
0212
0213
0214
0215
0216
0217 mtmsrd r4,1
0218 blr
0219
0220
0221 _GLOBAL(scom970_write)
0222
0223 mfmsr r5
0224 ori r0,r5,MSR_EE
0225 xori r0,r0,MSR_EE
0226 mtmsrd r0,1
0227
0228
0229
0230
0231
0232 rlwinm r3,r3,8,0,15
0233
0234 sync
0235 mtspr SPRN_SCOMD,r4
0236 isync
0237 mtspr SPRN_SCOMC,r3
0238 isync
0239 mfspr 3,SPRN_SCOMC
0240 isync
0241
0242
0243 mtmsrd r5,1
0244 blr
0245 #endif
0246
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257 _GLOBAL(kexec_wait)
0258 bcl 20,31,$+4
0259 1: mflr r5
0260 addi r5,r5,kexec_flag-1b
0261
0262 99: HMT_LOW
0263 #ifdef CONFIG_KEXEC_CORE
0264 lwz r4,0(r5)
0265 cmpwi 0,r4,0
0266 beq 99b
0267 #ifdef CONFIG_PPC_BOOK3S_64
0268 li r10,0x60
0269 mfmsr r11
0270 clrrdi r11,r11,1
0271 mtsrr0 r10
0272 mtsrr1 r11
0273 rfid
0274 #else
0275
0276 li r4,0
0277 ba 0x60
0278 #endif
0279 #endif
0280
0281
0282
0283
0284 kexec_flag:
0285 .long 0
0286
0287
0288 #ifdef CONFIG_KEXEC_CORE
0289 #ifdef CONFIG_PPC_BOOK3E
0290
0291
0292
0293
0294
0295 kexec_create_tlb:
0296
0297
0298
0299
0300 PPC_TLBILX_ALL(0,R0)
0301 sync
0302 isync
0303
0304 mfspr r10,SPRN_TLB1CFG
0305 andi. r10,r10,TLBnCFG_N_ENTRY
0306 subi r10,r10,1
0307 lis r9,MAS0_TLBSEL(1)@h
0308 rlwimi r9,r10,16,4,15
0309
0310
0311 mtspr SPRN_MAS0,r9
0312
0313 lis r9,(MAS1_VALID|MAS1_IPROT)@h
0314 ori r9,r9,(MAS1_TSIZE(BOOK3E_PAGESZ_1GB))@l
0315 mtspr SPRN_MAS1,r9
0316
0317 LOAD_REG_IMMEDIATE(r9, 0x0 | MAS2_M_IF_NEEDED)
0318 mtspr SPRN_MAS2,r9
0319
0320 LOAD_REG_IMMEDIATE(r9, 0x0 | MAS3_SR | MAS3_SW | MAS3_SX)
0321 mtspr SPRN_MAS3,r9
0322 li r9,0
0323 mtspr SPRN_MAS7,r9
0324
0325 tlbwe
0326 isync
0327 blr
0328 #endif
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339
0340 _GLOBAL(kexec_smp_wait)
0341 lhz r3,PACAHWCPUID(r13)
0342 bl real_mode
0343
0344 li r4,KEXEC_STATE_REAL_MODE
0345 stb r4,PACAKEXECSTATE(r13)
0346
0347 b kexec_wait
0348
0349
0350
0351
0352
0353
0354
0355
0356 real_mode:
0357 #ifdef CONFIG_PPC_BOOK3E
0358
0359 b kexec_create_tlb
0360 #else
0361 1: li r9,MSR_RI
0362 li r10,MSR_DR|MSR_IR
0363 mflr r11
0364 mfmsr r12
0365 andc r9,r12,r9
0366 andc r10,r12,r10
0367
0368 mtmsrd r9,1
0369 mtspr SPRN_SRR1,r10
0370 mtspr SPRN_SRR0,r11
0371 rfid
0372 #endif
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382 _GLOBAL(kexec_sequence)
0383 mflr r0
0384 std r0,16(r1)
0385
0386
0387 stdu r1,THREAD_SIZE-STACK_FRAME_OVERHEAD(r3)
0388 mr r1,r3
0389
0390 li r0,0
0391 std r0,16(r1)
0392
0393
0394
0395
0396 std r31,-8(r1)
0397 std r30,-16(r1)
0398 std r29,-24(r1)
0399 std r28,-32(r1)
0400 std r27,-40(r1)
0401 std r26,-48(r1)
0402 std r25,-56(r1)
0403
0404 stdu r1,-STACK_FRAME_OVERHEAD-64(r1)
0405
0406
0407 mr r31,r3
0408 mr r30,r4
0409 mr r29,r5
0410 mr r28,r6
0411 mr r27,r7
0412 mr r26,r8
0413 lhz r25,PACAHWCPUID(r13)
0414
0415
0416 #ifdef CONFIG_PPC_BOOK3E
0417 wrteei 0
0418 #else
0419 mfmsr r3
0420 rlwinm r3,r3,0,17,15
0421 mtmsrd r3,1
0422 #endif
0423
0424
0425
0426
0427 cmpdi r26,0
0428 beq 1f
0429 bl real_mode
0430 1:
0431
0432 mr r3,r29
0433 bl kexec_copy_flush
0434
0435
0436 cmpdi r26,0
0437 bne 1f
0438 bl real_mode
0439
0440
0441 1: li r3,0
0442 mr r4,r30
0443 li r5,0x100
0444 li r6,0
0445 bl copy_and_flush
0446 1:
0447
0448
0449 mflr r5
0450 li r6,1
0451 stw r6,kexec_flag-1b(5)
0452
0453 cmpdi r27,0
0454 beq 1f
0455
0456
0457 #ifdef CONFIG_PPC64_ELF_ABI_V1
0458 ld r12,0(r27)
0459 #else
0460 mr r12,r27
0461 #endif
0462 mtctr r12
0463 bctrl
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490 1: mr r3,r25 # my phys cpu
0491 mr r4,r30 # start, aka phys mem offset
0492 mtlr 4
0493 li r5,0
0494 blr
0495 #endif