1/* 2 * This file contains the 64-bit "server" PowerPC variant 3 * of the low level exception handling including exception 4 * vectors, exception return, part of the slb and stab 5 * handling and other fixed offset specific things. 6 * 7 * This file is meant to be #included from head_64.S due to 8 * position dependent assembly. 9 * 10 * Most of this originates from head_64.S and thus has the same 11 * copyright history. 12 * 13 */ 14 15#include <asm/hw_irq.h> 16#include <asm/exception-64s.h> 17#include <asm/ptrace.h> 18 19/* 20 * We layout physical memory as follows: 21 * 0x0000 - 0x00ff : Secondary processor spin code 22 * 0x0100 - 0x17ff : pSeries Interrupt prologs 23 * 0x1800 - 0x4000 : interrupt support common interrupt prologs 24 * 0x4000 - 0x5fff : pSeries interrupts with IR=1,DR=1 25 * 0x6000 - 0x6fff : more interrupt support including for IR=1,DR=1 26 * 0x7000 - 0x7fff : FWNMI data area 27 * 0x8000 - 0x8fff : Initial (CPU0) segment table 28 * 0x9000 - : Early init and support code 29 */ 30 /* Syscall routine is used twice, in reloc-off and reloc-on paths */ 31#define SYSCALL_PSERIES_1 \ 32BEGIN_FTR_SECTION \ 33 cmpdi r0,0x1ebe ; \ 34 beq- 1f ; \ 35END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) \ 36 mr r9,r13 ; \ 37 GET_PACA(r13) ; \ 38 mfspr r11,SPRN_SRR0 ; \ 390: 40 41#define SYSCALL_PSERIES_2_RFID \ 42 mfspr r12,SPRN_SRR1 ; \ 43 ld r10,PACAKBASE(r13) ; \ 44 LOAD_HANDLER(r10, system_call_entry) ; \ 45 mtspr SPRN_SRR0,r10 ; \ 46 ld r10,PACAKMSR(r13) ; \ 47 mtspr SPRN_SRR1,r10 ; \ 48 rfid ; \ 49 b . ; /* prevent speculative execution */ 50 51#define SYSCALL_PSERIES_3 \ 52 /* Fast LE/BE switch system call */ \ 531: mfspr r12,SPRN_SRR1 ; \ 54 xori r12,r12,MSR_LE ; \ 55 mtspr SPRN_SRR1,r12 ; \ 56 rfid ; /* return to userspace */ \ 57 b . ; \ 582: mfspr r12,SPRN_SRR1 ; \ 59 andi. r12,r12,MSR_PR ; \ 60 bne 0b ; \ 61 mtspr SPRN_SRR0,r3 ; \ 62 mtspr SPRN_SRR1,r4 ; \ 63 mtspr SPRN_SDR1,r5 ; \ 64 rfid ; \ 65 b . ; /* prevent speculative execution */ 66 67#if defined(CONFIG_RELOCATABLE) 68 /* 69 * We can't branch directly; in the direct case we use LR 70 * and system_call_entry restores LR. (We thus need to move 71 * LR to r10 in the RFID case too.) 72 */ 73#define SYSCALL_PSERIES_2_DIRECT \ 74 mflr r10 ; \ 75 ld r12,PACAKBASE(r13) ; \ 76 LOAD_HANDLER(r12, system_call_entry_direct) ; \ 77 mtctr r12 ; \ 78 mfspr r12,SPRN_SRR1 ; \ 79 /* Re-use of r13... No spare regs to do this */ \ 80 li r13,MSR_RI ; \ 81 mtmsrd r13,1 ; \ 82 GET_PACA(r13) ; /* get r13 back */ \ 83 bctr ; 84#else 85 /* We can branch directly */ 86#define SYSCALL_PSERIES_2_DIRECT \ 87 mfspr r12,SPRN_SRR1 ; \ 88 li r10,MSR_RI ; \ 89 mtmsrd r10,1 ; /* Set RI (EE=0) */ \ 90 b system_call_entry_direct ; 91#endif 92 93/* 94 * This is the start of the interrupt handlers for pSeries 95 * This code runs with relocation off. 96 * Code from here to __end_interrupts gets copied down to real 97 * address 0x100 when we are running a relocatable kernel. 98 * Therefore any relative branches in this section must only 99 * branch to labels in this section. 100 */ 101 . = 0x100 102 .globl __start_interrupts 103__start_interrupts: 104 105 .globl system_reset_pSeries; 106system_reset_pSeries: 107 HMT_MEDIUM_PPR_DISCARD 108 SET_SCRATCH0(r13) 109#ifdef CONFIG_PPC_P7_NAP 110BEGIN_FTR_SECTION 111 /* Running native on arch 2.06 or later, check if we are 112 * waking up from nap. We only handle no state loss and 113 * supervisor state loss. We do -not- handle hypervisor 114 * state loss at this time. 115 */ 116 mfspr r13,SPRN_SRR1 117 rlwinm. r13,r13,47-31,30,31 118 beq 9f 119 120 /* waking up from powersave (nap) state */ 121 cmpwi cr1,r13,2 122 /* Total loss of HV state is fatal, we could try to use the 123 * PIR to locate a PACA, then use an emergency stack etc... 124 * but for now, let's just stay stuck here 125 */ 126 bgt cr1,. 127 GET_PACA(r13) 128 129#ifdef CONFIG_KVM_BOOK3S_64_HV 130 li r0,KVM_HWTHREAD_IN_KERNEL 131 stb r0,HSTATE_HWTHREAD_STATE(r13) 132 /* Order setting hwthread_state vs. testing hwthread_req */ 133 sync 134 lbz r0,HSTATE_HWTHREAD_REQ(r13) 135 cmpwi r0,0 136 beq 1f 137 b kvm_start_guest 1381: 139#endif 140 141 beq cr1,2f 142 b .power7_wakeup_noloss 1432: b .power7_wakeup_loss 1449: 145END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206) 146#endif /* CONFIG_PPC_P7_NAP */ 147 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD, 148 NOTEST, 0x100) 149 150 . = 0x200 151machine_check_pSeries_1: 152 /* This is moved out of line as it can be patched by FW, but 153 * some code path might still want to branch into the original 154 * vector 155 */ 156 HMT_MEDIUM_PPR_DISCARD 157 SET_SCRATCH0(r13) /* save r13 */ 158 EXCEPTION_PROLOG_0(PACA_EXMC) 159 b machine_check_pSeries_0 160 161 . = 0x300 162 .globl data_access_pSeries 163data_access_pSeries: 164 HMT_MEDIUM_PPR_DISCARD 165 SET_SCRATCH0(r13) 166BEGIN_FTR_SECTION 167 b data_access_check_stab 168data_access_not_stab: 169END_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB) 170 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common, EXC_STD, 171 KVMTEST, 0x300) 172 173 . = 0x380 174 .globl data_access_slb_pSeries 175data_access_slb_pSeries: 176 HMT_MEDIUM_PPR_DISCARD 177 SET_SCRATCH0(r13) 178 EXCEPTION_PROLOG_0(PACA_EXSLB) 179 EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x380) 180 std r3,PACA_EXSLB+EX_R3(r13) 181 mfspr r3,SPRN_DAR 182#ifdef __DISABLED__ 183 /* Keep that around for when we re-implement dynamic VSIDs */ 184 cmpdi r3,0 185 bge slb_miss_user_pseries 186#endif /* __DISABLED__ */ 187 mfspr r12,SPRN_SRR1 188#ifndef CONFIG_RELOCATABLE 189 b .slb_miss_realmode 190#else 191 /* 192 * We can't just use a direct branch to .slb_miss_realmode 193 * because the distance from here to there depends on where 194 * the kernel ends up being put. 195 */ 196 mfctr r11 197 ld r10,PACAKBASE(r13) 198 LOAD_HANDLER(r10, .slb_miss_realmode) 199 mtctr r10 200 bctr 201#endif 202 203 STD_EXCEPTION_PSERIES(0x400, 0x400, instruction_access) 204 205 . = 0x480 206 .globl instruction_access_slb_pSeries 207instruction_access_slb_pSeries: 208 HMT_MEDIUM_PPR_DISCARD 209 SET_SCRATCH0(r13) 210 EXCEPTION_PROLOG_0(PACA_EXSLB) 211 EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480) 212 std r3,PACA_EXSLB+EX_R3(r13) 213 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ 214#ifdef __DISABLED__ 215 /* Keep that around for when we re-implement dynamic VSIDs */ 216 cmpdi r3,0 217 bge slb_miss_user_pseries 218#endif /* __DISABLED__ */ 219 mfspr r12,SPRN_SRR1 220#ifndef CONFIG_RELOCATABLE 221 b .slb_miss_realmode 222#else 223 mfctr r11 224 ld r10,PACAKBASE(r13) 225 LOAD_HANDLER(r10, .slb_miss_realmode) 226 mtctr r10 227 bctr 228#endif 229 230 /* We open code these as we can't have a ". = x" (even with 231 * x = "." within a feature section 232 */ 233 . = 0x500; 234 .globl hardware_interrupt_pSeries; 235 .globl hardware_interrupt_hv; 236hardware_interrupt_pSeries: 237hardware_interrupt_hv: 238 BEGIN_FTR_SECTION 239 _MASKABLE_EXCEPTION_PSERIES(0x502, hardware_interrupt, 240 EXC_HV, SOFTEN_TEST_HV) 241 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x502) 242 FTR_SECTION_ELSE 243 _MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt, 244 EXC_STD, SOFTEN_TEST_HV_201) 245 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x500) 246 ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206) 247 248 STD_EXCEPTION_PSERIES(0x600, 0x600, alignment) 249 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x600) 250 251 STD_EXCEPTION_PSERIES(0x700, 0x700, program_check) 252 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x700) 253 254 STD_EXCEPTION_PSERIES(0x800, 0x800, fp_unavailable) 255 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x800) 256 257 MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer) 258 STD_EXCEPTION_HV(0x980, 0x982, hdecrementer) 259 260 MASKABLE_EXCEPTION_PSERIES(0xa00, 0xa00, doorbell_super) 261 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00) 262 263 STD_EXCEPTION_PSERIES(0xb00, 0xb00, trap_0b) 264 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xb00) 265 266 . = 0xc00 267 .globl system_call_pSeries 268system_call_pSeries: 269 HMT_MEDIUM 270#ifdef CONFIG_KVM_BOOK3S_64_HANDLER 271 SET_SCRATCH0(r13) 272 GET_PACA(r13) 273 std r9,PACA_EXGEN+EX_R9(r13) 274 std r10,PACA_EXGEN+EX_R10(r13) 275 mfcr r9 276 KVMTEST(0xc00) 277 GET_SCRATCH0(r13) 278#endif 279 SYSCALL_PSERIES_1 280 SYSCALL_PSERIES_2_RFID 281 SYSCALL_PSERIES_3 282 KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00) 283 284 STD_EXCEPTION_PSERIES(0xd00, 0xd00, single_step) 285 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xd00) 286 287 /* At 0xe??? we have a bunch of hypervisor exceptions, we branch 288 * out of line to handle them 289 */ 290 . = 0xe00 291hv_exception_trampoline: 292 SET_SCRATCH0(r13) 293 EXCEPTION_PROLOG_0(PACA_EXGEN) 294 b h_data_storage_hv 295 296 . = 0xe20 297 SET_SCRATCH0(r13) 298 EXCEPTION_PROLOG_0(PACA_EXGEN) 299 b h_instr_storage_hv 300 301 . = 0xe40 302 SET_SCRATCH0(r13) 303 EXCEPTION_PROLOG_0(PACA_EXGEN) 304 b emulation_assist_hv 305 306 . = 0xe60 307 SET_SCRATCH0(r13) 308 EXCEPTION_PROLOG_0(PACA_EXGEN) 309 b hmi_exception_hv 310 311 . = 0xe80 312 SET_SCRATCH0(r13) 313 EXCEPTION_PROLOG_0(PACA_EXGEN) 314 b h_doorbell_hv 315 316 /* We need to deal with the Altivec unavailable exception 317 * here which is at 0xf20, thus in the middle of the 318 * prolog code of the PerformanceMonitor one. A little 319 * trickery is thus necessary 320 */ 321performance_monitor_pSeries_1: 322 . = 0xf00 323 SET_SCRATCH0(r13) 324 EXCEPTION_PROLOG_0(PACA_EXGEN) 325 b performance_monitor_pSeries 326 327altivec_unavailable_pSeries_1: 328 . = 0xf20 329 SET_SCRATCH0(r13) 330 EXCEPTION_PROLOG_0(PACA_EXGEN) 331 b altivec_unavailable_pSeries 332 333vsx_unavailable_pSeries_1: 334 . = 0xf40 335 SET_SCRATCH0(r13) 336 EXCEPTION_PROLOG_0(PACA_EXGEN) 337 b vsx_unavailable_pSeries 338 339 . = 0xf60 340 SET_SCRATCH0(r13) 341 EXCEPTION_PROLOG_0(PACA_EXGEN) 342 b tm_unavailable_pSeries 343 344#ifdef CONFIG_CBE_RAS 345 STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) 346 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1202) 347#endif /* CONFIG_CBE_RAS */ 348 349 STD_EXCEPTION_PSERIES(0x1300, 0x1300, instruction_breakpoint) 350 KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_STD, 0x1300) 351 352 . = 0x1500 353 .global denorm_exception_hv 354denorm_exception_hv: 355 HMT_MEDIUM_PPR_DISCARD 356 mtspr SPRN_SPRG_HSCRATCH0,r13 357 EXCEPTION_PROLOG_0(PACA_EXGEN) 358 std r11,PACA_EXGEN+EX_R11(r13) 359 std r12,PACA_EXGEN+EX_R12(r13) 360 mfspr r9,SPRN_SPRG_HSCRATCH0 361 std r9,PACA_EXGEN+EX_R13(r13) 362 mfcr r9 363 364#ifdef CONFIG_PPC_DENORMALISATION 365 mfspr r10,SPRN_HSRR1 366 mfspr r11,SPRN_HSRR0 /* save HSRR0 */ 367 andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */ 368 addi r11,r11,-4 /* HSRR0 is next instruction */ 369 bne+ denorm_assist 370#endif 371 372 EXCEPTION_PROLOG_PSERIES_1(denorm_common, EXC_HV) 373 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x1500) 374 375#ifdef CONFIG_CBE_RAS 376 STD_EXCEPTION_HV(0x1600, 0x1602, cbe_maintenance) 377 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1602) 378#endif /* CONFIG_CBE_RAS */ 379 380 STD_EXCEPTION_PSERIES(0x1700, 0x1700, altivec_assist) 381 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x1700) 382 383#ifdef CONFIG_CBE_RAS 384 STD_EXCEPTION_HV(0x1800, 0x1802, cbe_thermal) 385 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1802) 386#else 387 . = 0x1800 388#endif /* CONFIG_CBE_RAS */ 389 390 391/*** Out of line interrupts support ***/ 392 393 .align 7 394 /* moved from 0x200 */ 395machine_check_pSeries: 396 .globl machine_check_fwnmi 397machine_check_fwnmi: 398 HMT_MEDIUM_PPR_DISCARD 399 SET_SCRATCH0(r13) /* save r13 */ 400 EXCEPTION_PROLOG_0(PACA_EXMC) 401machine_check_pSeries_0: 402 EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200) 403 EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD) 404 KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200) 405 406 /* moved from 0x300 */ 407data_access_check_stab: 408 GET_PACA(r13) 409 std r9,PACA_EXSLB+EX_R9(r13) 410 std r10,PACA_EXSLB+EX_R10(r13) 411 mfspr r10,SPRN_DAR 412 mfspr r9,SPRN_DSISR 413 srdi r10,r10,60 414 rlwimi r10,r9,16,0x20 415#ifdef CONFIG_KVM_BOOK3S_PR 416 lbz r9,HSTATE_IN_GUEST(r13) 417 rlwimi r10,r9,8,0x300 418#endif 419 mfcr r9 420 cmpwi r10,0x2c 421 beq do_stab_bolted_pSeries 422 mtcrf 0x80,r9 423 ld r9,PACA_EXSLB+EX_R9(r13) 424 ld r10,PACA_EXSLB+EX_R10(r13) 425 b data_access_not_stab 426do_stab_bolted_pSeries: 427 std r11,PACA_EXSLB+EX_R11(r13) 428 std r12,PACA_EXSLB+EX_R12(r13) 429 GET_SCRATCH0(r10) 430 std r10,PACA_EXSLB+EX_R13(r13) 431 EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD) 432 433 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300) 434 KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380) 435 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x400) 436 KVM_HANDLER_PR(PACA_EXSLB, EXC_STD, 0x480) 437 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x900) 438 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x982) 439 440#ifdef CONFIG_PPC_DENORMALISATION 441denorm_assist: 442BEGIN_FTR_SECTION 443/* 444 * To denormalise we need to move a copy of the register to itself. 445 * For POWER6 do that here for all FP regs. 446 */ 447 mfmsr r10 448 ori r10,r10,(MSR_FP|MSR_FE0|MSR_FE1) 449 xori r10,r10,(MSR_FE0|MSR_FE1) 450 mtmsrd r10 451 sync 452 fmr 0,0 453 fmr 1,1 454 fmr 2,2 455 fmr 3,3 456 fmr 4,4 457 fmr 5,5 458 fmr 6,6 459 fmr 7,7 460 fmr 8,8 461 fmr 9,9 462 fmr 10,10 463 fmr 11,11 464 fmr 12,12 465 fmr 13,13 466 fmr 14,14 467 fmr 15,15 468 fmr 16,16 469 fmr 17,17 470 fmr 18,18 471 fmr 19,19 472 fmr 20,20 473 fmr 21,21 474 fmr 22,22 475 fmr 23,23 476 fmr 24,24 477 fmr 25,25 478 fmr 26,26 479 fmr 27,27 480 fmr 28,28 481 fmr 29,29 482 fmr 30,30 483 fmr 31,31 484FTR_SECTION_ELSE 485/* 486 * To denormalise we need to move a copy of the register to itself. 487 * For POWER7 do that here for the first 32 VSX registers only. 488 */ 489 mfmsr r10 490 oris r10,r10,MSR_VSX@h 491 mtmsrd r10 492 sync 493 XVCPSGNDP(0,0,0) 494 XVCPSGNDP(1,1,1) 495 XVCPSGNDP(2,2,2) 496 XVCPSGNDP(3,3,3) 497 XVCPSGNDP(4,4,4) 498 XVCPSGNDP(5,5,5) 499 XVCPSGNDP(6,6,6) 500 XVCPSGNDP(7,7,7) 501 XVCPSGNDP(8,8,8) 502 XVCPSGNDP(9,9,9) 503 XVCPSGNDP(10,10,10) 504 XVCPSGNDP(11,11,11) 505 XVCPSGNDP(12,12,12) 506 XVCPSGNDP(13,13,13) 507 XVCPSGNDP(14,14,14) 508 XVCPSGNDP(15,15,15) 509 XVCPSGNDP(16,16,16) 510 XVCPSGNDP(17,17,17) 511 XVCPSGNDP(18,18,18) 512 XVCPSGNDP(19,19,19) 513 XVCPSGNDP(20,20,20) 514 XVCPSGNDP(21,21,21) 515 XVCPSGNDP(22,22,22) 516 XVCPSGNDP(23,23,23) 517 XVCPSGNDP(24,24,24) 518 XVCPSGNDP(25,25,25) 519 XVCPSGNDP(26,26,26) 520 XVCPSGNDP(27,27,27) 521 XVCPSGNDP(28,28,28) 522 XVCPSGNDP(29,29,29) 523 XVCPSGNDP(30,30,30) 524 XVCPSGNDP(31,31,31) 525ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206) 526 mtspr SPRN_HSRR0,r11 527 mtcrf 0x80,r9 528 ld r9,PACA_EXGEN+EX_R9(r13) 529 RESTORE_PPR_PACA(PACA_EXGEN, r10) 530 ld r10,PACA_EXGEN+EX_R10(r13) 531 ld r11,PACA_EXGEN+EX_R11(r13) 532 ld r12,PACA_EXGEN+EX_R12(r13) 533 ld r13,PACA_EXGEN+EX_R13(r13) 534 HRFID 535 b . 536#endif 537 538 .align 7 539 /* moved from 0xe00 */ 540 STD_EXCEPTION_HV_OOL(0xe02, h_data_storage) 541 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0xe02) 542 STD_EXCEPTION_HV_OOL(0xe22, h_instr_storage) 543 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe22) 544 STD_EXCEPTION_HV_OOL(0xe42, emulation_assist) 545 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42) 546 STD_EXCEPTION_HV_OOL(0xe62, hmi_exception) /* need to flush cache ? */ 547 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62) 548 MASKABLE_EXCEPTION_HV_OOL(0xe82, h_doorbell) 549 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe82) 550 551 /* moved from 0xf00 */ 552 STD_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) 553 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf00) 554 STD_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) 555 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20) 556 STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) 557 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40) 558 STD_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) 559 KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf60) 560 561/* 562 * An interrupt came in while soft-disabled. We set paca->irq_happened, then: 563 * - If it was a decrementer interrupt, we bump the dec to max and and return. 564 * - If it was a doorbell we return immediately since doorbells are edge 565 * triggered and won't automatically refire. 566 * - else we hard disable and return. 567 * This is called with r10 containing the value to OR to the paca field. 568 */ 569#define MASKED_INTERRUPT(_H) \ 570masked_##_H##interrupt: \ 571 std r11,PACA_EXGEN+EX_R11(r13); \ 572 lbz r11,PACAIRQHAPPENED(r13); \ 573 or r11,r11,r10; \ 574 stb r11,PACAIRQHAPPENED(r13); \ 575 cmpwi r10,PACA_IRQ_DEC; \ 576 bne 1f; \ 577 lis r10,0x7fff; \ 578 ori r10,r10,0xffff; \ 579 mtspr SPRN_DEC,r10; \ 580 b 2f; \ 5811: cmpwi r10,PACA_IRQ_DBELL; \ 582 beq 2f; \ 583 mfspr r10,SPRN_##_H##SRR1; \ 584 rldicl r10,r10,48,1; /* clear MSR_EE */ \ 585 rotldi r10,r10,16; \ 586 mtspr SPRN_##_H##SRR1,r10; \ 5872: mtcrf 0x80,r9; \ 588 ld r9,PACA_EXGEN+EX_R9(r13); \ 589 ld r10,PACA_EXGEN+EX_R10(r13); \ 590 ld r11,PACA_EXGEN+EX_R11(r13); \ 591 GET_SCRATCH0(r13); \ 592 ##_H##rfid; \ 593 b . 594 595 MASKED_INTERRUPT() 596 MASKED_INTERRUPT(H) 597 598/* 599 * Called from arch_local_irq_enable when an interrupt needs 600 * to be resent. r3 contains 0x500, 0x900, 0xa00 or 0xe80 to indicate 601 * which kind of interrupt. MSR:EE is already off. We generate a 602 * stackframe like if a real interrupt had happened. 603 * 604 * Note: While MSR:EE is off, we need to make sure that _MSR 605 * in the generated frame has EE set to 1 or the exception 606 * handler will not properly re-enable them. 607 */ 608_GLOBAL(__replay_interrupt) 609 /* We are going to jump to the exception common code which 610 * will retrieve various register values from the PACA which 611 * we don't give a damn about, so we don't bother storing them. 612 */ 613 mfmsr r12 614 mflr r11 615 mfcr r9 616 ori r12,r12,MSR_EE 617 cmpwi r3,0x900 618 beq decrementer_common 619 cmpwi r3,0x500 620 beq hardware_interrupt_common 621BEGIN_FTR_SECTION 622 cmpwi r3,0xe80 623 beq h_doorbell_common 624FTR_SECTION_ELSE 625 cmpwi r3,0xa00 626 beq doorbell_super_common 627ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE) 628 blr 629 630#ifdef CONFIG_PPC_PSERIES 631/* 632 * Vectors for the FWNMI option. Share common code. 633 */ 634 .globl system_reset_fwnmi 635 .align 7 636system_reset_fwnmi: 637 HMT_MEDIUM_PPR_DISCARD 638 SET_SCRATCH0(r13) /* save r13 */ 639 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD, 640 NOTEST, 0x100) 641 642#endif /* CONFIG_PPC_PSERIES */ 643 644#ifdef __DISABLED__ 645/* 646 * This is used for when the SLB miss handler has to go virtual, 647 * which doesn't happen for now anymore but will once we re-implement 648 * dynamic VSIDs for shared page tables 649 */ 650slb_miss_user_pseries: 651 std r10,PACA_EXGEN+EX_R10(r13) 652 std r11,PACA_EXGEN+EX_R11(r13) 653 std r12,PACA_EXGEN+EX_R12(r13) 654 GET_SCRATCH0(r10) 655 ld r11,PACA_EXSLB+EX_R9(r13) 656 ld r12,PACA_EXSLB+EX_R3(r13) 657 std r10,PACA_EXGEN+EX_R13(r13) 658 std r11,PACA_EXGEN+EX_R9(r13) 659 std r12,PACA_EXGEN+EX_R3(r13) 660 clrrdi r12,r13,32 661 mfmsr r10 662 mfspr r11,SRR0 /* save SRR0 */ 663 ori r12,r12,slb_miss_user_common@l /* virt addr of handler */ 664 ori r10,r10,MSR_IR|MSR_DR|MSR_RI 665 mtspr SRR0,r12 666 mfspr r12,SRR1 /* and SRR1 */ 667 mtspr SRR1,r10 668 rfid 669 b . /* prevent spec. execution */ 670#endif /* __DISABLED__ */ 671 672/* 673 * Code from here down to __end_handlers is invoked from the 674 * exception prologs above. Because the prologs assemble the 675 * addresses of these handlers using the LOAD_HANDLER macro, 676 * which uses an ori instruction, these handlers must be in 677 * the first 64k of the kernel image. 678 */ 679 680/*** Common interrupt handlers ***/ 681 682 STD_EXCEPTION_COMMON(0x100, system_reset, .system_reset_exception) 683 684 /* 685 * Machine check is different because we use a different 686 * save area: PACA_EXMC instead of PACA_EXGEN. 687 */ 688 .align 7 689 .globl machine_check_common 690machine_check_common: 691 EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC) 692 FINISH_NAP 693 DISABLE_INTS 694 bl .save_nvgprs 695 addi r3,r1,STACK_FRAME_OVERHEAD 696 bl .machine_check_exception 697 b .ret_from_except 698 699 STD_EXCEPTION_COMMON_ASYNC(0x500, hardware_interrupt, do_IRQ) 700 STD_EXCEPTION_COMMON_ASYNC(0x900, decrementer, .timer_interrupt) 701 STD_EXCEPTION_COMMON(0x980, hdecrementer, .hdec_interrupt) 702#ifdef CONFIG_PPC_DOORBELL 703 STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .doorbell_exception) 704#else 705 STD_EXCEPTION_COMMON_ASYNC(0xa00, doorbell_super, .unknown_exception) 706#endif 707 STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) 708 STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) 709 STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) 710 STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception) 711 STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) 712#ifdef CONFIG_PPC_DOORBELL 713 STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .doorbell_exception) 714#else 715 STD_EXCEPTION_COMMON_ASYNC(0xe80, h_doorbell, .unknown_exception) 716#endif 717 STD_EXCEPTION_COMMON_ASYNC(0xf00, performance_monitor, .performance_monitor_exception) 718 STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception) 719 STD_EXCEPTION_COMMON(0x1502, denorm, .unknown_exception) 720#ifdef CONFIG_ALTIVEC 721 STD_EXCEPTION_COMMON(0x1700, altivec_assist, .altivec_assist_exception) 722#else 723 STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception) 724#endif 725#ifdef CONFIG_CBE_RAS 726 STD_EXCEPTION_COMMON(0x1200, cbe_system_error, .cbe_system_error_exception) 727 STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, .cbe_maintenance_exception) 728 STD_EXCEPTION_COMMON(0x1800, cbe_thermal, .cbe_thermal_exception) 729#endif /* CONFIG_CBE_RAS */ 730 731 /* 732 * Relocation-on interrupts: A subset of the interrupts can be delivered 733 * with IR=1/DR=1, if AIL==2 and MSR.HV won't be changed by delivering 734 * it. Addresses are the same as the original interrupt addresses, but 735 * offset by 0xc000000000004000. 736 * It's impossible to receive interrupts below 0x300 via this mechanism. 737 * KVM: None of these traps are from the guest ; anything that escalated 738 * to HV=1 from HV=0 is delivered via real mode handlers. 739 */ 740 741 /* 742 * This uses the standard macro, since the original 0x300 vector 743 * only has extra guff for STAB-based processors -- which never 744 * come here. 745 */ 746 STD_RELON_EXCEPTION_PSERIES(0x4300, 0x300, data_access) 747 . = 0x4380 748 .globl data_access_slb_relon_pSeries 749data_access_slb_relon_pSeries: 750 SET_SCRATCH0(r13) 751 EXCEPTION_PROLOG_0(PACA_EXSLB) 752 EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380) 753 std r3,PACA_EXSLB+EX_R3(r13) 754 mfspr r3,SPRN_DAR 755 mfspr r12,SPRN_SRR1 756#ifndef CONFIG_RELOCATABLE 757 b .slb_miss_realmode 758#else 759 /* 760 * We can't just use a direct branch to .slb_miss_realmode 761 * because the distance from here to there depends on where 762 * the kernel ends up being put. 763 */ 764 mfctr r11 765 ld r10,PACAKBASE(r13) 766 LOAD_HANDLER(r10, .slb_miss_realmode) 767 mtctr r10 768 bctr 769#endif 770 771 STD_RELON_EXCEPTION_PSERIES(0x4400, 0x400, instruction_access) 772 . = 0x4480 773 .globl instruction_access_slb_relon_pSeries 774instruction_access_slb_relon_pSeries: 775 SET_SCRATCH0(r13) 776 EXCEPTION_PROLOG_0(PACA_EXSLB) 777 EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x480) 778 std r3,PACA_EXSLB+EX_R3(r13) 779 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ 780 mfspr r12,SPRN_SRR1 781#ifndef CONFIG_RELOCATABLE 782 b .slb_miss_realmode 783#else 784 mfctr r11 785 ld r10,PACAKBASE(r13) 786 LOAD_HANDLER(r10, .slb_miss_realmode) 787 mtctr r10 788 bctr 789#endif 790 791 . = 0x4500 792 .globl hardware_interrupt_relon_pSeries; 793 .globl hardware_interrupt_relon_hv; 794hardware_interrupt_relon_pSeries: 795hardware_interrupt_relon_hv: 796 BEGIN_FTR_SECTION 797 _MASKABLE_RELON_EXCEPTION_PSERIES(0x502, hardware_interrupt, EXC_HV, SOFTEN_TEST_HV) 798 FTR_SECTION_ELSE 799 _MASKABLE_RELON_EXCEPTION_PSERIES(0x500, hardware_interrupt, EXC_STD, SOFTEN_TEST_PR) 800 ALT_FTR_SECTION_END_IFSET(CPU_FTR_ARCH_206) 801 STD_RELON_EXCEPTION_PSERIES(0x4600, 0x600, alignment) 802 STD_RELON_EXCEPTION_PSERIES(0x4700, 0x700, program_check) 803 STD_RELON_EXCEPTION_PSERIES(0x4800, 0x800, fp_unavailable) 804 MASKABLE_RELON_EXCEPTION_PSERIES(0x4900, 0x900, decrementer) 805 STD_RELON_EXCEPTION_HV(0x4980, 0x982, hdecrementer) 806 MASKABLE_RELON_EXCEPTION_PSERIES(0x4a00, 0xa00, doorbell_super) 807 STD_RELON_EXCEPTION_PSERIES(0x4b00, 0xb00, trap_0b) 808 809 . = 0x4c00 810 .globl system_call_relon_pSeries 811system_call_relon_pSeries: 812 HMT_MEDIUM 813 SYSCALL_PSERIES_1 814 SYSCALL_PSERIES_2_DIRECT 815 SYSCALL_PSERIES_3 816 817 STD_RELON_EXCEPTION_PSERIES(0x4d00, 0xd00, single_step) 818 819 . = 0x4e00 820 SET_SCRATCH0(r13) 821 EXCEPTION_PROLOG_0(PACA_EXGEN) 822 b h_data_storage_relon_hv 823 824 . = 0x4e20 825 SET_SCRATCH0(r13) 826 EXCEPTION_PROLOG_0(PACA_EXGEN) 827 b h_instr_storage_relon_hv 828 829 . = 0x4e40 830 SET_SCRATCH0(r13) 831 EXCEPTION_PROLOG_0(PACA_EXGEN) 832 b emulation_assist_relon_hv 833 834 . = 0x4e60 835 SET_SCRATCH0(r13) 836 EXCEPTION_PROLOG_0(PACA_EXGEN) 837 b hmi_exception_relon_hv 838 839 . = 0x4e80 840 SET_SCRATCH0(r13) 841 EXCEPTION_PROLOG_0(PACA_EXGEN) 842 b h_doorbell_relon_hv 843 844performance_monitor_relon_pSeries_1: 845 . = 0x4f00 846 SET_SCRATCH0(r13) 847 EXCEPTION_PROLOG_0(PACA_EXGEN) 848 b performance_monitor_relon_pSeries 849 850altivec_unavailable_relon_pSeries_1: 851 . = 0x4f20 852 SET_SCRATCH0(r13) 853 EXCEPTION_PROLOG_0(PACA_EXGEN) 854 b altivec_unavailable_relon_pSeries 855 856vsx_unavailable_relon_pSeries_1: 857 . = 0x4f40 858 SET_SCRATCH0(r13) 859 EXCEPTION_PROLOG_0(PACA_EXGEN) 860 b vsx_unavailable_relon_pSeries 861 862tm_unavailable_relon_pSeries_1: 863 . = 0x4f60 864 SET_SCRATCH0(r13) 865 EXCEPTION_PROLOG_0(PACA_EXGEN) 866 b tm_unavailable_relon_pSeries 867 868 STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint) 869#ifdef CONFIG_PPC_DENORMALISATION 870 . = 0x5500 871 b denorm_exception_hv 872#endif 873#ifdef CONFIG_HVC_SCOM 874 STD_RELON_EXCEPTION_HV(0x5600, 0x1600, maintence_interrupt) 875 KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0x1600) 876#endif /* CONFIG_HVC_SCOM */ 877 STD_RELON_EXCEPTION_PSERIES(0x5700, 0x1700, altivec_assist) 878 879 /* Other future vectors */ 880 .align 7 881 .globl __end_interrupts 882__end_interrupts: 883 884 .align 7 885system_call_entry_direct: 886#if defined(CONFIG_RELOCATABLE) 887 /* The first level prologue may have used LR to get here, saving 888 * orig in r10. To save hacking/ifdeffing common code, restore here. 889 */ 890 mtlr r10 891#endif 892system_call_entry: 893 b system_call_common 894 895ppc64_runlatch_on_trampoline: 896 b .__ppc64_runlatch_on 897 898/* 899 * Here we have detected that the kernel stack pointer is bad. 900 * R9 contains the saved CR, r13 points to the paca, 901 * r10 contains the (bad) kernel stack pointer, 902 * r11 and r12 contain the saved SRR0 and SRR1. 903 * We switch to using an emergency stack, save the registers there, 904 * and call kernel_bad_stack(), which panics. 905 */ 906bad_stack: 907 ld r1,PACAEMERGSP(r13) 908 subi r1,r1,64+INT_FRAME_SIZE 909 std r9,_CCR(r1) 910 std r10,GPR1(r1) 911 std r11,_NIP(r1) 912 std r12,_MSR(r1) 913 mfspr r11,SPRN_DAR 914 mfspr r12,SPRN_DSISR 915 std r11,_DAR(r1) 916 std r12,_DSISR(r1) 917 mflr r10 918 mfctr r11 919 mfxer r12 920 std r10,_LINK(r1) 921 std r11,_CTR(r1) 922 std r12,_XER(r1) 923 SAVE_GPR(0,r1) 924 SAVE_GPR(2,r1) 925 ld r10,EX_R3(r3) 926 std r10,GPR3(r1) 927 SAVE_GPR(4,r1) 928 SAVE_4GPRS(5,r1) 929 ld r9,EX_R9(r3) 930 ld r10,EX_R10(r3) 931 SAVE_2GPRS(9,r1) 932 ld r9,EX_R11(r3) 933 ld r10,EX_R12(r3) 934 ld r11,EX_R13(r3) 935 std r9,GPR11(r1) 936 std r10,GPR12(r1) 937 std r11,GPR13(r1) 938BEGIN_FTR_SECTION 939 ld r10,EX_CFAR(r3) 940 std r10,ORIG_GPR3(r1) 941END_FTR_SECTION_IFSET(CPU_FTR_CFAR) 942 SAVE_8GPRS(14,r1) 943 SAVE_10GPRS(22,r1) 944 lhz r12,PACA_TRAP_SAVE(r13) 945 std r12,_TRAP(r1) 946 addi r11,r1,INT_FRAME_SIZE 947 std r11,0(r1) 948 li r12,0 949 std r12,0(r11) 950 ld r2,PACATOC(r13) 951 ld r11,exception_marker@toc(r2) 952 std r12,RESULT(r1) 953 std r11,STACK_FRAME_OVERHEAD-16(r1) 9541: addi r3,r1,STACK_FRAME_OVERHEAD 955 bl .kernel_bad_stack 956 b 1b 957 958/* 959 * Here r13 points to the paca, r9 contains the saved CR, 960 * SRR0 and SRR1 are saved in r11 and r12, 961 * r9 - r13 are saved in paca->exgen. 962 */ 963 .align 7 964 .globl data_access_common 965data_access_common: 966 mfspr r10,SPRN_DAR 967 std r10,PACA_EXGEN+EX_DAR(r13) 968 mfspr r10,SPRN_DSISR 969 stw r10,PACA_EXGEN+EX_DSISR(r13) 970 EXCEPTION_PROLOG_COMMON(0x300, PACA_EXGEN) 971 DISABLE_INTS 972 ld r12,_MSR(r1) 973 ld r3,PACA_EXGEN+EX_DAR(r13) 974 lwz r4,PACA_EXGEN+EX_DSISR(r13) 975 li r5,0x300 976 b .do_hash_page /* Try to handle as hpte fault */ 977 978 .align 7 979 .globl h_data_storage_common 980h_data_storage_common: 981 mfspr r10,SPRN_HDAR 982 std r10,PACA_EXGEN+EX_DAR(r13) 983 mfspr r10,SPRN_HDSISR 984 stw r10,PACA_EXGEN+EX_DSISR(r13) 985 EXCEPTION_PROLOG_COMMON(0xe00, PACA_EXGEN) 986 bl .save_nvgprs 987 DISABLE_INTS 988 addi r3,r1,STACK_FRAME_OVERHEAD 989 bl .unknown_exception 990 b .ret_from_except 991 992 .align 7 993 .globl instruction_access_common 994instruction_access_common: 995 EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN) 996 DISABLE_INTS 997 ld r12,_MSR(r1) 998 ld r3,_NIP(r1) 999 andis. r4,r12,0x5820 1000 li r5,0x400 1001 b .do_hash_page /* Try to handle as hpte fault */ 1002 1003 STD_EXCEPTION_COMMON(0xe20, h_instr_storage, .unknown_exception) 1004 1005/* 1006 * Here is the common SLB miss user that is used when going to virtual 1007 * mode for SLB misses, that is currently not used 1008 */ 1009#ifdef __DISABLED__ 1010 .align 7 1011 .globl slb_miss_user_common 1012slb_miss_user_common: 1013 mflr r10 1014 std r3,PACA_EXGEN+EX_DAR(r13) 1015 stw r9,PACA_EXGEN+EX_CCR(r13) 1016 std r10,PACA_EXGEN+EX_LR(r13) 1017 std r11,PACA_EXGEN+EX_SRR0(r13) 1018 bl .slb_allocate_user 1019 1020 ld r10,PACA_EXGEN+EX_LR(r13) 1021 ld r3,PACA_EXGEN+EX_R3(r13) 1022 lwz r9,PACA_EXGEN+EX_CCR(r13) 1023 ld r11,PACA_EXGEN+EX_SRR0(r13) 1024 mtlr r10 1025 beq- slb_miss_fault 1026 1027 andi. r10,r12,MSR_RI /* check for unrecoverable exception */ 1028 beq- unrecov_user_slb 1029 mfmsr r10 1030 1031.machine push 1032.machine "power4" 1033 mtcrf 0x80,r9 1034.machine pop 1035 1036 clrrdi r10,r10,2 /* clear RI before setting SRR0/1 */ 1037 mtmsrd r10,1 1038 1039 mtspr SRR0,r11 1040 mtspr SRR1,r12 1041 1042 ld r9,PACA_EXGEN+EX_R9(r13) 1043 ld r10,PACA_EXGEN+EX_R10(r13) 1044 ld r11,PACA_EXGEN+EX_R11(r13) 1045 ld r12,PACA_EXGEN+EX_R12(r13) 1046 ld r13,PACA_EXGEN+EX_R13(r13) 1047 rfid 1048 b . 1049 1050slb_miss_fault: 1051 EXCEPTION_PROLOG_COMMON(0x380, PACA_EXGEN) 1052 ld r4,PACA_EXGEN+EX_DAR(r13) 1053 li r5,0 1054 std r4,_DAR(r1) 1055 std r5,_DSISR(r1) 1056 b handle_page_fault 1057 1058unrecov_user_slb: 1059 EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN) 1060 DISABLE_INTS 1061 bl .save_nvgprs 10621: addi r3,r1,STACK_FRAME_OVERHEAD 1063 bl .unrecoverable_exception 1064 b 1b 1065 1066#endif /* __DISABLED__ */ 1067 1068 1069/* 1070 * r13 points to the PACA, r9 contains the saved CR, 1071 * r12 contain the saved SRR1, SRR0 is still ready for return 1072 * r3 has the faulting address 1073 * r9 - r13 are saved in paca->exslb. 1074 * r3 is saved in paca->slb_r3 1075 * We assume we aren't going to take any exceptions during this procedure. 1076 */ 1077_GLOBAL(slb_miss_realmode) 1078 mflr r10 1079#ifdef CONFIG_RELOCATABLE 1080 mtctr r11 1081#endif 1082 1083 stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */ 1084 std r10,PACA_EXSLB+EX_LR(r13) /* save LR */ 1085 1086 bl .slb_allocate_realmode 1087 1088 /* All done -- return from exception. */ 1089 1090 ld r10,PACA_EXSLB+EX_LR(r13) 1091 ld r3,PACA_EXSLB+EX_R3(r13) 1092 lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */ 1093 1094 mtlr r10 1095 1096 andi. r10,r12,MSR_RI /* check for unrecoverable exception */ 1097 beq- 2f 1098 1099.machine push 1100.machine "power4" 1101 mtcrf 0x80,r9 1102 mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */ 1103.machine pop 1104 1105 RESTORE_PPR_PACA(PACA_EXSLB, r9) 1106 ld r9,PACA_EXSLB+EX_R9(r13) 1107 ld r10,PACA_EXSLB+EX_R10(r13) 1108 ld r11,PACA_EXSLB+EX_R11(r13) 1109 ld r12,PACA_EXSLB+EX_R12(r13) 1110 ld r13,PACA_EXSLB+EX_R13(r13) 1111 rfid 1112 b . /* prevent speculative execution */ 1113 11142: mfspr r11,SPRN_SRR0 1115 ld r10,PACAKBASE(r13) 1116 LOAD_HANDLER(r10,unrecov_slb) 1117 mtspr SPRN_SRR0,r10 1118 ld r10,PACAKMSR(r13) 1119 mtspr SPRN_SRR1,r10 1120 rfid 1121 b . 1122 1123unrecov_slb: 1124 EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB) 1125 DISABLE_INTS 1126 bl .save_nvgprs 11271: addi r3,r1,STACK_FRAME_OVERHEAD 1128 bl .unrecoverable_exception 1129 b 1b 1130 1131 1132#ifdef CONFIG_PPC_970_NAP 1133power4_fixup_nap: 1134 andc r9,r9,r10 1135 std r9,TI_LOCAL_FLAGS(r11) 1136 ld r10,_LINK(r1) /* make idle task do the */ 1137 std r10,_NIP(r1) /* equivalent of a blr */ 1138 blr 1139#endif 1140 1141 .align 7 1142 .globl alignment_common 1143alignment_common: 1144 mfspr r10,SPRN_DAR 1145 std r10,PACA_EXGEN+EX_DAR(r13) 1146 mfspr r10,SPRN_DSISR 1147 stw r10,PACA_EXGEN+EX_DSISR(r13) 1148 EXCEPTION_PROLOG_COMMON(0x600, PACA_EXGEN) 1149 ld r3,PACA_EXGEN+EX_DAR(r13) 1150 lwz r4,PACA_EXGEN+EX_DSISR(r13) 1151 std r3,_DAR(r1) 1152 std r4,_DSISR(r1) 1153 bl .save_nvgprs 1154 DISABLE_INTS 1155 addi r3,r1,STACK_FRAME_OVERHEAD 1156 bl .alignment_exception 1157 b .ret_from_except 1158 1159 .align 7 1160 .globl program_check_common 1161program_check_common: 1162 EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN) 1163 bl .save_nvgprs 1164 DISABLE_INTS 1165 addi r3,r1,STACK_FRAME_OVERHEAD 1166 bl .program_check_exception 1167 b .ret_from_except 1168 1169 .align 7 1170 .globl fp_unavailable_common 1171fp_unavailable_common: 1172 EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN) 1173 bne 1f /* if from user, just load it up */ 1174 bl .save_nvgprs 1175 DISABLE_INTS 1176 addi r3,r1,STACK_FRAME_OVERHEAD 1177 bl .kernel_fp_unavailable_exception 1178 BUG_OPCODE 11791: 1180#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 1181BEGIN_FTR_SECTION 1182 /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in 1183 * transaction), go do TM stuff 1184 */ 1185 rldicl. r0, r12, (64-MSR_TS_LG), (64-2) 1186 bne- 2f 1187END_FTR_SECTION_IFSET(CPU_FTR_TM) 1188#endif 1189 bl .load_up_fpu 1190 b fast_exception_return 1191#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 11922: /* User process was in a transaction */ 1193 bl .save_nvgprs 1194 DISABLE_INTS 1195 addi r3,r1,STACK_FRAME_OVERHEAD 1196 bl .fp_unavailable_tm 1197 b .ret_from_except 1198#endif 1199 .align 7 1200 .globl altivec_unavailable_common 1201altivec_unavailable_common: 1202 EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN) 1203#ifdef CONFIG_ALTIVEC 1204BEGIN_FTR_SECTION 1205 beq 1f 1206#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 1207 BEGIN_FTR_SECTION_NESTED(69) 1208 /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in 1209 * transaction), go do TM stuff 1210 */ 1211 rldicl. r0, r12, (64-MSR_TS_LG), (64-2) 1212 bne- 2f 1213 END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69) 1214#endif 1215 bl .load_up_altivec 1216 b fast_exception_return 1217#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 12182: /* User process was in a transaction */ 1219 bl .save_nvgprs 1220 DISABLE_INTS 1221 addi r3,r1,STACK_FRAME_OVERHEAD 1222 bl .altivec_unavailable_tm 1223 b .ret_from_except 1224#endif 12251: 1226END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) 1227#endif 1228 bl .save_nvgprs 1229 DISABLE_INTS 1230 addi r3,r1,STACK_FRAME_OVERHEAD 1231 bl .altivec_unavailable_exception 1232 b .ret_from_except 1233 1234 .align 7 1235 .globl vsx_unavailable_common 1236vsx_unavailable_common: 1237 EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN) 1238#ifdef CONFIG_VSX 1239BEGIN_FTR_SECTION 1240 beq 1f 1241#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 1242 BEGIN_FTR_SECTION_NESTED(69) 1243 /* Test if 2 TM state bits are zero. If non-zero (ie. userspace was in 1244 * transaction), go do TM stuff 1245 */ 1246 rldicl. r0, r12, (64-MSR_TS_LG), (64-2) 1247 bne- 2f 1248 END_FTR_SECTION_NESTED(CPU_FTR_TM, CPU_FTR_TM, 69) 1249#endif 1250 b .load_up_vsx 1251#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 12522: /* User process was in a transaction */ 1253 bl .save_nvgprs 1254 DISABLE_INTS 1255 addi r3,r1,STACK_FRAME_OVERHEAD 1256 bl .vsx_unavailable_tm 1257 b .ret_from_except 1258#endif 12591: 1260END_FTR_SECTION_IFSET(CPU_FTR_VSX) 1261#endif 1262 bl .save_nvgprs 1263 DISABLE_INTS 1264 addi r3,r1,STACK_FRAME_OVERHEAD 1265 bl .vsx_unavailable_exception 1266 b .ret_from_except 1267 1268 .align 7 1269 .globl tm_unavailable_common 1270tm_unavailable_common: 1271 EXCEPTION_PROLOG_COMMON(0xf60, PACA_EXGEN) 1272 bl .save_nvgprs 1273 DISABLE_INTS 1274 addi r3,r1,STACK_FRAME_OVERHEAD 1275 bl .tm_unavailable_exception 1276 b .ret_from_except 1277 1278 .align 7 1279 .globl __end_handlers 1280__end_handlers: 1281 1282 /* Equivalents to the above handlers for relocation-on interrupt vectors */ 1283 STD_RELON_EXCEPTION_HV_OOL(0xe00, h_data_storage) 1284 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe00) 1285 STD_RELON_EXCEPTION_HV_OOL(0xe20, h_instr_storage) 1286 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe20) 1287 STD_RELON_EXCEPTION_HV_OOL(0xe40, emulation_assist) 1288 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40) 1289 STD_RELON_EXCEPTION_HV_OOL(0xe60, hmi_exception) 1290 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60) 1291 MASKABLE_RELON_EXCEPTION_HV_OOL(0xe80, h_doorbell) 1292 KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe80) 1293 1294 STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor) 1295 STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable) 1296 STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable) 1297 STD_RELON_EXCEPTION_PSERIES_OOL(0xf60, tm_unavailable) 1298 1299#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) 1300/* 1301 * Data area reserved for FWNMI option. 1302 * This address (0x7000) is fixed by the RPA. 1303 */ 1304 .= 0x7000 1305 .globl fwnmi_data_area 1306fwnmi_data_area: 1307 1308 /* pseries and powernv need to keep the whole page from 1309 * 0x7000 to 0x8000 free for use by the firmware 1310 */ 1311 . = 0x8000 1312#endif /* defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV) */ 1313 1314/* Space for CPU0's segment table */ 1315 .balign 4096 1316 .globl initial_stab 1317initial_stab: 1318 .space 4096 1319 1320#ifdef CONFIG_PPC_POWERNV 1321_GLOBAL(opal_mc_secondary_handler) 1322 HMT_MEDIUM_PPR_DISCARD 1323 SET_SCRATCH0(r13) 1324 GET_PACA(r13) 1325 clrldi r3,r3,2 1326 tovirt(r3,r3) 1327 std r3,PACA_OPAL_MC_EVT(r13) 1328 ld r13,OPAL_MC_SRR0(r3) 1329 mtspr SPRN_SRR0,r13 1330 ld r13,OPAL_MC_SRR1(r3) 1331 mtspr SPRN_SRR1,r13 1332 ld r3,OPAL_MC_GPR3(r3) 1333 GET_SCRATCH0(r13) 1334 b machine_check_pSeries 1335#endif /* CONFIG_PPC_POWERNV */ 1336 1337 1338/* 1339 * Hash table stuff 1340 */ 1341 .align 7 1342_STATIC(do_hash_page) 1343 std r3,_DAR(r1) 1344 std r4,_DSISR(r1) 1345 1346 andis. r0,r4,0xa410 /* weird error? */ 1347 bne- handle_page_fault /* if not, try to insert a HPTE */ 1348 andis. r0,r4,DSISR_DABRMATCH@h 1349 bne- handle_dabr_fault 1350 1351BEGIN_FTR_SECTION 1352 andis. r0,r4,0x0020 /* Is it a segment table fault? */ 1353 bne- do_ste_alloc /* If so handle it */ 1354END_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB) 1355 1356 CURRENT_THREAD_INFO(r11, r1) 1357 lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */ 1358 andis. r0,r0,NMI_MASK@h /* (i.e. an irq when soft-disabled) */ 1359 bne 77f /* then don't call hash_page now */ 1360 /* 1361 * We need to set the _PAGE_USER bit if MSR_PR is set or if we are 1362 * accessing a userspace segment (even from the kernel). We assume 1363 * kernel addresses always have the high bit set. 1364 */ 1365 rlwinm r4,r4,32-25+9,31-9,31-9 /* DSISR_STORE -> _PAGE_RW */ 1366 rotldi r0,r3,15 /* Move high bit into MSR_PR posn */ 1367 orc r0,r12,r0 /* MSR_PR | ~high_bit */ 1368 rlwimi r4,r0,32-13,30,30 /* becomes _PAGE_USER access bit */ 1369 ori r4,r4,1 /* add _PAGE_PRESENT */ 1370 rlwimi r4,r5,22+2,31-2,31-2 /* Set _PAGE_EXEC if trap is 0x400 */ 1371 1372 /* 1373 * r3 contains the faulting address 1374 * r4 contains the required access permissions 1375 * r5 contains the trap number 1376 * 1377 * at return r3 = 0 for success, 1 for page fault, negative for error 1378 */ 1379 bl .hash_page /* build HPTE if possible */ 1380 cmpdi r3,0 /* see if hash_page succeeded */ 1381 1382 /* Success */ 1383 beq fast_exc_return_irq /* Return from exception on success */ 1384 1385 /* Error */ 1386 blt- 13f 1387 1388/* Here we have a page fault that hash_page can't handle. */ 1389handle_page_fault: 139011: ld r4,_DAR(r1) 1391 ld r5,_DSISR(r1) 1392 addi r3,r1,STACK_FRAME_OVERHEAD 1393 bl .do_page_fault 1394 cmpdi r3,0 1395 beq+ 12f 1396 bl .save_nvgprs 1397 mr r5,r3 1398 addi r3,r1,STACK_FRAME_OVERHEAD 1399 lwz r4,_DAR(r1) 1400 bl .bad_page_fault 1401 b .ret_from_except 1402 1403/* We have a data breakpoint exception - handle it */ 1404handle_dabr_fault: 1405 bl .save_nvgprs 1406 ld r4,_DAR(r1) 1407 ld r5,_DSISR(r1) 1408 addi r3,r1,STACK_FRAME_OVERHEAD 1409 bl .do_break 141012: b .ret_from_except_lite 1411 1412 1413/* We have a page fault that hash_page could handle but HV refused 1414 * the PTE insertion 1415 */ 141613: bl .save_nvgprs 1417 mr r5,r3 1418 addi r3,r1,STACK_FRAME_OVERHEAD 1419 ld r4,_DAR(r1) 1420 bl .low_hash_fault 1421 b .ret_from_except 1422 1423/* 1424 * We come here as a result of a DSI at a point where we don't want 1425 * to call hash_page, such as when we are accessing memory (possibly 1426 * user memory) inside a PMU interrupt that occurred while interrupts 1427 * were soft-disabled. We want to invoke the exception handler for 1428 * the access, or panic if there isn't a handler. 1429 */ 143077: bl .save_nvgprs 1431 mr r4,r3 1432 addi r3,r1,STACK_FRAME_OVERHEAD 1433 li r5,SIGSEGV 1434 bl .bad_page_fault 1435 b .ret_from_except 1436 1437 /* here we have a segment miss */ 1438do_ste_alloc: 1439 bl .ste_allocate /* try to insert stab entry */ 1440 cmpdi r3,0 1441 bne- handle_page_fault 1442 b fast_exception_return 1443 1444/* 1445 * r13 points to the PACA, r9 contains the saved CR, 1446 * r11 and r12 contain the saved SRR0 and SRR1. 1447 * r9 - r13 are saved in paca->exslb. 1448 * We assume we aren't going to take any exceptions during this procedure. 1449 * We assume (DAR >> 60) == 0xc. 1450 */ 1451 .align 7 1452_GLOBAL(do_stab_bolted) 1453 stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */ 1454 std r11,PACA_EXSLB+EX_SRR0(r13) /* save SRR0 in exc. frame */ 1455 1456 /* Hash to the primary group */ 1457 ld r10,PACASTABVIRT(r13) 1458 mfspr r11,SPRN_DAR 1459 srdi r11,r11,28 1460 rldimi r10,r11,7,52 /* r10 = first ste of the group */ 1461 1462 /* Calculate VSID */ 1463 /* This is a kernel address, so protovsid = ESID | 1 << 37 */ 1464 li r9,0x1 1465 rldimi r11,r9,(CONTEXT_BITS + USER_ESID_BITS),0 1466 ASM_VSID_SCRAMBLE(r11, r9, 256M) 1467 rldic r9,r11,12,16 /* r9 = vsid << 12 */ 1468 1469 /* Search the primary group for a free entry */ 14701: ld r11,0(r10) /* Test valid bit of the current ste */ 1471 andi. r11,r11,0x80 1472 beq 2f 1473 addi r10,r10,16 1474 andi. r11,r10,0x70 1475 bne 1b 1476 1477 /* Stick for only searching the primary group for now. */ 1478 /* At least for now, we use a very simple random castout scheme */ 1479 /* Use the TB as a random number ; OR in 1 to avoid entry 0 */ 1480 mftb r11 1481 rldic r11,r11,4,57 /* r11 = (r11 << 4) & 0x70 */ 1482 ori r11,r11,0x10 1483 1484 /* r10 currently points to an ste one past the group of interest */ 1485 /* make it point to the randomly selected entry */ 1486 subi r10,r10,128 1487 or r10,r10,r11 /* r10 is the entry to invalidate */ 1488 1489 isync /* mark the entry invalid */ 1490 ld r11,0(r10) 1491 rldicl r11,r11,56,1 /* clear the valid bit */ 1492 rotldi r11,r11,8 1493 std r11,0(r10) 1494 sync 1495 1496 clrrdi r11,r11,28 /* Get the esid part of the ste */ 1497 slbie r11 1498 14992: std r9,8(r10) /* Store the vsid part of the ste */ 1500 eieio 1501 1502 mfspr r11,SPRN_DAR /* Get the new esid */ 1503 clrrdi r11,r11,28 /* Permits a full 32b of ESID */ 1504 ori r11,r11,0x90 /* Turn on valid and kp */ 1505 std r11,0(r10) /* Put new entry back into the stab */ 1506 1507 sync 1508 1509 /* All done -- return from exception. */ 1510 lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */ 1511 ld r11,PACA_EXSLB+EX_SRR0(r13) /* get saved SRR0 */ 1512 1513 andi. r10,r12,MSR_RI 1514 beq- unrecov_slb 1515 1516 mtcrf 0x80,r9 /* restore CR */ 1517 1518 mfmsr r10 1519 clrrdi r10,r10,2 1520 mtmsrd r10,1 1521 1522 mtspr SPRN_SRR0,r11 1523 mtspr SPRN_SRR1,r12 1524 ld r9,PACA_EXSLB+EX_R9(r13) 1525 ld r10,PACA_EXSLB+EX_R10(r13) 1526 ld r11,PACA_EXSLB+EX_R11(r13) 1527 ld r12,PACA_EXSLB+EX_R12(r13) 1528 ld r13,PACA_EXSLB+EX_R13(r13) 1529 rfid 1530 b . /* prevent speculative execution */ 1531