10ebc4cdaSBenjamin Herrenschmidt/* 20ebc4cdaSBenjamin Herrenschmidt * This file contains the 64-bit "server" PowerPC variant 30ebc4cdaSBenjamin Herrenschmidt * of the low level exception handling including exception 40ebc4cdaSBenjamin Herrenschmidt * vectors, exception return, part of the slb and stab 50ebc4cdaSBenjamin Herrenschmidt * handling and other fixed offset specific things. 60ebc4cdaSBenjamin Herrenschmidt * 70ebc4cdaSBenjamin Herrenschmidt * This file is meant to be #included from head_64.S due to 825985edcSLucas De Marchi * position dependent assembly. 90ebc4cdaSBenjamin Herrenschmidt * 100ebc4cdaSBenjamin Herrenschmidt * Most of this originates from head_64.S and thus has the same 110ebc4cdaSBenjamin Herrenschmidt * copyright history. 120ebc4cdaSBenjamin Herrenschmidt * 130ebc4cdaSBenjamin Herrenschmidt */ 140ebc4cdaSBenjamin Herrenschmidt 158aa34ab8SBenjamin Herrenschmidt#include <asm/exception-64s.h> 1646f52210SStephen Rothwell#include <asm/ptrace.h> 178aa34ab8SBenjamin Herrenschmidt 180ebc4cdaSBenjamin Herrenschmidt/* 190ebc4cdaSBenjamin Herrenschmidt * We layout physical memory as follows: 200ebc4cdaSBenjamin Herrenschmidt * 0x0000 - 0x00ff : Secondary processor spin code 210ebc4cdaSBenjamin Herrenschmidt * 0x0100 - 0x2fff : pSeries Interrupt prologs 220ebc4cdaSBenjamin Herrenschmidt * 0x3000 - 0x5fff : interrupt support, iSeries and common interrupt prologs 230ebc4cdaSBenjamin Herrenschmidt * 0x6000 - 0x6fff : Initial (CPU0) segment table 240ebc4cdaSBenjamin Herrenschmidt * 0x7000 - 0x7fff : FWNMI data area 250ebc4cdaSBenjamin Herrenschmidt * 0x8000 - : Early init and support code 260ebc4cdaSBenjamin Herrenschmidt */ 270ebc4cdaSBenjamin Herrenschmidt 280ebc4cdaSBenjamin Herrenschmidt/* 290ebc4cdaSBenjamin Herrenschmidt * This is the start of the interrupt handlers for pSeries 300ebc4cdaSBenjamin Herrenschmidt * This code runs with relocation off. 310ebc4cdaSBenjamin Herrenschmidt * Code from here to __end_interrupts gets copied down to real 320ebc4cdaSBenjamin Herrenschmidt * address 0x100 when we are running a relocatable kernel. 330ebc4cdaSBenjamin Herrenschmidt * Therefore any relative branches in this section must only 340ebc4cdaSBenjamin Herrenschmidt * branch to labels in this section. 350ebc4cdaSBenjamin Herrenschmidt */ 360ebc4cdaSBenjamin Herrenschmidt . = 0x100 370ebc4cdaSBenjamin Herrenschmidt .globl __start_interrupts 380ebc4cdaSBenjamin Herrenschmidt__start_interrupts: 390ebc4cdaSBenjamin Herrenschmidt 40948cf67cSBenjamin Herrenschmidt .globl system_reset_pSeries; 41948cf67cSBenjamin Herrenschmidtsystem_reset_pSeries: 42948cf67cSBenjamin Herrenschmidt HMT_MEDIUM; 43948cf67cSBenjamin Herrenschmidt SET_SCRATCH0(r13) 44948cf67cSBenjamin Herrenschmidt#ifdef CONFIG_PPC_P7_NAP 45948cf67cSBenjamin HerrenschmidtBEGIN_FTR_SECTION 46948cf67cSBenjamin Herrenschmidt /* Running native on arch 2.06 or later, check if we are 47948cf67cSBenjamin Herrenschmidt * waking up from nap. We only handle no state loss and 48948cf67cSBenjamin Herrenschmidt * supervisor state loss. We do -not- handle hypervisor 49948cf67cSBenjamin Herrenschmidt * state loss at this time. 50948cf67cSBenjamin Herrenschmidt */ 51948cf67cSBenjamin Herrenschmidt mfspr r13,SPRN_SRR1 52*371fefd6SPaul Mackerras rlwinm. r13,r13,47-31,30,31 53*371fefd6SPaul Mackerras beq 9f 54*371fefd6SPaul Mackerras 55*371fefd6SPaul Mackerras /* waking up from powersave (nap) state */ 56*371fefd6SPaul Mackerras cmpwi cr1,r13,2 57948cf67cSBenjamin Herrenschmidt /* Total loss of HV state is fatal, we could try to use the 58948cf67cSBenjamin Herrenschmidt * PIR to locate a PACA, then use an emergency stack etc... 59948cf67cSBenjamin Herrenschmidt * but for now, let's just stay stuck here 60948cf67cSBenjamin Herrenschmidt */ 61*371fefd6SPaul Mackerras bgt cr1,. 62*371fefd6SPaul Mackerras GET_PACA(r13) 63*371fefd6SPaul Mackerras 64*371fefd6SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_64_HV 65*371fefd6SPaul Mackerras lbz r0,PACAPROCSTART(r13) 66*371fefd6SPaul Mackerras cmpwi r0,0x80 67*371fefd6SPaul Mackerras bne 1f 68*371fefd6SPaul Mackerras li r0,0 69*371fefd6SPaul Mackerras stb r0,PACAPROCSTART(r13) 70*371fefd6SPaul Mackerras b kvm_start_guest 71*371fefd6SPaul Mackerras1: 72*371fefd6SPaul Mackerras#endif 73*371fefd6SPaul Mackerras 74*371fefd6SPaul Mackerras beq cr1,2f 75*371fefd6SPaul Mackerras b .power7_wakeup_noloss 76*371fefd6SPaul Mackerras2: b .power7_wakeup_loss 77*371fefd6SPaul Mackerras9: 78948cf67cSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_HVMODE_206) 79948cf67cSBenjamin Herrenschmidt#endif /* CONFIG_PPC_P7_NAP */ 80b01c8b54SPaul Mackerras EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD, 81b01c8b54SPaul Mackerras NOTEST, 0x100) 820ebc4cdaSBenjamin Herrenschmidt 830ebc4cdaSBenjamin Herrenschmidt . = 0x200 84b01c8b54SPaul Mackerrasmachine_check_pSeries_1: 85b01c8b54SPaul Mackerras /* This is moved out of line as it can be patched by FW, but 86b01c8b54SPaul Mackerras * some code path might still want to branch into the original 87b01c8b54SPaul Mackerras * vector 88b01c8b54SPaul Mackerras */ 89b01c8b54SPaul Mackerras b machine_check_pSeries 900ebc4cdaSBenjamin Herrenschmidt 910ebc4cdaSBenjamin Herrenschmidt . = 0x300 920ebc4cdaSBenjamin Herrenschmidt .globl data_access_pSeries 930ebc4cdaSBenjamin Herrenschmidtdata_access_pSeries: 940ebc4cdaSBenjamin Herrenschmidt HMT_MEDIUM 95673b189aSPaul Mackerras SET_SCRATCH0(r13) 96b01c8b54SPaul Mackerras#ifndef CONFIG_POWER4_ONLY 970ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION 98b01c8b54SPaul Mackerras b data_access_check_stab 99b01c8b54SPaul Mackerrasdata_access_not_stab: 100b01c8b54SPaul MackerrasEND_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB) 101b01c8b54SPaul Mackerras#endif 102b01c8b54SPaul Mackerras EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, data_access_common, EXC_STD, 103de56a948SPaul Mackerras KVMTEST_PR, 0x300) 1040ebc4cdaSBenjamin Herrenschmidt 1050ebc4cdaSBenjamin Herrenschmidt . = 0x380 1060ebc4cdaSBenjamin Herrenschmidt .globl data_access_slb_pSeries 1070ebc4cdaSBenjamin Herrenschmidtdata_access_slb_pSeries: 1080ebc4cdaSBenjamin Herrenschmidt HMT_MEDIUM 109673b189aSPaul Mackerras SET_SCRATCH0(r13) 110de56a948SPaul Mackerras EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x380) 1110ebc4cdaSBenjamin Herrenschmidt std r3,PACA_EXSLB+EX_R3(r13) 1120ebc4cdaSBenjamin Herrenschmidt mfspr r3,SPRN_DAR 1130ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__ 1140ebc4cdaSBenjamin Herrenschmidt /* Keep that around for when we re-implement dynamic VSIDs */ 1150ebc4cdaSBenjamin Herrenschmidt cmpdi r3,0 1160ebc4cdaSBenjamin Herrenschmidt bge slb_miss_user_pseries 1170ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */ 118b01c8b54SPaul Mackerras mfspr r12,SPRN_SRR1 1190ebc4cdaSBenjamin Herrenschmidt#ifndef CONFIG_RELOCATABLE 1200ebc4cdaSBenjamin Herrenschmidt b .slb_miss_realmode 1210ebc4cdaSBenjamin Herrenschmidt#else 1220ebc4cdaSBenjamin Herrenschmidt /* 1230ebc4cdaSBenjamin Herrenschmidt * We can't just use a direct branch to .slb_miss_realmode 1240ebc4cdaSBenjamin Herrenschmidt * because the distance from here to there depends on where 1250ebc4cdaSBenjamin Herrenschmidt * the kernel ends up being put. 1260ebc4cdaSBenjamin Herrenschmidt */ 1270ebc4cdaSBenjamin Herrenschmidt mfctr r11 1280ebc4cdaSBenjamin Herrenschmidt ld r10,PACAKBASE(r13) 1290ebc4cdaSBenjamin Herrenschmidt LOAD_HANDLER(r10, .slb_miss_realmode) 1300ebc4cdaSBenjamin Herrenschmidt mtctr r10 1310ebc4cdaSBenjamin Herrenschmidt bctr 1320ebc4cdaSBenjamin Herrenschmidt#endif 1330ebc4cdaSBenjamin Herrenschmidt 134b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(0x400, 0x400, instruction_access) 1350ebc4cdaSBenjamin Herrenschmidt 1360ebc4cdaSBenjamin Herrenschmidt . = 0x480 1370ebc4cdaSBenjamin Herrenschmidt .globl instruction_access_slb_pSeries 1380ebc4cdaSBenjamin Herrenschmidtinstruction_access_slb_pSeries: 1390ebc4cdaSBenjamin Herrenschmidt HMT_MEDIUM 140673b189aSPaul Mackerras SET_SCRATCH0(r13) 141de56a948SPaul Mackerras EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480) 1420ebc4cdaSBenjamin Herrenschmidt std r3,PACA_EXSLB+EX_R3(r13) 1430ebc4cdaSBenjamin Herrenschmidt mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ 1440ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__ 1450ebc4cdaSBenjamin Herrenschmidt /* Keep that around for when we re-implement dynamic VSIDs */ 1460ebc4cdaSBenjamin Herrenschmidt cmpdi r3,0 1470ebc4cdaSBenjamin Herrenschmidt bge slb_miss_user_pseries 1480ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */ 149b01c8b54SPaul Mackerras mfspr r12,SPRN_SRR1 1500ebc4cdaSBenjamin Herrenschmidt#ifndef CONFIG_RELOCATABLE 1510ebc4cdaSBenjamin Herrenschmidt b .slb_miss_realmode 1520ebc4cdaSBenjamin Herrenschmidt#else 1530ebc4cdaSBenjamin Herrenschmidt mfctr r11 1540ebc4cdaSBenjamin Herrenschmidt ld r10,PACAKBASE(r13) 1550ebc4cdaSBenjamin Herrenschmidt LOAD_HANDLER(r10, .slb_miss_realmode) 1560ebc4cdaSBenjamin Herrenschmidt mtctr r10 1570ebc4cdaSBenjamin Herrenschmidt bctr 1580ebc4cdaSBenjamin Herrenschmidt#endif 1590ebc4cdaSBenjamin Herrenschmidt 160b3e6b5dfSBenjamin Herrenschmidt /* We open code these as we can't have a ". = x" (even with 161b3e6b5dfSBenjamin Herrenschmidt * x = "." within a feature section 162b3e6b5dfSBenjamin Herrenschmidt */ 163a5d4f3adSBenjamin Herrenschmidt . = 0x500; 164b3e6b5dfSBenjamin Herrenschmidt .globl hardware_interrupt_pSeries; 165b3e6b5dfSBenjamin Herrenschmidt .globl hardware_interrupt_hv; 166a5d4f3adSBenjamin Herrenschmidthardware_interrupt_pSeries: 167b3e6b5dfSBenjamin Herrenschmidthardware_interrupt_hv: 168a5d4f3adSBenjamin Herrenschmidt BEGIN_FTR_SECTION 169b01c8b54SPaul Mackerras _MASKABLE_EXCEPTION_PSERIES(0x502, hardware_interrupt, 170b01c8b54SPaul Mackerras EXC_HV, SOFTEN_TEST_HV) 171b01c8b54SPaul Mackerras KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x502) 172de56a948SPaul Mackerras FTR_SECTION_ELSE 173de56a948SPaul Mackerras _MASKABLE_EXCEPTION_PSERIES(0x500, hardware_interrupt, 174de56a948SPaul Mackerras EXC_STD, SOFTEN_TEST_PR) 175de56a948SPaul Mackerras KVM_HANDLER(PACA_EXGEN, EXC_STD, 0x500) 176de56a948SPaul Mackerras ALT_FTR_SECTION_END_IFSET(CPU_FTR_HVMODE_206) 177a5d4f3adSBenjamin Herrenschmidt 178b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(0x600, 0x600, alignment) 179de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x600) 180b01c8b54SPaul Mackerras 181b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(0x700, 0x700, program_check) 182de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x700) 183b01c8b54SPaul Mackerras 184b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(0x800, 0x800, fp_unavailable) 185de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x800) 186a5d4f3adSBenjamin Herrenschmidt 187b3e6b5dfSBenjamin Herrenschmidt MASKABLE_EXCEPTION_PSERIES(0x900, 0x900, decrementer) 188b01c8b54SPaul Mackerras MASKABLE_EXCEPTION_HV(0x980, 0x982, decrementer) 189a5d4f3adSBenjamin Herrenschmidt 190b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(0xa00, 0xa00, trap_0a) 191de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xa00) 192b01c8b54SPaul Mackerras 193b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(0xb00, 0xb00, trap_0b) 194de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xb00) 1950ebc4cdaSBenjamin Herrenschmidt 1960ebc4cdaSBenjamin Herrenschmidt . = 0xc00 1970ebc4cdaSBenjamin Herrenschmidt .globl system_call_pSeries 1980ebc4cdaSBenjamin Herrenschmidtsystem_call_pSeries: 1990ebc4cdaSBenjamin Herrenschmidt HMT_MEDIUM 200b01c8b54SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_64_HANDLER 201b01c8b54SPaul Mackerras SET_SCRATCH0(r13) 202b01c8b54SPaul Mackerras GET_PACA(r13) 203b01c8b54SPaul Mackerras std r9,PACA_EXGEN+EX_R9(r13) 204b01c8b54SPaul Mackerras std r10,PACA_EXGEN+EX_R10(r13) 205b01c8b54SPaul Mackerras mfcr r9 206b01c8b54SPaul Mackerras KVMTEST(0xc00) 207b01c8b54SPaul Mackerras GET_SCRATCH0(r13) 208b01c8b54SPaul Mackerras#endif 2090ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION 2100ebc4cdaSBenjamin Herrenschmidt cmpdi r0,0x1ebe 2110ebc4cdaSBenjamin Herrenschmidt beq- 1f 2120ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) 2130ebc4cdaSBenjamin Herrenschmidt mr r9,r13 2142dd60d79SBenjamin Herrenschmidt GET_PACA(r13) 2150ebc4cdaSBenjamin Herrenschmidt mfspr r11,SPRN_SRR0 2160ebc4cdaSBenjamin Herrenschmidt mfspr r12,SPRN_SRR1 217f5f0307fSAnton Blanchard ld r10,PACAKBASE(r13) 218f5f0307fSAnton Blanchard LOAD_HANDLER(r10, system_call_entry) 219f5f0307fSAnton Blanchard mtspr SPRN_SRR0,r10 220f5f0307fSAnton Blanchard ld r10,PACAKMSR(r13) 2210ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR1,r10 2220ebc4cdaSBenjamin Herrenschmidt rfid 2230ebc4cdaSBenjamin Herrenschmidt b . /* prevent speculative execution */ 2240ebc4cdaSBenjamin Herrenschmidt 225b01c8b54SPaul Mackerras KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00) 226b01c8b54SPaul Mackerras 2270ebc4cdaSBenjamin Herrenschmidt/* Fast LE/BE switch system call */ 2280ebc4cdaSBenjamin Herrenschmidt1: mfspr r12,SPRN_SRR1 2290ebc4cdaSBenjamin Herrenschmidt xori r12,r12,MSR_LE 2300ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR1,r12 2310ebc4cdaSBenjamin Herrenschmidt rfid /* return to userspace */ 2320ebc4cdaSBenjamin Herrenschmidt b . 2330ebc4cdaSBenjamin Herrenschmidt 234b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(0xd00, 0xd00, single_step) 235de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xd00) 236b3e6b5dfSBenjamin Herrenschmidt 237b3e6b5dfSBenjamin Herrenschmidt /* At 0xe??? we have a bunch of hypervisor exceptions, we branch 238b3e6b5dfSBenjamin Herrenschmidt * out of line to handle them 239b3e6b5dfSBenjamin Herrenschmidt */ 240b3e6b5dfSBenjamin Herrenschmidt . = 0xe00 241b3e6b5dfSBenjamin Herrenschmidt b h_data_storage_hv 242b3e6b5dfSBenjamin Herrenschmidt . = 0xe20 243b3e6b5dfSBenjamin Herrenschmidt b h_instr_storage_hv 244b3e6b5dfSBenjamin Herrenschmidt . = 0xe40 245b3e6b5dfSBenjamin Herrenschmidt b emulation_assist_hv 246b3e6b5dfSBenjamin Herrenschmidt . = 0xe50 247b3e6b5dfSBenjamin Herrenschmidt b hmi_exception_hv 248b3e6b5dfSBenjamin Herrenschmidt . = 0xe60 249b3e6b5dfSBenjamin Herrenschmidt b hmi_exception_hv 2500ebc4cdaSBenjamin Herrenschmidt 2510ebc4cdaSBenjamin Herrenschmidt /* We need to deal with the Altivec unavailable exception 2520ebc4cdaSBenjamin Herrenschmidt * here which is at 0xf20, thus in the middle of the 2530ebc4cdaSBenjamin Herrenschmidt * prolog code of the PerformanceMonitor one. A little 2540ebc4cdaSBenjamin Herrenschmidt * trickery is thus necessary 2550ebc4cdaSBenjamin Herrenschmidt */ 256c86e2eadSAnton Blanchardperformance_monitor_pSeries_1: 2570ebc4cdaSBenjamin Herrenschmidt . = 0xf00 2580ebc4cdaSBenjamin Herrenschmidt b performance_monitor_pSeries 2590ebc4cdaSBenjamin Herrenschmidt 260c86e2eadSAnton Blanchardaltivec_unavailable_pSeries_1: 2610ebc4cdaSBenjamin Herrenschmidt . = 0xf20 2620ebc4cdaSBenjamin Herrenschmidt b altivec_unavailable_pSeries 2630ebc4cdaSBenjamin Herrenschmidt 264c86e2eadSAnton Blanchardvsx_unavailable_pSeries_1: 2650ebc4cdaSBenjamin Herrenschmidt . = 0xf40 2660ebc4cdaSBenjamin Herrenschmidt b vsx_unavailable_pSeries 2670ebc4cdaSBenjamin Herrenschmidt 2680ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS 269b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_HV(0x1200, 0x1202, cbe_system_error) 270de56a948SPaul Mackerras KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_HV, 0x1202) 2710ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */ 272b01c8b54SPaul Mackerras 273b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(0x1300, 0x1300, instruction_breakpoint) 274de56a948SPaul Mackerras KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_STD, 0x1300) 275b01c8b54SPaul Mackerras 2760ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS 277b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_HV(0x1600, 0x1602, cbe_maintenance) 278de56a948SPaul Mackerras KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_HV, 0x1602) 2790ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */ 280b01c8b54SPaul Mackerras 281b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(0x1700, 0x1700, altivec_assist) 282de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x1700) 283b01c8b54SPaul Mackerras 2840ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS 285b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_HV(0x1800, 0x1802, cbe_thermal) 286de56a948SPaul Mackerras KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_HV, 0x1802) 2870ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */ 2880ebc4cdaSBenjamin Herrenschmidt 2890ebc4cdaSBenjamin Herrenschmidt . = 0x3000 2900ebc4cdaSBenjamin Herrenschmidt 291b3e6b5dfSBenjamin Herrenschmidt/*** Out of line interrupts support ***/ 292b3e6b5dfSBenjamin Herrenschmidt 293b01c8b54SPaul Mackerras /* moved from 0x200 */ 294b01c8b54SPaul Mackerrasmachine_check_pSeries: 295b01c8b54SPaul Mackerras .globl machine_check_fwnmi 296b01c8b54SPaul Mackerrasmachine_check_fwnmi: 297b01c8b54SPaul Mackerras HMT_MEDIUM 298b01c8b54SPaul Mackerras SET_SCRATCH0(r13) /* save r13 */ 299b01c8b54SPaul Mackerras EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common, 300b01c8b54SPaul Mackerras EXC_STD, KVMTEST, 0x200) 301b01c8b54SPaul Mackerras KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200) 302b01c8b54SPaul Mackerras 303b01c8b54SPaul Mackerras#ifndef CONFIG_POWER4_ONLY 304b01c8b54SPaul Mackerras /* moved from 0x300 */ 305b01c8b54SPaul Mackerrasdata_access_check_stab: 306b01c8b54SPaul Mackerras GET_PACA(r13) 307b01c8b54SPaul Mackerras std r9,PACA_EXSLB+EX_R9(r13) 308b01c8b54SPaul Mackerras std r10,PACA_EXSLB+EX_R10(r13) 309b01c8b54SPaul Mackerras mfspr r10,SPRN_DAR 310b01c8b54SPaul Mackerras mfspr r9,SPRN_DSISR 311b01c8b54SPaul Mackerras srdi r10,r10,60 312b01c8b54SPaul Mackerras rlwimi r10,r9,16,0x20 313de56a948SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_PR 3143c42bf8aSPaul Mackerras lbz r9,HSTATE_IN_GUEST(r13) 315b01c8b54SPaul Mackerras rlwimi r10,r9,8,0x300 316b01c8b54SPaul Mackerras#endif 317b01c8b54SPaul Mackerras mfcr r9 318b01c8b54SPaul Mackerras cmpwi r10,0x2c 319b01c8b54SPaul Mackerras beq do_stab_bolted_pSeries 320b01c8b54SPaul Mackerras mtcrf 0x80,r9 321b01c8b54SPaul Mackerras ld r9,PACA_EXSLB+EX_R9(r13) 322b01c8b54SPaul Mackerras ld r10,PACA_EXSLB+EX_R10(r13) 323b01c8b54SPaul Mackerras b data_access_not_stab 324b01c8b54SPaul Mackerrasdo_stab_bolted_pSeries: 325b01c8b54SPaul Mackerras std r11,PACA_EXSLB+EX_R11(r13) 326b01c8b54SPaul Mackerras std r12,PACA_EXSLB+EX_R12(r13) 327b01c8b54SPaul Mackerras GET_SCRATCH0(r10) 328b01c8b54SPaul Mackerras std r10,PACA_EXSLB+EX_R13(r13) 329b01c8b54SPaul Mackerras EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD) 330b01c8b54SPaul Mackerras#endif /* CONFIG_POWER4_ONLY */ 331b01c8b54SPaul Mackerras 332de56a948SPaul Mackerras KVM_HANDLER_PR_SKIP(PACA_EXGEN, EXC_STD, 0x300) 333de56a948SPaul Mackerras KVM_HANDLER_PR_SKIP(PACA_EXSLB, EXC_STD, 0x380) 334de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x400) 335de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXSLB, EXC_STD, 0x480) 336de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0x900) 337b01c8b54SPaul Mackerras KVM_HANDLER(PACA_EXGEN, EXC_HV, 0x982) 338b01c8b54SPaul Mackerras 339b01c8b54SPaul Mackerras .align 7 340b3e6b5dfSBenjamin Herrenschmidt /* moved from 0xe00 */ 341b01c8b54SPaul Mackerras STD_EXCEPTION_HV(., 0xe02, h_data_storage) 342b01c8b54SPaul Mackerras KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0xe02) 343b01c8b54SPaul Mackerras STD_EXCEPTION_HV(., 0xe22, h_instr_storage) 344b01c8b54SPaul Mackerras KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe22) 345b01c8b54SPaul Mackerras STD_EXCEPTION_HV(., 0xe42, emulation_assist) 346b01c8b54SPaul Mackerras KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42) 347b01c8b54SPaul Mackerras STD_EXCEPTION_HV(., 0xe62, hmi_exception) /* need to flush cache ? */ 348b01c8b54SPaul Mackerras KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62) 3490ebc4cdaSBenjamin Herrenschmidt 3500ebc4cdaSBenjamin Herrenschmidt /* moved from 0xf00 */ 351b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(., 0xf00, performance_monitor) 352de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf00) 353b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable) 354de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20) 355b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_PSERIES(., 0xf40, vsx_unavailable) 356de56a948SPaul Mackerras KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40) 3570ebc4cdaSBenjamin Herrenschmidt 3580ebc4cdaSBenjamin Herrenschmidt/* 3590ebc4cdaSBenjamin Herrenschmidt * An interrupt came in while soft-disabled; clear EE in SRR1, 3600ebc4cdaSBenjamin Herrenschmidt * clear paca->hard_enabled and return. 3610ebc4cdaSBenjamin Herrenschmidt */ 3620ebc4cdaSBenjamin Herrenschmidtmasked_interrupt: 3630ebc4cdaSBenjamin Herrenschmidt stb r10,PACAHARDIRQEN(r13) 3640ebc4cdaSBenjamin Herrenschmidt mtcrf 0x80,r9 3650ebc4cdaSBenjamin Herrenschmidt ld r9,PACA_EXGEN+EX_R9(r13) 3660ebc4cdaSBenjamin Herrenschmidt mfspr r10,SPRN_SRR1 3670ebc4cdaSBenjamin Herrenschmidt rldicl r10,r10,48,1 /* clear MSR_EE */ 3680ebc4cdaSBenjamin Herrenschmidt rotldi r10,r10,16 3690ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR1,r10 3700ebc4cdaSBenjamin Herrenschmidt ld r10,PACA_EXGEN+EX_R10(r13) 371673b189aSPaul Mackerras GET_SCRATCH0(r13) 3720ebc4cdaSBenjamin Herrenschmidt rfid 3730ebc4cdaSBenjamin Herrenschmidt b . 3740ebc4cdaSBenjamin Herrenschmidt 375a5d4f3adSBenjamin Herrenschmidtmasked_Hinterrupt: 376a5d4f3adSBenjamin Herrenschmidt stb r10,PACAHARDIRQEN(r13) 377a5d4f3adSBenjamin Herrenschmidt mtcrf 0x80,r9 378a5d4f3adSBenjamin Herrenschmidt ld r9,PACA_EXGEN+EX_R9(r13) 379a5d4f3adSBenjamin Herrenschmidt mfspr r10,SPRN_HSRR1 380a5d4f3adSBenjamin Herrenschmidt rldicl r10,r10,48,1 /* clear MSR_EE */ 381a5d4f3adSBenjamin Herrenschmidt rotldi r10,r10,16 382a5d4f3adSBenjamin Herrenschmidt mtspr SPRN_HSRR1,r10 383a5d4f3adSBenjamin Herrenschmidt ld r10,PACA_EXGEN+EX_R10(r13) 384673b189aSPaul Mackerras GET_SCRATCH0(r13) 385a5d4f3adSBenjamin Herrenschmidt hrfid 386a5d4f3adSBenjamin Herrenschmidt b . 387a5d4f3adSBenjamin Herrenschmidt 3880ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_PSERIES 3890ebc4cdaSBenjamin Herrenschmidt/* 3900ebc4cdaSBenjamin Herrenschmidt * Vectors for the FWNMI option. Share common code. 3910ebc4cdaSBenjamin Herrenschmidt */ 3920ebc4cdaSBenjamin Herrenschmidt .globl system_reset_fwnmi 3930ebc4cdaSBenjamin Herrenschmidt .align 7 3940ebc4cdaSBenjamin Herrenschmidtsystem_reset_fwnmi: 3950ebc4cdaSBenjamin Herrenschmidt HMT_MEDIUM 396673b189aSPaul Mackerras SET_SCRATCH0(r13) /* save r13 */ 397b01c8b54SPaul Mackerras EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD, 398b01c8b54SPaul Mackerras NOTEST, 0x100) 3990ebc4cdaSBenjamin Herrenschmidt 4000ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_PSERIES */ 4010ebc4cdaSBenjamin Herrenschmidt 4020ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__ 4030ebc4cdaSBenjamin Herrenschmidt/* 4040ebc4cdaSBenjamin Herrenschmidt * This is used for when the SLB miss handler has to go virtual, 4050ebc4cdaSBenjamin Herrenschmidt * which doesn't happen for now anymore but will once we re-implement 4060ebc4cdaSBenjamin Herrenschmidt * dynamic VSIDs for shared page tables 4070ebc4cdaSBenjamin Herrenschmidt */ 4080ebc4cdaSBenjamin Herrenschmidtslb_miss_user_pseries: 4090ebc4cdaSBenjamin Herrenschmidt std r10,PACA_EXGEN+EX_R10(r13) 4100ebc4cdaSBenjamin Herrenschmidt std r11,PACA_EXGEN+EX_R11(r13) 4110ebc4cdaSBenjamin Herrenschmidt std r12,PACA_EXGEN+EX_R12(r13) 412673b189aSPaul Mackerras GET_SCRATCH0(r10) 4130ebc4cdaSBenjamin Herrenschmidt ld r11,PACA_EXSLB+EX_R9(r13) 4140ebc4cdaSBenjamin Herrenschmidt ld r12,PACA_EXSLB+EX_R3(r13) 4150ebc4cdaSBenjamin Herrenschmidt std r10,PACA_EXGEN+EX_R13(r13) 4160ebc4cdaSBenjamin Herrenschmidt std r11,PACA_EXGEN+EX_R9(r13) 4170ebc4cdaSBenjamin Herrenschmidt std r12,PACA_EXGEN+EX_R3(r13) 4180ebc4cdaSBenjamin Herrenschmidt clrrdi r12,r13,32 4190ebc4cdaSBenjamin Herrenschmidt mfmsr r10 4200ebc4cdaSBenjamin Herrenschmidt mfspr r11,SRR0 /* save SRR0 */ 4210ebc4cdaSBenjamin Herrenschmidt ori r12,r12,slb_miss_user_common@l /* virt addr of handler */ 4220ebc4cdaSBenjamin Herrenschmidt ori r10,r10,MSR_IR|MSR_DR|MSR_RI 4230ebc4cdaSBenjamin Herrenschmidt mtspr SRR0,r12 4240ebc4cdaSBenjamin Herrenschmidt mfspr r12,SRR1 /* and SRR1 */ 4250ebc4cdaSBenjamin Herrenschmidt mtspr SRR1,r10 4260ebc4cdaSBenjamin Herrenschmidt rfid 4270ebc4cdaSBenjamin Herrenschmidt b . /* prevent spec. execution */ 4280ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */ 4290ebc4cdaSBenjamin Herrenschmidt 430a58ddea5SAlexander Graf/* KVM's trampoline code needs to be close to the interrupt handlers */ 431a58ddea5SAlexander Graf 432a58ddea5SAlexander Graf#ifdef CONFIG_KVM_BOOK3S_64_HANDLER 433de56a948SPaul Mackerras#ifdef CONFIG_KVM_BOOK3S_PR 434a58ddea5SAlexander Graf#include "../kvm/book3s_rmhandlers.S" 435de56a948SPaul Mackerras#else 436de56a948SPaul Mackerras#include "../kvm/book3s_hv_rmhandlers.S" 437de56a948SPaul Mackerras#endif 438a58ddea5SAlexander Graf#endif 439a58ddea5SAlexander Graf 4400ebc4cdaSBenjamin Herrenschmidt .align 7 4410ebc4cdaSBenjamin Herrenschmidt .globl __end_interrupts 4420ebc4cdaSBenjamin Herrenschmidt__end_interrupts: 4430ebc4cdaSBenjamin Herrenschmidt 4440ebc4cdaSBenjamin Herrenschmidt/* 4450ebc4cdaSBenjamin Herrenschmidt * Code from here down to __end_handlers is invoked from the 4460ebc4cdaSBenjamin Herrenschmidt * exception prologs above. Because the prologs assemble the 4470ebc4cdaSBenjamin Herrenschmidt * addresses of these handlers using the LOAD_HANDLER macro, 4480ebc4cdaSBenjamin Herrenschmidt * which uses an addi instruction, these handlers must be in 4490ebc4cdaSBenjamin Herrenschmidt * the first 32k of the kernel image. 4500ebc4cdaSBenjamin Herrenschmidt */ 4510ebc4cdaSBenjamin Herrenschmidt 4520ebc4cdaSBenjamin Herrenschmidt/*** Common interrupt handlers ***/ 4530ebc4cdaSBenjamin Herrenschmidt 4540ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0x100, system_reset, .system_reset_exception) 4550ebc4cdaSBenjamin Herrenschmidt 4560ebc4cdaSBenjamin Herrenschmidt /* 4570ebc4cdaSBenjamin Herrenschmidt * Machine check is different because we use a different 4580ebc4cdaSBenjamin Herrenschmidt * save area: PACA_EXMC instead of PACA_EXGEN. 4590ebc4cdaSBenjamin Herrenschmidt */ 4600ebc4cdaSBenjamin Herrenschmidt .align 7 4610ebc4cdaSBenjamin Herrenschmidt .globl machine_check_common 4620ebc4cdaSBenjamin Herrenschmidtmachine_check_common: 4630ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x200, PACA_EXMC) 4640ebc4cdaSBenjamin Herrenschmidt FINISH_NAP 4650ebc4cdaSBenjamin Herrenschmidt DISABLE_INTS 4660ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 4670ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 4680ebc4cdaSBenjamin Herrenschmidt bl .machine_check_exception 4690ebc4cdaSBenjamin Herrenschmidt b .ret_from_except 4700ebc4cdaSBenjamin Herrenschmidt 4710ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON_LITE(0x900, decrementer, .timer_interrupt) 4720ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0xa00, trap_0a, .unknown_exception) 4730ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0xb00, trap_0b, .unknown_exception) 4740ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0xd00, single_step, .single_step_exception) 4750ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0xe00, trap_0e, .unknown_exception) 476b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0xe40, emulation_assist, .program_check_exception) 477b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0xe60, hmi_exception, .unknown_exception) 4780ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON_IDLE(0xf00, performance_monitor, .performance_monitor_exception) 4790ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0x1300, instruction_breakpoint, .instruction_breakpoint_exception) 4800ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_ALTIVEC 4810ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0x1700, altivec_assist, .altivec_assist_exception) 4820ebc4cdaSBenjamin Herrenschmidt#else 4830ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0x1700, altivec_assist, .unknown_exception) 4840ebc4cdaSBenjamin Herrenschmidt#endif 4850ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_CBE_RAS 4860ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0x1200, cbe_system_error, .cbe_system_error_exception) 4870ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0x1600, cbe_maintenance, .cbe_maintenance_exception) 4880ebc4cdaSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0x1800, cbe_thermal, .cbe_thermal_exception) 4890ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_CBE_RAS */ 4900ebc4cdaSBenjamin Herrenschmidt 4910ebc4cdaSBenjamin Herrenschmidt .align 7 4920ebc4cdaSBenjamin Herrenschmidtsystem_call_entry: 4930ebc4cdaSBenjamin Herrenschmidt b system_call_common 4940ebc4cdaSBenjamin Herrenschmidt 4950ebc4cdaSBenjamin Herrenschmidt/* 4960ebc4cdaSBenjamin Herrenschmidt * Here we have detected that the kernel stack pointer is bad. 4970ebc4cdaSBenjamin Herrenschmidt * R9 contains the saved CR, r13 points to the paca, 4980ebc4cdaSBenjamin Herrenschmidt * r10 contains the (bad) kernel stack pointer, 4990ebc4cdaSBenjamin Herrenschmidt * r11 and r12 contain the saved SRR0 and SRR1. 5000ebc4cdaSBenjamin Herrenschmidt * We switch to using an emergency stack, save the registers there, 5010ebc4cdaSBenjamin Herrenschmidt * and call kernel_bad_stack(), which panics. 5020ebc4cdaSBenjamin Herrenschmidt */ 5030ebc4cdaSBenjamin Herrenschmidtbad_stack: 5040ebc4cdaSBenjamin Herrenschmidt ld r1,PACAEMERGSP(r13) 5050ebc4cdaSBenjamin Herrenschmidt subi r1,r1,64+INT_FRAME_SIZE 5060ebc4cdaSBenjamin Herrenschmidt std r9,_CCR(r1) 5070ebc4cdaSBenjamin Herrenschmidt std r10,GPR1(r1) 5080ebc4cdaSBenjamin Herrenschmidt std r11,_NIP(r1) 5090ebc4cdaSBenjamin Herrenschmidt std r12,_MSR(r1) 5100ebc4cdaSBenjamin Herrenschmidt mfspr r11,SPRN_DAR 5110ebc4cdaSBenjamin Herrenschmidt mfspr r12,SPRN_DSISR 5120ebc4cdaSBenjamin Herrenschmidt std r11,_DAR(r1) 5130ebc4cdaSBenjamin Herrenschmidt std r12,_DSISR(r1) 5140ebc4cdaSBenjamin Herrenschmidt mflr r10 5150ebc4cdaSBenjamin Herrenschmidt mfctr r11 5160ebc4cdaSBenjamin Herrenschmidt mfxer r12 5170ebc4cdaSBenjamin Herrenschmidt std r10,_LINK(r1) 5180ebc4cdaSBenjamin Herrenschmidt std r11,_CTR(r1) 5190ebc4cdaSBenjamin Herrenschmidt std r12,_XER(r1) 5200ebc4cdaSBenjamin Herrenschmidt SAVE_GPR(0,r1) 5210ebc4cdaSBenjamin Herrenschmidt SAVE_GPR(2,r1) 5221977b502SPaul Mackerras ld r10,EX_R3(r3) 5231977b502SPaul Mackerras std r10,GPR3(r1) 5241977b502SPaul Mackerras SAVE_GPR(4,r1) 5251977b502SPaul Mackerras SAVE_4GPRS(5,r1) 5261977b502SPaul Mackerras ld r9,EX_R9(r3) 5271977b502SPaul Mackerras ld r10,EX_R10(r3) 5281977b502SPaul Mackerras SAVE_2GPRS(9,r1) 5291977b502SPaul Mackerras ld r9,EX_R11(r3) 5301977b502SPaul Mackerras ld r10,EX_R12(r3) 5311977b502SPaul Mackerras ld r11,EX_R13(r3) 5321977b502SPaul Mackerras std r9,GPR11(r1) 5331977b502SPaul Mackerras std r10,GPR12(r1) 5341977b502SPaul Mackerras std r11,GPR13(r1) 53548404f2eSPaul MackerrasBEGIN_FTR_SECTION 53648404f2eSPaul Mackerras ld r10,EX_CFAR(r3) 53748404f2eSPaul Mackerras std r10,ORIG_GPR3(r1) 53848404f2eSPaul MackerrasEND_FTR_SECTION_IFSET(CPU_FTR_CFAR) 5391977b502SPaul Mackerras SAVE_8GPRS(14,r1) 5400ebc4cdaSBenjamin Herrenschmidt SAVE_10GPRS(22,r1) 5410ebc4cdaSBenjamin Herrenschmidt lhz r12,PACA_TRAP_SAVE(r13) 5420ebc4cdaSBenjamin Herrenschmidt std r12,_TRAP(r1) 5430ebc4cdaSBenjamin Herrenschmidt addi r11,r1,INT_FRAME_SIZE 5440ebc4cdaSBenjamin Herrenschmidt std r11,0(r1) 5450ebc4cdaSBenjamin Herrenschmidt li r12,0 5460ebc4cdaSBenjamin Herrenschmidt std r12,0(r11) 5470ebc4cdaSBenjamin Herrenschmidt ld r2,PACATOC(r13) 5481977b502SPaul Mackerras ld r11,exception_marker@toc(r2) 5491977b502SPaul Mackerras std r12,RESULT(r1) 5501977b502SPaul Mackerras std r11,STACK_FRAME_OVERHEAD-16(r1) 5510ebc4cdaSBenjamin Herrenschmidt1: addi r3,r1,STACK_FRAME_OVERHEAD 5520ebc4cdaSBenjamin Herrenschmidt bl .kernel_bad_stack 5530ebc4cdaSBenjamin Herrenschmidt b 1b 5540ebc4cdaSBenjamin Herrenschmidt 5550ebc4cdaSBenjamin Herrenschmidt/* 5560ebc4cdaSBenjamin Herrenschmidt * Here r13 points to the paca, r9 contains the saved CR, 5570ebc4cdaSBenjamin Herrenschmidt * SRR0 and SRR1 are saved in r11 and r12, 5580ebc4cdaSBenjamin Herrenschmidt * r9 - r13 are saved in paca->exgen. 5590ebc4cdaSBenjamin Herrenschmidt */ 5600ebc4cdaSBenjamin Herrenschmidt .align 7 5610ebc4cdaSBenjamin Herrenschmidt .globl data_access_common 5620ebc4cdaSBenjamin Herrenschmidtdata_access_common: 5630ebc4cdaSBenjamin Herrenschmidt mfspr r10,SPRN_DAR 5640ebc4cdaSBenjamin Herrenschmidt std r10,PACA_EXGEN+EX_DAR(r13) 5650ebc4cdaSBenjamin Herrenschmidt mfspr r10,SPRN_DSISR 5660ebc4cdaSBenjamin Herrenschmidt stw r10,PACA_EXGEN+EX_DSISR(r13) 5670ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x300, PACA_EXGEN) 5680ebc4cdaSBenjamin Herrenschmidt ld r3,PACA_EXGEN+EX_DAR(r13) 5690ebc4cdaSBenjamin Herrenschmidt lwz r4,PACA_EXGEN+EX_DSISR(r13) 5700ebc4cdaSBenjamin Herrenschmidt li r5,0x300 5710ebc4cdaSBenjamin Herrenschmidt b .do_hash_page /* Try to handle as hpte fault */ 5720ebc4cdaSBenjamin Herrenschmidt 5730ebc4cdaSBenjamin Herrenschmidt .align 7 574b3e6b5dfSBenjamin Herrenschmidt .globl h_data_storage_common 575b3e6b5dfSBenjamin Herrenschmidth_data_storage_common: 576b3e6b5dfSBenjamin Herrenschmidt mfspr r10,SPRN_HDAR 577b3e6b5dfSBenjamin Herrenschmidt std r10,PACA_EXGEN+EX_DAR(r13) 578b3e6b5dfSBenjamin Herrenschmidt mfspr r10,SPRN_HDSISR 579b3e6b5dfSBenjamin Herrenschmidt stw r10,PACA_EXGEN+EX_DSISR(r13) 580b3e6b5dfSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0xe00, PACA_EXGEN) 581b3e6b5dfSBenjamin Herrenschmidt bl .save_nvgprs 582b3e6b5dfSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 583b3e6b5dfSBenjamin Herrenschmidt bl .unknown_exception 584b3e6b5dfSBenjamin Herrenschmidt b .ret_from_except 585b3e6b5dfSBenjamin Herrenschmidt 586b3e6b5dfSBenjamin Herrenschmidt .align 7 5870ebc4cdaSBenjamin Herrenschmidt .globl instruction_access_common 5880ebc4cdaSBenjamin Herrenschmidtinstruction_access_common: 5890ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x400, PACA_EXGEN) 5900ebc4cdaSBenjamin Herrenschmidt ld r3,_NIP(r1) 5910ebc4cdaSBenjamin Herrenschmidt andis. r4,r12,0x5820 5920ebc4cdaSBenjamin Herrenschmidt li r5,0x400 5930ebc4cdaSBenjamin Herrenschmidt b .do_hash_page /* Try to handle as hpte fault */ 5940ebc4cdaSBenjamin Herrenschmidt 595b3e6b5dfSBenjamin Herrenschmidt STD_EXCEPTION_COMMON(0xe20, h_instr_storage, .unknown_exception) 596b3e6b5dfSBenjamin Herrenschmidt 5970ebc4cdaSBenjamin Herrenschmidt/* 5980ebc4cdaSBenjamin Herrenschmidt * Here is the common SLB miss user that is used when going to virtual 5990ebc4cdaSBenjamin Herrenschmidt * mode for SLB misses, that is currently not used 6000ebc4cdaSBenjamin Herrenschmidt */ 6010ebc4cdaSBenjamin Herrenschmidt#ifdef __DISABLED__ 6020ebc4cdaSBenjamin Herrenschmidt .align 7 6030ebc4cdaSBenjamin Herrenschmidt .globl slb_miss_user_common 6040ebc4cdaSBenjamin Herrenschmidtslb_miss_user_common: 6050ebc4cdaSBenjamin Herrenschmidt mflr r10 6060ebc4cdaSBenjamin Herrenschmidt std r3,PACA_EXGEN+EX_DAR(r13) 6070ebc4cdaSBenjamin Herrenschmidt stw r9,PACA_EXGEN+EX_CCR(r13) 6080ebc4cdaSBenjamin Herrenschmidt std r10,PACA_EXGEN+EX_LR(r13) 6090ebc4cdaSBenjamin Herrenschmidt std r11,PACA_EXGEN+EX_SRR0(r13) 6100ebc4cdaSBenjamin Herrenschmidt bl .slb_allocate_user 6110ebc4cdaSBenjamin Herrenschmidt 6120ebc4cdaSBenjamin Herrenschmidt ld r10,PACA_EXGEN+EX_LR(r13) 6130ebc4cdaSBenjamin Herrenschmidt ld r3,PACA_EXGEN+EX_R3(r13) 6140ebc4cdaSBenjamin Herrenschmidt lwz r9,PACA_EXGEN+EX_CCR(r13) 6150ebc4cdaSBenjamin Herrenschmidt ld r11,PACA_EXGEN+EX_SRR0(r13) 6160ebc4cdaSBenjamin Herrenschmidt mtlr r10 6170ebc4cdaSBenjamin Herrenschmidt beq- slb_miss_fault 6180ebc4cdaSBenjamin Herrenschmidt 6190ebc4cdaSBenjamin Herrenschmidt andi. r10,r12,MSR_RI /* check for unrecoverable exception */ 6200ebc4cdaSBenjamin Herrenschmidt beq- unrecov_user_slb 6210ebc4cdaSBenjamin Herrenschmidt mfmsr r10 6220ebc4cdaSBenjamin Herrenschmidt 6230ebc4cdaSBenjamin Herrenschmidt.machine push 6240ebc4cdaSBenjamin Herrenschmidt.machine "power4" 6250ebc4cdaSBenjamin Herrenschmidt mtcrf 0x80,r9 6260ebc4cdaSBenjamin Herrenschmidt.machine pop 6270ebc4cdaSBenjamin Herrenschmidt 6280ebc4cdaSBenjamin Herrenschmidt clrrdi r10,r10,2 /* clear RI before setting SRR0/1 */ 6290ebc4cdaSBenjamin Herrenschmidt mtmsrd r10,1 6300ebc4cdaSBenjamin Herrenschmidt 6310ebc4cdaSBenjamin Herrenschmidt mtspr SRR0,r11 6320ebc4cdaSBenjamin Herrenschmidt mtspr SRR1,r12 6330ebc4cdaSBenjamin Herrenschmidt 6340ebc4cdaSBenjamin Herrenschmidt ld r9,PACA_EXGEN+EX_R9(r13) 6350ebc4cdaSBenjamin Herrenschmidt ld r10,PACA_EXGEN+EX_R10(r13) 6360ebc4cdaSBenjamin Herrenschmidt ld r11,PACA_EXGEN+EX_R11(r13) 6370ebc4cdaSBenjamin Herrenschmidt ld r12,PACA_EXGEN+EX_R12(r13) 6380ebc4cdaSBenjamin Herrenschmidt ld r13,PACA_EXGEN+EX_R13(r13) 6390ebc4cdaSBenjamin Herrenschmidt rfid 6400ebc4cdaSBenjamin Herrenschmidt b . 6410ebc4cdaSBenjamin Herrenschmidt 6420ebc4cdaSBenjamin Herrenschmidtslb_miss_fault: 6430ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x380, PACA_EXGEN) 6440ebc4cdaSBenjamin Herrenschmidt ld r4,PACA_EXGEN+EX_DAR(r13) 6450ebc4cdaSBenjamin Herrenschmidt li r5,0 6460ebc4cdaSBenjamin Herrenschmidt std r4,_DAR(r1) 6470ebc4cdaSBenjamin Herrenschmidt std r5,_DSISR(r1) 6480ebc4cdaSBenjamin Herrenschmidt b handle_page_fault 6490ebc4cdaSBenjamin Herrenschmidt 6500ebc4cdaSBenjamin Herrenschmidtunrecov_user_slb: 6510ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x4200, PACA_EXGEN) 6520ebc4cdaSBenjamin Herrenschmidt DISABLE_INTS 6530ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 6540ebc4cdaSBenjamin Herrenschmidt1: addi r3,r1,STACK_FRAME_OVERHEAD 6550ebc4cdaSBenjamin Herrenschmidt bl .unrecoverable_exception 6560ebc4cdaSBenjamin Herrenschmidt b 1b 6570ebc4cdaSBenjamin Herrenschmidt 6580ebc4cdaSBenjamin Herrenschmidt#endif /* __DISABLED__ */ 6590ebc4cdaSBenjamin Herrenschmidt 6600ebc4cdaSBenjamin Herrenschmidt 6610ebc4cdaSBenjamin Herrenschmidt/* 6620ebc4cdaSBenjamin Herrenschmidt * r13 points to the PACA, r9 contains the saved CR, 6630ebc4cdaSBenjamin Herrenschmidt * r12 contain the saved SRR1, SRR0 is still ready for return 6640ebc4cdaSBenjamin Herrenschmidt * r3 has the faulting address 6650ebc4cdaSBenjamin Herrenschmidt * r9 - r13 are saved in paca->exslb. 6660ebc4cdaSBenjamin Herrenschmidt * r3 is saved in paca->slb_r3 6670ebc4cdaSBenjamin Herrenschmidt * We assume we aren't going to take any exceptions during this procedure. 6680ebc4cdaSBenjamin Herrenschmidt */ 6690ebc4cdaSBenjamin Herrenschmidt_GLOBAL(slb_miss_realmode) 6700ebc4cdaSBenjamin Herrenschmidt mflr r10 6710ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_RELOCATABLE 6720ebc4cdaSBenjamin Herrenschmidt mtctr r11 6730ebc4cdaSBenjamin Herrenschmidt#endif 6740ebc4cdaSBenjamin Herrenschmidt 6750ebc4cdaSBenjamin Herrenschmidt stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */ 6760ebc4cdaSBenjamin Herrenschmidt std r10,PACA_EXSLB+EX_LR(r13) /* save LR */ 6770ebc4cdaSBenjamin Herrenschmidt 6780ebc4cdaSBenjamin Herrenschmidt bl .slb_allocate_realmode 6790ebc4cdaSBenjamin Herrenschmidt 6800ebc4cdaSBenjamin Herrenschmidt /* All done -- return from exception. */ 6810ebc4cdaSBenjamin Herrenschmidt 6820ebc4cdaSBenjamin Herrenschmidt ld r10,PACA_EXSLB+EX_LR(r13) 6830ebc4cdaSBenjamin Herrenschmidt ld r3,PACA_EXSLB+EX_R3(r13) 6840ebc4cdaSBenjamin Herrenschmidt lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */ 6850ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES 6860ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION 6870ebc4cdaSBenjamin Herrenschmidt ld r11,PACALPPACAPTR(r13) 6880ebc4cdaSBenjamin Herrenschmidt ld r11,LPPACASRR0(r11) /* get SRR0 value */ 6890ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) 6900ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */ 6910ebc4cdaSBenjamin Herrenschmidt 6920ebc4cdaSBenjamin Herrenschmidt mtlr r10 6930ebc4cdaSBenjamin Herrenschmidt 6940ebc4cdaSBenjamin Herrenschmidt andi. r10,r12,MSR_RI /* check for unrecoverable exception */ 6950ebc4cdaSBenjamin Herrenschmidt beq- 2f 6960ebc4cdaSBenjamin Herrenschmidt 6970ebc4cdaSBenjamin Herrenschmidt.machine push 6980ebc4cdaSBenjamin Herrenschmidt.machine "power4" 6990ebc4cdaSBenjamin Herrenschmidt mtcrf 0x80,r9 7000ebc4cdaSBenjamin Herrenschmidt mtcrf 0x01,r9 /* slb_allocate uses cr0 and cr7 */ 7010ebc4cdaSBenjamin Herrenschmidt.machine pop 7020ebc4cdaSBenjamin Herrenschmidt 7030ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES 7040ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION 7050ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR0,r11 7060ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR1,r12 7070ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) 7080ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */ 7090ebc4cdaSBenjamin Herrenschmidt ld r9,PACA_EXSLB+EX_R9(r13) 7100ebc4cdaSBenjamin Herrenschmidt ld r10,PACA_EXSLB+EX_R10(r13) 7110ebc4cdaSBenjamin Herrenschmidt ld r11,PACA_EXSLB+EX_R11(r13) 7120ebc4cdaSBenjamin Herrenschmidt ld r12,PACA_EXSLB+EX_R12(r13) 7130ebc4cdaSBenjamin Herrenschmidt ld r13,PACA_EXSLB+EX_R13(r13) 7140ebc4cdaSBenjamin Herrenschmidt rfid 7150ebc4cdaSBenjamin Herrenschmidt b . /* prevent speculative execution */ 7160ebc4cdaSBenjamin Herrenschmidt 7170ebc4cdaSBenjamin Herrenschmidt2: 7180ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES 7190ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION 7200ebc4cdaSBenjamin Herrenschmidt b unrecov_slb 7210ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) 7220ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */ 7230ebc4cdaSBenjamin Herrenschmidt mfspr r11,SPRN_SRR0 7240ebc4cdaSBenjamin Herrenschmidt ld r10,PACAKBASE(r13) 7250ebc4cdaSBenjamin Herrenschmidt LOAD_HANDLER(r10,unrecov_slb) 7260ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR0,r10 7270ebc4cdaSBenjamin Herrenschmidt ld r10,PACAKMSR(r13) 7280ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR1,r10 7290ebc4cdaSBenjamin Herrenschmidt rfid 7300ebc4cdaSBenjamin Herrenschmidt b . 7310ebc4cdaSBenjamin Herrenschmidt 7320ebc4cdaSBenjamin Herrenschmidtunrecov_slb: 7330ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x4100, PACA_EXSLB) 7340ebc4cdaSBenjamin Herrenschmidt DISABLE_INTS 7350ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 7360ebc4cdaSBenjamin Herrenschmidt1: addi r3,r1,STACK_FRAME_OVERHEAD 7370ebc4cdaSBenjamin Herrenschmidt bl .unrecoverable_exception 7380ebc4cdaSBenjamin Herrenschmidt b 1b 7390ebc4cdaSBenjamin Herrenschmidt 7400ebc4cdaSBenjamin Herrenschmidt .align 7 7410ebc4cdaSBenjamin Herrenschmidt .globl hardware_interrupt_common 7420ebc4cdaSBenjamin Herrenschmidt .globl hardware_interrupt_entry 7430ebc4cdaSBenjamin Herrenschmidthardware_interrupt_common: 7440ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x500, PACA_EXGEN) 7450ebc4cdaSBenjamin Herrenschmidt FINISH_NAP 7460ebc4cdaSBenjamin Herrenschmidthardware_interrupt_entry: 7470ebc4cdaSBenjamin Herrenschmidt DISABLE_INTS 7480ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION 7490ebc4cdaSBenjamin Herrenschmidt bl .ppc64_runlatch_on 7500ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_CTRL) 7510ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 7520ebc4cdaSBenjamin Herrenschmidt bl .do_IRQ 7530ebc4cdaSBenjamin Herrenschmidt b .ret_from_except_lite 7540ebc4cdaSBenjamin Herrenschmidt 7550ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_970_NAP 7560ebc4cdaSBenjamin Herrenschmidtpower4_fixup_nap: 7570ebc4cdaSBenjamin Herrenschmidt andc r9,r9,r10 7580ebc4cdaSBenjamin Herrenschmidt std r9,TI_LOCAL_FLAGS(r11) 7590ebc4cdaSBenjamin Herrenschmidt ld r10,_LINK(r1) /* make idle task do the */ 7600ebc4cdaSBenjamin Herrenschmidt std r10,_NIP(r1) /* equivalent of a blr */ 7610ebc4cdaSBenjamin Herrenschmidt blr 7620ebc4cdaSBenjamin Herrenschmidt#endif 7630ebc4cdaSBenjamin Herrenschmidt 7640ebc4cdaSBenjamin Herrenschmidt .align 7 7650ebc4cdaSBenjamin Herrenschmidt .globl alignment_common 7660ebc4cdaSBenjamin Herrenschmidtalignment_common: 7670ebc4cdaSBenjamin Herrenschmidt mfspr r10,SPRN_DAR 7680ebc4cdaSBenjamin Herrenschmidt std r10,PACA_EXGEN+EX_DAR(r13) 7690ebc4cdaSBenjamin Herrenschmidt mfspr r10,SPRN_DSISR 7700ebc4cdaSBenjamin Herrenschmidt stw r10,PACA_EXGEN+EX_DSISR(r13) 7710ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x600, PACA_EXGEN) 7720ebc4cdaSBenjamin Herrenschmidt ld r3,PACA_EXGEN+EX_DAR(r13) 7730ebc4cdaSBenjamin Herrenschmidt lwz r4,PACA_EXGEN+EX_DSISR(r13) 7740ebc4cdaSBenjamin Herrenschmidt std r3,_DAR(r1) 7750ebc4cdaSBenjamin Herrenschmidt std r4,_DSISR(r1) 7760ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 7770ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 7780ebc4cdaSBenjamin Herrenschmidt ENABLE_INTS 7790ebc4cdaSBenjamin Herrenschmidt bl .alignment_exception 7800ebc4cdaSBenjamin Herrenschmidt b .ret_from_except 7810ebc4cdaSBenjamin Herrenschmidt 7820ebc4cdaSBenjamin Herrenschmidt .align 7 7830ebc4cdaSBenjamin Herrenschmidt .globl program_check_common 7840ebc4cdaSBenjamin Herrenschmidtprogram_check_common: 7850ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x700, PACA_EXGEN) 7860ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 7870ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 7880ebc4cdaSBenjamin Herrenschmidt ENABLE_INTS 7890ebc4cdaSBenjamin Herrenschmidt bl .program_check_exception 7900ebc4cdaSBenjamin Herrenschmidt b .ret_from_except 7910ebc4cdaSBenjamin Herrenschmidt 7920ebc4cdaSBenjamin Herrenschmidt .align 7 7930ebc4cdaSBenjamin Herrenschmidt .globl fp_unavailable_common 7940ebc4cdaSBenjamin Herrenschmidtfp_unavailable_common: 7950ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0x800, PACA_EXGEN) 7960ebc4cdaSBenjamin Herrenschmidt bne 1f /* if from user, just load it up */ 7970ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 7980ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 7990ebc4cdaSBenjamin Herrenschmidt ENABLE_INTS 8000ebc4cdaSBenjamin Herrenschmidt bl .kernel_fp_unavailable_exception 8010ebc4cdaSBenjamin Herrenschmidt BUG_OPCODE 8020ebc4cdaSBenjamin Herrenschmidt1: bl .load_up_fpu 8030ebc4cdaSBenjamin Herrenschmidt b fast_exception_return 8040ebc4cdaSBenjamin Herrenschmidt 8050ebc4cdaSBenjamin Herrenschmidt .align 7 8060ebc4cdaSBenjamin Herrenschmidt .globl altivec_unavailable_common 8070ebc4cdaSBenjamin Herrenschmidtaltivec_unavailable_common: 8080ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0xf20, PACA_EXGEN) 8090ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_ALTIVEC 8100ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION 8110ebc4cdaSBenjamin Herrenschmidt beq 1f 8120ebc4cdaSBenjamin Herrenschmidt bl .load_up_altivec 8130ebc4cdaSBenjamin Herrenschmidt b fast_exception_return 8140ebc4cdaSBenjamin Herrenschmidt1: 8150ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC) 8160ebc4cdaSBenjamin Herrenschmidt#endif 8170ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 8180ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 8190ebc4cdaSBenjamin Herrenschmidt ENABLE_INTS 8200ebc4cdaSBenjamin Herrenschmidt bl .altivec_unavailable_exception 8210ebc4cdaSBenjamin Herrenschmidt b .ret_from_except 8220ebc4cdaSBenjamin Herrenschmidt 8230ebc4cdaSBenjamin Herrenschmidt .align 7 8240ebc4cdaSBenjamin Herrenschmidt .globl vsx_unavailable_common 8250ebc4cdaSBenjamin Herrenschmidtvsx_unavailable_common: 8260ebc4cdaSBenjamin Herrenschmidt EXCEPTION_PROLOG_COMMON(0xf40, PACA_EXGEN) 8270ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_VSX 8280ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION 8290ebc4cdaSBenjamin Herrenschmidt bne .load_up_vsx 8300ebc4cdaSBenjamin Herrenschmidt1: 8310ebc4cdaSBenjamin HerrenschmidtEND_FTR_SECTION_IFSET(CPU_FTR_VSX) 8320ebc4cdaSBenjamin Herrenschmidt#endif 8330ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 8340ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 8350ebc4cdaSBenjamin Herrenschmidt ENABLE_INTS 8360ebc4cdaSBenjamin Herrenschmidt bl .vsx_unavailable_exception 8370ebc4cdaSBenjamin Herrenschmidt b .ret_from_except 8380ebc4cdaSBenjamin Herrenschmidt 8390ebc4cdaSBenjamin Herrenschmidt .align 7 8400ebc4cdaSBenjamin Herrenschmidt .globl __end_handlers 8410ebc4cdaSBenjamin Herrenschmidt__end_handlers: 8420ebc4cdaSBenjamin Herrenschmidt 8430ebc4cdaSBenjamin Herrenschmidt/* 8440ebc4cdaSBenjamin Herrenschmidt * Return from an exception with minimal checks. 8450ebc4cdaSBenjamin Herrenschmidt * The caller is assumed to have done EXCEPTION_PROLOG_COMMON. 8460ebc4cdaSBenjamin Herrenschmidt * If interrupts have been enabled, or anything has been 8470ebc4cdaSBenjamin Herrenschmidt * done that might have changed the scheduling status of 8480ebc4cdaSBenjamin Herrenschmidt * any task or sent any task a signal, you should use 8490ebc4cdaSBenjamin Herrenschmidt * ret_from_except or ret_from_except_lite instead of this. 8500ebc4cdaSBenjamin Herrenschmidt */ 8510ebc4cdaSBenjamin Herrenschmidtfast_exc_return_irq: /* restores irq state too */ 8520ebc4cdaSBenjamin Herrenschmidt ld r3,SOFTE(r1) 8530ebc4cdaSBenjamin Herrenschmidt TRACE_AND_RESTORE_IRQ(r3); 8540ebc4cdaSBenjamin Herrenschmidt ld r12,_MSR(r1) 8550ebc4cdaSBenjamin Herrenschmidt rldicl r4,r12,49,63 /* get MSR_EE to LSB */ 8560ebc4cdaSBenjamin Herrenschmidt stb r4,PACAHARDIRQEN(r13) /* restore paca->hard_enabled */ 8570ebc4cdaSBenjamin Herrenschmidt b 1f 8580ebc4cdaSBenjamin Herrenschmidt 8590ebc4cdaSBenjamin Herrenschmidt .globl fast_exception_return 8600ebc4cdaSBenjamin Herrenschmidtfast_exception_return: 8610ebc4cdaSBenjamin Herrenschmidt ld r12,_MSR(r1) 8620ebc4cdaSBenjamin Herrenschmidt1: ld r11,_NIP(r1) 8630ebc4cdaSBenjamin Herrenschmidt andi. r3,r12,MSR_RI /* check if RI is set */ 8640ebc4cdaSBenjamin Herrenschmidt beq- unrecov_fer 8650ebc4cdaSBenjamin Herrenschmidt 8660ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_VIRT_CPU_ACCOUNTING 8670ebc4cdaSBenjamin Herrenschmidt andi. r3,r12,MSR_PR 8680ebc4cdaSBenjamin Herrenschmidt beq 2f 8690ebc4cdaSBenjamin Herrenschmidt ACCOUNT_CPU_USER_EXIT(r3, r4) 8700ebc4cdaSBenjamin Herrenschmidt2: 8710ebc4cdaSBenjamin Herrenschmidt#endif 8720ebc4cdaSBenjamin Herrenschmidt 8730ebc4cdaSBenjamin Herrenschmidt ld r3,_CCR(r1) 8740ebc4cdaSBenjamin Herrenschmidt ld r4,_LINK(r1) 8750ebc4cdaSBenjamin Herrenschmidt ld r5,_CTR(r1) 8760ebc4cdaSBenjamin Herrenschmidt ld r6,_XER(r1) 8770ebc4cdaSBenjamin Herrenschmidt mtcr r3 8780ebc4cdaSBenjamin Herrenschmidt mtlr r4 8790ebc4cdaSBenjamin Herrenschmidt mtctr r5 8800ebc4cdaSBenjamin Herrenschmidt mtxer r6 8810ebc4cdaSBenjamin Herrenschmidt REST_GPR(0, r1) 8820ebc4cdaSBenjamin Herrenschmidt REST_8GPRS(2, r1) 8830ebc4cdaSBenjamin Herrenschmidt 8840ebc4cdaSBenjamin Herrenschmidt mfmsr r10 8850ebc4cdaSBenjamin Herrenschmidt rldicl r10,r10,48,1 /* clear EE */ 8860ebc4cdaSBenjamin Herrenschmidt rldicr r10,r10,16,61 /* clear RI (LE is 0 already) */ 8870ebc4cdaSBenjamin Herrenschmidt mtmsrd r10,1 8880ebc4cdaSBenjamin Herrenschmidt 8890ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR1,r12 8900ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR0,r11 8910ebc4cdaSBenjamin Herrenschmidt REST_4GPRS(10, r1) 8920ebc4cdaSBenjamin Herrenschmidt ld r1,GPR1(r1) 8930ebc4cdaSBenjamin Herrenschmidt rfid 8940ebc4cdaSBenjamin Herrenschmidt b . /* prevent speculative execution */ 8950ebc4cdaSBenjamin Herrenschmidt 8960ebc4cdaSBenjamin Herrenschmidtunrecov_fer: 8970ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 8980ebc4cdaSBenjamin Herrenschmidt1: addi r3,r1,STACK_FRAME_OVERHEAD 8990ebc4cdaSBenjamin Herrenschmidt bl .unrecoverable_exception 9000ebc4cdaSBenjamin Herrenschmidt b 1b 9010ebc4cdaSBenjamin Herrenschmidt 9020ebc4cdaSBenjamin Herrenschmidt 9030ebc4cdaSBenjamin Herrenschmidt/* 9040ebc4cdaSBenjamin Herrenschmidt * Hash table stuff 9050ebc4cdaSBenjamin Herrenschmidt */ 9060ebc4cdaSBenjamin Herrenschmidt .align 7 9070ebc4cdaSBenjamin Herrenschmidt_STATIC(do_hash_page) 9080ebc4cdaSBenjamin Herrenschmidt std r3,_DAR(r1) 9090ebc4cdaSBenjamin Herrenschmidt std r4,_DSISR(r1) 9100ebc4cdaSBenjamin Herrenschmidt 9119c7cc234SK.Prasad andis. r0,r4,0xa410 /* weird error? */ 9120ebc4cdaSBenjamin Herrenschmidt bne- handle_page_fault /* if not, try to insert a HPTE */ 9139c7cc234SK.Prasad andis. r0,r4,DSISR_DABRMATCH@h 9149c7cc234SK.Prasad bne- handle_dabr_fault 9159c7cc234SK.Prasad 9160ebc4cdaSBenjamin HerrenschmidtBEGIN_FTR_SECTION 9170ebc4cdaSBenjamin Herrenschmidt andis. r0,r4,0x0020 /* Is it a segment table fault? */ 9180ebc4cdaSBenjamin Herrenschmidt bne- do_ste_alloc /* If so handle it */ 91944ae3ab3SMatt EvansEND_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB) 9200ebc4cdaSBenjamin Herrenschmidt 9219c1e1052SPaul Mackerras clrrdi r11,r1,THREAD_SHIFT 9229c1e1052SPaul Mackerras lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */ 9239c1e1052SPaul Mackerras andis. r0,r0,NMI_MASK@h /* (i.e. an irq when soft-disabled) */ 9249c1e1052SPaul Mackerras bne 77f /* then don't call hash_page now */ 9259c1e1052SPaul Mackerras 9260ebc4cdaSBenjamin Herrenschmidt /* 9270ebc4cdaSBenjamin Herrenschmidt * On iSeries, we soft-disable interrupts here, then 9280ebc4cdaSBenjamin Herrenschmidt * hard-enable interrupts so that the hash_page code can spin on 9290ebc4cdaSBenjamin Herrenschmidt * the hash_table_lock without problems on a shared processor. 9300ebc4cdaSBenjamin Herrenschmidt */ 9310ebc4cdaSBenjamin Herrenschmidt DISABLE_INTS 9320ebc4cdaSBenjamin Herrenschmidt 9330ebc4cdaSBenjamin Herrenschmidt /* 9340ebc4cdaSBenjamin Herrenschmidt * Currently, trace_hardirqs_off() will be called by DISABLE_INTS 9350ebc4cdaSBenjamin Herrenschmidt * and will clobber volatile registers when irq tracing is enabled 9360ebc4cdaSBenjamin Herrenschmidt * so we need to reload them. It may be possible to be smarter here 9370ebc4cdaSBenjamin Herrenschmidt * and move the irq tracing elsewhere but let's keep it simple for 9380ebc4cdaSBenjamin Herrenschmidt * now 9390ebc4cdaSBenjamin Herrenschmidt */ 9400ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_TRACE_IRQFLAGS 9410ebc4cdaSBenjamin Herrenschmidt ld r3,_DAR(r1) 9420ebc4cdaSBenjamin Herrenschmidt ld r4,_DSISR(r1) 9430ebc4cdaSBenjamin Herrenschmidt ld r5,_TRAP(r1) 9440ebc4cdaSBenjamin Herrenschmidt ld r12,_MSR(r1) 9450ebc4cdaSBenjamin Herrenschmidt clrrdi r5,r5,4 9460ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_TRACE_IRQFLAGS */ 9470ebc4cdaSBenjamin Herrenschmidt /* 9480ebc4cdaSBenjamin Herrenschmidt * We need to set the _PAGE_USER bit if MSR_PR is set or if we are 9490ebc4cdaSBenjamin Herrenschmidt * accessing a userspace segment (even from the kernel). We assume 9500ebc4cdaSBenjamin Herrenschmidt * kernel addresses always have the high bit set. 9510ebc4cdaSBenjamin Herrenschmidt */ 9520ebc4cdaSBenjamin Herrenschmidt rlwinm r4,r4,32-25+9,31-9,31-9 /* DSISR_STORE -> _PAGE_RW */ 9530ebc4cdaSBenjamin Herrenschmidt rotldi r0,r3,15 /* Move high bit into MSR_PR posn */ 9540ebc4cdaSBenjamin Herrenschmidt orc r0,r12,r0 /* MSR_PR | ~high_bit */ 9550ebc4cdaSBenjamin Herrenschmidt rlwimi r4,r0,32-13,30,30 /* becomes _PAGE_USER access bit */ 9560ebc4cdaSBenjamin Herrenschmidt ori r4,r4,1 /* add _PAGE_PRESENT */ 9570ebc4cdaSBenjamin Herrenschmidt rlwimi r4,r5,22+2,31-2,31-2 /* Set _PAGE_EXEC if trap is 0x400 */ 9580ebc4cdaSBenjamin Herrenschmidt 9590ebc4cdaSBenjamin Herrenschmidt /* 9600ebc4cdaSBenjamin Herrenschmidt * r3 contains the faulting address 9610ebc4cdaSBenjamin Herrenschmidt * r4 contains the required access permissions 9620ebc4cdaSBenjamin Herrenschmidt * r5 contains the trap number 9630ebc4cdaSBenjamin Herrenschmidt * 9640ebc4cdaSBenjamin Herrenschmidt * at return r3 = 0 for success 9650ebc4cdaSBenjamin Herrenschmidt */ 9660ebc4cdaSBenjamin Herrenschmidt bl .hash_page /* build HPTE if possible */ 9670ebc4cdaSBenjamin Herrenschmidt cmpdi r3,0 /* see if hash_page succeeded */ 9680ebc4cdaSBenjamin Herrenschmidt 9690ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION 9700ebc4cdaSBenjamin Herrenschmidt /* 9710ebc4cdaSBenjamin Herrenschmidt * If we had interrupts soft-enabled at the point where the 9720ebc4cdaSBenjamin Herrenschmidt * DSI/ISI occurred, and an interrupt came in during hash_page, 9730ebc4cdaSBenjamin Herrenschmidt * handle it now. 9740ebc4cdaSBenjamin Herrenschmidt * We jump to ret_from_except_lite rather than fast_exception_return 9750ebc4cdaSBenjamin Herrenschmidt * because ret_from_except_lite will check for and handle pending 9760ebc4cdaSBenjamin Herrenschmidt * interrupts if necessary. 9770ebc4cdaSBenjamin Herrenschmidt */ 9780ebc4cdaSBenjamin Herrenschmidt beq 13f 9790ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFSET(FW_FEATURE_ISERIES) 9800ebc4cdaSBenjamin Herrenschmidt 9810ebc4cdaSBenjamin HerrenschmidtBEGIN_FW_FTR_SECTION 9820ebc4cdaSBenjamin Herrenschmidt /* 9830ebc4cdaSBenjamin Herrenschmidt * Here we have interrupts hard-disabled, so it is sufficient 9840ebc4cdaSBenjamin Herrenschmidt * to restore paca->{soft,hard}_enable and get out. 9850ebc4cdaSBenjamin Herrenschmidt */ 9860ebc4cdaSBenjamin Herrenschmidt beq fast_exc_return_irq /* Return from exception on success */ 9870ebc4cdaSBenjamin HerrenschmidtEND_FW_FTR_SECTION_IFCLR(FW_FEATURE_ISERIES) 9880ebc4cdaSBenjamin Herrenschmidt 9890ebc4cdaSBenjamin Herrenschmidt /* For a hash failure, we don't bother re-enabling interrupts */ 9900ebc4cdaSBenjamin Herrenschmidt ble- 12f 9910ebc4cdaSBenjamin Herrenschmidt 9920ebc4cdaSBenjamin Herrenschmidt /* 9930ebc4cdaSBenjamin Herrenschmidt * hash_page couldn't handle it, set soft interrupt enable back 994df9ee292SDavid Howells * to what it was before the trap. Note that .arch_local_irq_restore 9950ebc4cdaSBenjamin Herrenschmidt * handles any interrupts pending at this point. 9960ebc4cdaSBenjamin Herrenschmidt */ 9970ebc4cdaSBenjamin Herrenschmidt ld r3,SOFTE(r1) 9980ebc4cdaSBenjamin Herrenschmidt TRACE_AND_RESTORE_IRQ_PARTIAL(r3, 11f) 999df9ee292SDavid Howells bl .arch_local_irq_restore 10000ebc4cdaSBenjamin Herrenschmidt b 11f 10010ebc4cdaSBenjamin Herrenschmidt 10029c7cc234SK.Prasad/* We have a data breakpoint exception - handle it */ 10039c7cc234SK.Prasadhandle_dabr_fault: 10045aae8a53SK.Prasad bl .save_nvgprs 10059c7cc234SK.Prasad ld r4,_DAR(r1) 10069c7cc234SK.Prasad ld r5,_DSISR(r1) 10079c7cc234SK.Prasad addi r3,r1,STACK_FRAME_OVERHEAD 10089c7cc234SK.Prasad bl .do_dabr 10099c7cc234SK.Prasad b .ret_from_except_lite 10109c7cc234SK.Prasad 10110ebc4cdaSBenjamin Herrenschmidt/* Here we have a page fault that hash_page can't handle. */ 10120ebc4cdaSBenjamin Herrenschmidthandle_page_fault: 10130ebc4cdaSBenjamin Herrenschmidt ENABLE_INTS 10140ebc4cdaSBenjamin Herrenschmidt11: ld r4,_DAR(r1) 10150ebc4cdaSBenjamin Herrenschmidt ld r5,_DSISR(r1) 10160ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 10170ebc4cdaSBenjamin Herrenschmidt bl .do_page_fault 10180ebc4cdaSBenjamin Herrenschmidt cmpdi r3,0 10190ebc4cdaSBenjamin Herrenschmidt beq+ 13f 10200ebc4cdaSBenjamin Herrenschmidt bl .save_nvgprs 10210ebc4cdaSBenjamin Herrenschmidt mr r5,r3 10220ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 10230ebc4cdaSBenjamin Herrenschmidt lwz r4,_DAR(r1) 10240ebc4cdaSBenjamin Herrenschmidt bl .bad_page_fault 10250ebc4cdaSBenjamin Herrenschmidt b .ret_from_except 10260ebc4cdaSBenjamin Herrenschmidt 10270ebc4cdaSBenjamin Herrenschmidt13: b .ret_from_except_lite 10280ebc4cdaSBenjamin Herrenschmidt 10290ebc4cdaSBenjamin Herrenschmidt/* We have a page fault that hash_page could handle but HV refused 10300ebc4cdaSBenjamin Herrenschmidt * the PTE insertion 10310ebc4cdaSBenjamin Herrenschmidt */ 10320ebc4cdaSBenjamin Herrenschmidt12: bl .save_nvgprs 10330ebc4cdaSBenjamin Herrenschmidt mr r5,r3 10340ebc4cdaSBenjamin Herrenschmidt addi r3,r1,STACK_FRAME_OVERHEAD 10350ebc4cdaSBenjamin Herrenschmidt ld r4,_DAR(r1) 10360ebc4cdaSBenjamin Herrenschmidt bl .low_hash_fault 10370ebc4cdaSBenjamin Herrenschmidt b .ret_from_except 10380ebc4cdaSBenjamin Herrenschmidt 10399c1e1052SPaul Mackerras/* 10409c1e1052SPaul Mackerras * We come here as a result of a DSI at a point where we don't want 10419c1e1052SPaul Mackerras * to call hash_page, such as when we are accessing memory (possibly 10429c1e1052SPaul Mackerras * user memory) inside a PMU interrupt that occurred while interrupts 10439c1e1052SPaul Mackerras * were soft-disabled. We want to invoke the exception handler for 10449c1e1052SPaul Mackerras * the access, or panic if there isn't a handler. 10459c1e1052SPaul Mackerras */ 10469c1e1052SPaul Mackerras77: bl .save_nvgprs 10479c1e1052SPaul Mackerras mr r4,r3 10489c1e1052SPaul Mackerras addi r3,r1,STACK_FRAME_OVERHEAD 10499c1e1052SPaul Mackerras li r5,SIGSEGV 10509c1e1052SPaul Mackerras bl .bad_page_fault 10519c1e1052SPaul Mackerras b .ret_from_except 10529c1e1052SPaul Mackerras 10530ebc4cdaSBenjamin Herrenschmidt /* here we have a segment miss */ 10540ebc4cdaSBenjamin Herrenschmidtdo_ste_alloc: 10550ebc4cdaSBenjamin Herrenschmidt bl .ste_allocate /* try to insert stab entry */ 10560ebc4cdaSBenjamin Herrenschmidt cmpdi r3,0 10570ebc4cdaSBenjamin Herrenschmidt bne- handle_page_fault 10580ebc4cdaSBenjamin Herrenschmidt b fast_exception_return 10590ebc4cdaSBenjamin Herrenschmidt 10600ebc4cdaSBenjamin Herrenschmidt/* 10610ebc4cdaSBenjamin Herrenschmidt * r13 points to the PACA, r9 contains the saved CR, 10620ebc4cdaSBenjamin Herrenschmidt * r11 and r12 contain the saved SRR0 and SRR1. 10630ebc4cdaSBenjamin Herrenschmidt * r9 - r13 are saved in paca->exslb. 10640ebc4cdaSBenjamin Herrenschmidt * We assume we aren't going to take any exceptions during this procedure. 10650ebc4cdaSBenjamin Herrenschmidt * We assume (DAR >> 60) == 0xc. 10660ebc4cdaSBenjamin Herrenschmidt */ 10670ebc4cdaSBenjamin Herrenschmidt .align 7 10680ebc4cdaSBenjamin Herrenschmidt_GLOBAL(do_stab_bolted) 10690ebc4cdaSBenjamin Herrenschmidt stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */ 10700ebc4cdaSBenjamin Herrenschmidt std r11,PACA_EXSLB+EX_SRR0(r13) /* save SRR0 in exc. frame */ 10710ebc4cdaSBenjamin Herrenschmidt 10720ebc4cdaSBenjamin Herrenschmidt /* Hash to the primary group */ 10730ebc4cdaSBenjamin Herrenschmidt ld r10,PACASTABVIRT(r13) 10740ebc4cdaSBenjamin Herrenschmidt mfspr r11,SPRN_DAR 10750ebc4cdaSBenjamin Herrenschmidt srdi r11,r11,28 10760ebc4cdaSBenjamin Herrenschmidt rldimi r10,r11,7,52 /* r10 = first ste of the group */ 10770ebc4cdaSBenjamin Herrenschmidt 10780ebc4cdaSBenjamin Herrenschmidt /* Calculate VSID */ 10790ebc4cdaSBenjamin Herrenschmidt /* This is a kernel address, so protovsid = ESID */ 10800ebc4cdaSBenjamin Herrenschmidt ASM_VSID_SCRAMBLE(r11, r9, 256M) 10810ebc4cdaSBenjamin Herrenschmidt rldic r9,r11,12,16 /* r9 = vsid << 12 */ 10820ebc4cdaSBenjamin Herrenschmidt 10830ebc4cdaSBenjamin Herrenschmidt /* Search the primary group for a free entry */ 10840ebc4cdaSBenjamin Herrenschmidt1: ld r11,0(r10) /* Test valid bit of the current ste */ 10850ebc4cdaSBenjamin Herrenschmidt andi. r11,r11,0x80 10860ebc4cdaSBenjamin Herrenschmidt beq 2f 10870ebc4cdaSBenjamin Herrenschmidt addi r10,r10,16 10880ebc4cdaSBenjamin Herrenschmidt andi. r11,r10,0x70 10890ebc4cdaSBenjamin Herrenschmidt bne 1b 10900ebc4cdaSBenjamin Herrenschmidt 10910ebc4cdaSBenjamin Herrenschmidt /* Stick for only searching the primary group for now. */ 10920ebc4cdaSBenjamin Herrenschmidt /* At least for now, we use a very simple random castout scheme */ 10930ebc4cdaSBenjamin Herrenschmidt /* Use the TB as a random number ; OR in 1 to avoid entry 0 */ 10940ebc4cdaSBenjamin Herrenschmidt mftb r11 10950ebc4cdaSBenjamin Herrenschmidt rldic r11,r11,4,57 /* r11 = (r11 << 4) & 0x70 */ 10960ebc4cdaSBenjamin Herrenschmidt ori r11,r11,0x10 10970ebc4cdaSBenjamin Herrenschmidt 10980ebc4cdaSBenjamin Herrenschmidt /* r10 currently points to an ste one past the group of interest */ 10990ebc4cdaSBenjamin Herrenschmidt /* make it point to the randomly selected entry */ 11000ebc4cdaSBenjamin Herrenschmidt subi r10,r10,128 11010ebc4cdaSBenjamin Herrenschmidt or r10,r10,r11 /* r10 is the entry to invalidate */ 11020ebc4cdaSBenjamin Herrenschmidt 11030ebc4cdaSBenjamin Herrenschmidt isync /* mark the entry invalid */ 11040ebc4cdaSBenjamin Herrenschmidt ld r11,0(r10) 11050ebc4cdaSBenjamin Herrenschmidt rldicl r11,r11,56,1 /* clear the valid bit */ 11060ebc4cdaSBenjamin Herrenschmidt rotldi r11,r11,8 11070ebc4cdaSBenjamin Herrenschmidt std r11,0(r10) 11080ebc4cdaSBenjamin Herrenschmidt sync 11090ebc4cdaSBenjamin Herrenschmidt 11100ebc4cdaSBenjamin Herrenschmidt clrrdi r11,r11,28 /* Get the esid part of the ste */ 11110ebc4cdaSBenjamin Herrenschmidt slbie r11 11120ebc4cdaSBenjamin Herrenschmidt 11130ebc4cdaSBenjamin Herrenschmidt2: std r9,8(r10) /* Store the vsid part of the ste */ 11140ebc4cdaSBenjamin Herrenschmidt eieio 11150ebc4cdaSBenjamin Herrenschmidt 11160ebc4cdaSBenjamin Herrenschmidt mfspr r11,SPRN_DAR /* Get the new esid */ 11170ebc4cdaSBenjamin Herrenschmidt clrrdi r11,r11,28 /* Permits a full 32b of ESID */ 11180ebc4cdaSBenjamin Herrenschmidt ori r11,r11,0x90 /* Turn on valid and kp */ 11190ebc4cdaSBenjamin Herrenschmidt std r11,0(r10) /* Put new entry back into the stab */ 11200ebc4cdaSBenjamin Herrenschmidt 11210ebc4cdaSBenjamin Herrenschmidt sync 11220ebc4cdaSBenjamin Herrenschmidt 11230ebc4cdaSBenjamin Herrenschmidt /* All done -- return from exception. */ 11240ebc4cdaSBenjamin Herrenschmidt lwz r9,PACA_EXSLB+EX_CCR(r13) /* get saved CR */ 11250ebc4cdaSBenjamin Herrenschmidt ld r11,PACA_EXSLB+EX_SRR0(r13) /* get saved SRR0 */ 11260ebc4cdaSBenjamin Herrenschmidt 11270ebc4cdaSBenjamin Herrenschmidt andi. r10,r12,MSR_RI 11280ebc4cdaSBenjamin Herrenschmidt beq- unrecov_slb 11290ebc4cdaSBenjamin Herrenschmidt 11300ebc4cdaSBenjamin Herrenschmidt mtcrf 0x80,r9 /* restore CR */ 11310ebc4cdaSBenjamin Herrenschmidt 11320ebc4cdaSBenjamin Herrenschmidt mfmsr r10 11330ebc4cdaSBenjamin Herrenschmidt clrrdi r10,r10,2 11340ebc4cdaSBenjamin Herrenschmidt mtmsrd r10,1 11350ebc4cdaSBenjamin Herrenschmidt 11360ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR0,r11 11370ebc4cdaSBenjamin Herrenschmidt mtspr SPRN_SRR1,r12 11380ebc4cdaSBenjamin Herrenschmidt ld r9,PACA_EXSLB+EX_R9(r13) 11390ebc4cdaSBenjamin Herrenschmidt ld r10,PACA_EXSLB+EX_R10(r13) 11400ebc4cdaSBenjamin Herrenschmidt ld r11,PACA_EXSLB+EX_R11(r13) 11410ebc4cdaSBenjamin Herrenschmidt ld r12,PACA_EXSLB+EX_R12(r13) 11420ebc4cdaSBenjamin Herrenschmidt ld r13,PACA_EXSLB+EX_R13(r13) 11430ebc4cdaSBenjamin Herrenschmidt rfid 11440ebc4cdaSBenjamin Herrenschmidt b . /* prevent speculative execution */ 11450ebc4cdaSBenjamin Herrenschmidt 11460ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_PSERIES 11470ebc4cdaSBenjamin Herrenschmidt/* 11480ebc4cdaSBenjamin Herrenschmidt * Data area reserved for FWNMI option. 11490ebc4cdaSBenjamin Herrenschmidt * This address (0x7000) is fixed by the RPA. 11500ebc4cdaSBenjamin Herrenschmidt */ 11510ebc4cdaSBenjamin Herrenschmidt .= 0x7000 11520ebc4cdaSBenjamin Herrenschmidt .globl fwnmi_data_area 11530ebc4cdaSBenjamin Herrenschmidtfwnmi_data_area: 11540ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_PSERIES */ 11550ebc4cdaSBenjamin Herrenschmidt 11560ebc4cdaSBenjamin Herrenschmidt /* iSeries does not use the FWNMI stuff, so it is safe to put 11570ebc4cdaSBenjamin Herrenschmidt * this here, even if we later allow kernels that will boot on 11580ebc4cdaSBenjamin Herrenschmidt * both pSeries and iSeries */ 11590ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_ISERIES 11600ebc4cdaSBenjamin Herrenschmidt . = LPARMAP_PHYS 11610ebc4cdaSBenjamin Herrenschmidt .globl xLparMap 11620ebc4cdaSBenjamin HerrenschmidtxLparMap: 11630ebc4cdaSBenjamin Herrenschmidt .quad HvEsidsToMap /* xNumberEsids */ 11640ebc4cdaSBenjamin Herrenschmidt .quad HvRangesToMap /* xNumberRanges */ 11650ebc4cdaSBenjamin Herrenschmidt .quad STAB0_PAGE /* xSegmentTableOffs */ 11660ebc4cdaSBenjamin Herrenschmidt .zero 40 /* xRsvd */ 11670ebc4cdaSBenjamin Herrenschmidt /* xEsids (HvEsidsToMap entries of 2 quads) */ 11680ebc4cdaSBenjamin Herrenschmidt .quad PAGE_OFFSET_ESID /* xKernelEsid */ 11690ebc4cdaSBenjamin Herrenschmidt .quad PAGE_OFFSET_VSID /* xKernelVsid */ 11700ebc4cdaSBenjamin Herrenschmidt .quad VMALLOC_START_ESID /* xKernelEsid */ 11710ebc4cdaSBenjamin Herrenschmidt .quad VMALLOC_START_VSID /* xKernelVsid */ 11720ebc4cdaSBenjamin Herrenschmidt /* xRanges (HvRangesToMap entries of 3 quads) */ 11730ebc4cdaSBenjamin Herrenschmidt .quad HvPagesToMap /* xPages */ 11740ebc4cdaSBenjamin Herrenschmidt .quad 0 /* xOffset */ 11750ebc4cdaSBenjamin Herrenschmidt .quad PAGE_OFFSET_VSID << (SID_SHIFT - HW_PAGE_SHIFT) /* xVPN */ 11760ebc4cdaSBenjamin Herrenschmidt 11770ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_ISERIES */ 11780ebc4cdaSBenjamin Herrenschmidt 11790ebc4cdaSBenjamin Herrenschmidt#ifdef CONFIG_PPC_PSERIES 11800ebc4cdaSBenjamin Herrenschmidt . = 0x8000 11810ebc4cdaSBenjamin Herrenschmidt#endif /* CONFIG_PPC_PSERIES */ 118284493804SBenjamin Herrenschmidt 118384493804SBenjamin Herrenschmidt/* 118484493804SBenjamin Herrenschmidt * Space for CPU0's segment table. 118584493804SBenjamin Herrenschmidt * 118684493804SBenjamin Herrenschmidt * On iSeries, the hypervisor must fill in at least one entry before 118784493804SBenjamin Herrenschmidt * we get control (with relocate on). The address is given to the hv 118884493804SBenjamin Herrenschmidt * as a page number (see xLparMap above), so this must be at a 118984493804SBenjamin Herrenschmidt * fixed address (the linker can't compute (u64)&initial_stab >> 119084493804SBenjamin Herrenschmidt * PAGE_SHIFT). 119184493804SBenjamin Herrenschmidt */ 119284493804SBenjamin Herrenschmidt . = STAB0_OFFSET /* 0x8000 */ 119384493804SBenjamin Herrenschmidt .globl initial_stab 119484493804SBenjamin Herrenschmidtinitial_stab: 119584493804SBenjamin Herrenschmidt .space 4096 1196