|
@@ -153,7 +153,10 @@ machine_check_pSeries_1:
|
|
|
* some code path might still want to branch into the original
|
|
|
* vector
|
|
|
*/
|
|
|
- b machine_check_pSeries
|
|
|
+ HMT_MEDIUM_PPR_DISCARD
|
|
|
+ SET_SCRATCH0(r13) /* save r13 */
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXMC)
|
|
|
+ b machine_check_pSeries_0
|
|
|
|
|
|
. = 0x300
|
|
|
.globl data_access_pSeries
|
|
@@ -172,6 +175,7 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_SLB)
|
|
|
data_access_slb_pSeries:
|
|
|
HMT_MEDIUM_PPR_DISCARD
|
|
|
SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXSLB)
|
|
|
EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST, 0x380)
|
|
|
std r3,PACA_EXSLB+EX_R3(r13)
|
|
|
mfspr r3,SPRN_DAR
|
|
@@ -203,6 +207,7 @@ data_access_slb_pSeries:
|
|
|
instruction_access_slb_pSeries:
|
|
|
HMT_MEDIUM_PPR_DISCARD
|
|
|
SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXSLB)
|
|
|
EXCEPTION_PROLOG_1(PACA_EXSLB, KVMTEST_PR, 0x480)
|
|
|
std r3,PACA_EXSLB+EX_R3(r13)
|
|
|
mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */
|
|
@@ -284,16 +289,28 @@ system_call_pSeries:
|
|
|
*/
|
|
|
. = 0xe00
|
|
|
hv_exception_trampoline:
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b h_data_storage_hv
|
|
|
+
|
|
|
. = 0xe20
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b h_instr_storage_hv
|
|
|
+
|
|
|
. = 0xe40
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b emulation_assist_hv
|
|
|
- . = 0xe50
|
|
|
- b hmi_exception_hv
|
|
|
+
|
|
|
. = 0xe60
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b hmi_exception_hv
|
|
|
+
|
|
|
. = 0xe80
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b h_doorbell_hv
|
|
|
|
|
|
/* We need to deal with the Altivec unavailable exception
|
|
@@ -303,14 +320,20 @@ hv_exception_trampoline:
|
|
|
*/
|
|
|
performance_monitor_pSeries_1:
|
|
|
. = 0xf00
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b performance_monitor_pSeries
|
|
|
|
|
|
altivec_unavailable_pSeries_1:
|
|
|
. = 0xf20
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b altivec_unavailable_pSeries
|
|
|
|
|
|
vsx_unavailable_pSeries_1:
|
|
|
. = 0xf40
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b vsx_unavailable_pSeries
|
|
|
|
|
|
#ifdef CONFIG_CBE_RAS
|
|
@@ -326,10 +349,7 @@ vsx_unavailable_pSeries_1:
|
|
|
denorm_exception_hv:
|
|
|
HMT_MEDIUM_PPR_DISCARD
|
|
|
mtspr SPRN_SPRG_HSCRATCH0,r13
|
|
|
- mfspr r13,SPRN_SPRG_HPACA
|
|
|
- std r9,PACA_EXGEN+EX_R9(r13)
|
|
|
- HMT_MEDIUM_PPR_SAVE(PACA_EXGEN, r9)
|
|
|
- std r10,PACA_EXGEN+EX_R10(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
std r11,PACA_EXGEN+EX_R11(r13)
|
|
|
std r12,PACA_EXGEN+EX_R12(r13)
|
|
|
mfspr r9,SPRN_SPRG_HSCRATCH0
|
|
@@ -372,8 +392,10 @@ machine_check_pSeries:
|
|
|
machine_check_fwnmi:
|
|
|
HMT_MEDIUM_PPR_DISCARD
|
|
|
SET_SCRATCH0(r13) /* save r13 */
|
|
|
- EXCEPTION_PROLOG_PSERIES(PACA_EXMC, machine_check_common,
|
|
|
- EXC_STD, KVMTEST, 0x200)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXMC)
|
|
|
+machine_check_pSeries_0:
|
|
|
+ EXCEPTION_PROLOG_1(PACA_EXMC, KVMTEST, 0x200)
|
|
|
+ EXCEPTION_PROLOG_PSERIES_1(machine_check_common, EXC_STD)
|
|
|
KVM_HANDLER_SKIP(PACA_EXMC, EXC_STD, 0x200)
|
|
|
|
|
|
/* moved from 0x300 */
|
|
@@ -510,23 +532,23 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_ARCH_206)
|
|
|
|
|
|
.align 7
|
|
|
/* moved from 0xe00 */
|
|
|
- STD_EXCEPTION_HV(., 0xe02, h_data_storage)
|
|
|
+ STD_EXCEPTION_HV_OOL(0xe02, h_data_storage)
|
|
|
KVM_HANDLER_SKIP(PACA_EXGEN, EXC_HV, 0xe02)
|
|
|
- STD_EXCEPTION_HV(., 0xe22, h_instr_storage)
|
|
|
+ STD_EXCEPTION_HV_OOL(0xe22, h_instr_storage)
|
|
|
KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe22)
|
|
|
- STD_EXCEPTION_HV(., 0xe42, emulation_assist)
|
|
|
+ STD_EXCEPTION_HV_OOL(0xe42, emulation_assist)
|
|
|
KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe42)
|
|
|
- STD_EXCEPTION_HV(., 0xe62, hmi_exception) /* need to flush cache ? */
|
|
|
+ STD_EXCEPTION_HV_OOL(0xe62, hmi_exception) /* need to flush cache ? */
|
|
|
KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe62)
|
|
|
- MASKABLE_EXCEPTION_HV(., 0xe82, h_doorbell)
|
|
|
+ MASKABLE_EXCEPTION_HV_OOL(0xe82, h_doorbell)
|
|
|
KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe82)
|
|
|
|
|
|
/* moved from 0xf00 */
|
|
|
- STD_EXCEPTION_PSERIES(., 0xf00, performance_monitor)
|
|
|
+ STD_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor)
|
|
|
KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf00)
|
|
|
- STD_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable)
|
|
|
+ STD_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable)
|
|
|
KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf20)
|
|
|
- STD_EXCEPTION_PSERIES(., 0xf40, vsx_unavailable)
|
|
|
+ STD_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable)
|
|
|
KVM_HANDLER_PR(PACA_EXGEN, EXC_STD, 0xf40)
|
|
|
|
|
|
/*
|
|
@@ -718,8 +740,8 @@ machine_check_common:
|
|
|
. = 0x4380
|
|
|
.globl data_access_slb_relon_pSeries
|
|
|
data_access_slb_relon_pSeries:
|
|
|
- HMT_MEDIUM_PPR_DISCARD
|
|
|
SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXSLB)
|
|
|
EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x380)
|
|
|
std r3,PACA_EXSLB+EX_R3(r13)
|
|
|
mfspr r3,SPRN_DAR
|
|
@@ -743,8 +765,8 @@ data_access_slb_relon_pSeries:
|
|
|
. = 0x4480
|
|
|
.globl instruction_access_slb_relon_pSeries
|
|
|
instruction_access_slb_relon_pSeries:
|
|
|
- HMT_MEDIUM_PPR_DISCARD
|
|
|
SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXSLB)
|
|
|
EXCEPTION_PROLOG_1(PACA_EXSLB, NOTEST, 0x480)
|
|
|
std r3,PACA_EXSLB+EX_R3(r13)
|
|
|
mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */
|
|
@@ -788,33 +810,46 @@ system_call_relon_pSeries:
|
|
|
STD_RELON_EXCEPTION_PSERIES(0x4d00, 0xd00, single_step)
|
|
|
|
|
|
. = 0x4e00
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b h_data_storage_relon_hv
|
|
|
|
|
|
. = 0x4e20
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b h_instr_storage_relon_hv
|
|
|
|
|
|
. = 0x4e40
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b emulation_assist_relon_hv
|
|
|
|
|
|
- . = 0x4e50
|
|
|
- b hmi_exception_relon_hv
|
|
|
-
|
|
|
. = 0x4e60
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b hmi_exception_relon_hv
|
|
|
|
|
|
. = 0x4e80
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b h_doorbell_relon_hv
|
|
|
|
|
|
performance_monitor_relon_pSeries_1:
|
|
|
. = 0x4f00
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b performance_monitor_relon_pSeries
|
|
|
|
|
|
altivec_unavailable_relon_pSeries_1:
|
|
|
. = 0x4f20
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b altivec_unavailable_relon_pSeries
|
|
|
|
|
|
vsx_unavailable_relon_pSeries_1:
|
|
|
. = 0x4f40
|
|
|
+ SET_SCRATCH0(r13)
|
|
|
+ EXCEPTION_PROLOG_0(PACA_EXGEN)
|
|
|
b vsx_unavailable_relon_pSeries
|
|
|
|
|
|
STD_RELON_EXCEPTION_PSERIES(0x5300, 0x1300, instruction_breakpoint)
|
|
@@ -1171,20 +1206,20 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
|
|
|
__end_handlers:
|
|
|
|
|
|
/* Equivalents to the above handlers for relocation-on interrupt vectors */
|
|
|
- STD_RELON_EXCEPTION_HV(., 0xe00, h_data_storage)
|
|
|
+ STD_RELON_EXCEPTION_HV_OOL(0xe00, h_data_storage)
|
|
|
KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe00)
|
|
|
- STD_RELON_EXCEPTION_HV(., 0xe20, h_instr_storage)
|
|
|
+ STD_RELON_EXCEPTION_HV_OOL(0xe20, h_instr_storage)
|
|
|
KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe20)
|
|
|
- STD_RELON_EXCEPTION_HV(., 0xe40, emulation_assist)
|
|
|
+ STD_RELON_EXCEPTION_HV_OOL(0xe40, emulation_assist)
|
|
|
KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe40)
|
|
|
- STD_RELON_EXCEPTION_HV(., 0xe60, hmi_exception)
|
|
|
+ STD_RELON_EXCEPTION_HV_OOL(0xe60, hmi_exception)
|
|
|
KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe60)
|
|
|
- MASKABLE_RELON_EXCEPTION_HV(., 0xe80, h_doorbell)
|
|
|
+ MASKABLE_RELON_EXCEPTION_HV_OOL(0xe80, h_doorbell)
|
|
|
KVM_HANDLER(PACA_EXGEN, EXC_HV, 0xe80)
|
|
|
|
|
|
- STD_RELON_EXCEPTION_PSERIES(., 0xf00, performance_monitor)
|
|
|
- STD_RELON_EXCEPTION_PSERIES(., 0xf20, altivec_unavailable)
|
|
|
- STD_RELON_EXCEPTION_PSERIES(., 0xf40, vsx_unavailable)
|
|
|
+ STD_RELON_EXCEPTION_PSERIES_OOL(0xf00, performance_monitor)
|
|
|
+ STD_RELON_EXCEPTION_PSERIES_OOL(0xf20, altivec_unavailable)
|
|
|
+ STD_RELON_EXCEPTION_PSERIES_OOL(0xf40, vsx_unavailable)
|
|
|
|
|
|
#if defined(CONFIG_PPC_PSERIES) || defined(CONFIG_PPC_POWERNV)
|
|
|
/*
|