powerpc/64s/exception: Replace PROLOG macros and EXC helpers with a gas macro
This creates a single macro that generates the exception prolog code, with variants specified by arguments, rather than assorted nested macros for different variants. The increasing length of macro argument list is not nice to read or modify, but this is a temporary condition that will be improved in later changes. No generated code change except BUG line number constants and label names. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20190802105709.27696-23-npiggin@gmail.com
This commit is contained in:
parent
5ff79a5ea6
commit
7299417c82
|
@ -43,6 +43,17 @@
|
|||
.endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Following are fixed section helper macros.
|
||||
*
|
||||
* EXC_REAL_BEGIN/END - real, unrelocated exception vectors
|
||||
* EXC_VIRT_BEGIN/END - virt (AIL), unrelocated exception vectors
|
||||
* TRAMP_REAL_BEGIN - real, unrelocated helpers (virt may call these)
|
||||
* TRAMP_VIRT_BEGIN - virt, unreloc helpers (in practice, real can use)
|
||||
* TRAMP_KVM_BEGIN - KVM handlers, these are put into real, unrelocated
|
||||
* EXC_COMMON - After switching to virtual, relocated mode.
|
||||
*/
|
||||
|
||||
#define EXC_REAL_BEGIN(name, start, size) \
|
||||
FIXED_SECTION_ENTRY_BEGIN_LOCATION(real_vectors, exc_real_##start##_##name, start, size)
|
||||
|
||||
|
@ -589,196 +600,54 @@ END_FTR_SECTION_IFSET(CPU_FTR_CAN_NAP)
|
|||
#endif
|
||||
|
||||
/*
|
||||
* Following are the BOOK3S exception handler helper macros.
|
||||
* Handlers come in a number of types, and each type has a number of varieties.
|
||||
* This is the BOOK3S interrupt entry code macro.
|
||||
*
|
||||
* EXC_REAL_* - real, unrelocated exception vectors
|
||||
* EXC_VIRT_* - virt (AIL), unrelocated exception vectors
|
||||
* TRAMP_REAL_* - real, unrelocated helpers (virt can call these)
|
||||
* TRAMP_VIRT_* - virt, unreloc helpers (in practice, real can use)
|
||||
* TRAMP_KVM - KVM handlers that get put into real, unrelocated
|
||||
* EXC_COMMON - virt, relocated common handlers
|
||||
*
|
||||
* The EXC handlers are given a name, and branch to name_common, or the
|
||||
* appropriate KVM or masking function. Vector handler verieties are as
|
||||
* follows:
|
||||
*
|
||||
* EXC_{REAL|VIRT}_BEGIN/END - used to open-code the exception
|
||||
*
|
||||
* EXC_{REAL|VIRT} - standard exception
|
||||
*
|
||||
* EXC_{REAL|VIRT}_suffix
|
||||
* where _suffix is:
|
||||
* - _MASKABLE - maskable exception
|
||||
* - _OOL - out of line with trampoline to common handler
|
||||
* - _HV - HV exception
|
||||
*
|
||||
* There can be combinations, e.g., EXC_VIRT_OOL_MASKABLE_HV
|
||||
*
|
||||
* KVM handlers come in the following verieties:
|
||||
* TRAMP_KVM
|
||||
* TRAMP_KVM_SKIP
|
||||
* TRAMP_KVM_HV
|
||||
* TRAMP_KVM_HV_SKIP
|
||||
*
|
||||
* COMMON handlers come in the following verieties:
|
||||
* EXC_COMMON_BEGIN/END - used to open-code the handler
|
||||
* EXC_COMMON
|
||||
* EXC_COMMON_ASYNC
|
||||
*
|
||||
* TRAMP_REAL and TRAMP_VIRT can be used with BEGIN/END. KVM
|
||||
* and OOL handlers are implemented as types of TRAMP and TRAMP_VIRT handlers.
|
||||
* This can result in one of several things happening:
|
||||
* - Branch to the _common handler, relocated, in virtual mode.
|
||||
* These are normal interrupts (synchronous and asynchronous) handled by
|
||||
* the kernel.
|
||||
* - Branch to KVM, relocated but real mode interrupts remain in real mode.
|
||||
* These occur when HSTATE_IN_GUEST is set. The interrupt may be caused by
|
||||
* / intended for host or guest kernel, but KVM must always be involved
|
||||
* because the machine state is set for guest execution.
|
||||
* - Branch to the masked handler, unrelocated.
|
||||
* These occur when maskable asynchronous interrupts are taken with the
|
||||
* irq_soft_mask set.
|
||||
* - Branch to an "early" handler in real mode but relocated.
|
||||
* This is done if early=1. MCE and HMI use these to handle errors in real
|
||||
* mode.
|
||||
* - Fall through and continue executing in real, unrelocated mode.
|
||||
* This is done if early=2.
|
||||
*/
|
||||
.macro INT_HANDLER name, vec, ool, early, virt, hsrr, area, ri, dar, dsisr, bitmask, kvm
|
||||
EXCEPTION_PROLOG_0 \area
|
||||
.if \ool
|
||||
.if !\virt
|
||||
b tramp_real_\name
|
||||
.pushsection .text
|
||||
TRAMP_REAL_BEGIN(tramp_real_\name)
|
||||
.else
|
||||
b tramp_virt_\name
|
||||
.pushsection .text
|
||||
TRAMP_VIRT_BEGIN(tramp_virt_\name)
|
||||
.endif
|
||||
.endif
|
||||
EXCEPTION_PROLOG_1 \hsrr, \area, \kvm, \vec, \dar, \dsisr, \bitmask
|
||||
.if \early == 2
|
||||
/* nothing more */
|
||||
.elseif \early
|
||||
mfctr r10 /* save ctr, even for !RELOCATABLE */
|
||||
BRANCH_TO_C000(r11, \name\()_early_common)
|
||||
.elseif !\virt
|
||||
EXCEPTION_PROLOG_2_REAL \name\()_common, \hsrr, \ri
|
||||
.else
|
||||
EXCEPTION_PROLOG_2_VIRT \name\()_common, \hsrr
|
||||
.endif
|
||||
.if \ool
|
||||
.popsection
|
||||
.endif
|
||||
.endm
|
||||
|
||||
#define __EXC_REAL(name, start, size, area) \
|
||||
EXC_REAL_BEGIN(name, start, size); \
|
||||
EXCEPTION_PROLOG_0 area ; \
|
||||
EXCEPTION_PROLOG_1 EXC_STD, area, 1, start, 0, 0, 0 ; \
|
||||
EXCEPTION_PROLOG_2_REAL name##_common, EXC_STD, 1 ; \
|
||||
EXC_REAL_END(name, start, size)
|
||||
|
||||
#define EXC_REAL(name, start, size) \
|
||||
__EXC_REAL(name, start, size, PACA_EXGEN)
|
||||
|
||||
#define __EXC_VIRT(name, start, size, realvec, area) \
|
||||
EXC_VIRT_BEGIN(name, start, size); \
|
||||
EXCEPTION_PROLOG_0 area ; \
|
||||
EXCEPTION_PROLOG_1 EXC_STD, area, 0, realvec, 0, 0, 0; \
|
||||
EXCEPTION_PROLOG_2_VIRT name##_common, EXC_STD ; \
|
||||
EXC_VIRT_END(name, start, size)
|
||||
|
||||
#define EXC_VIRT(name, start, size, realvec) \
|
||||
__EXC_VIRT(name, start, size, realvec, PACA_EXGEN)
|
||||
|
||||
#define EXC_REAL_MASKABLE(name, start, size, bitmask) \
|
||||
EXC_REAL_BEGIN(name, start, size); \
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN ; \
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, start, 0, 0, bitmask ; \
|
||||
EXCEPTION_PROLOG_2_REAL name##_common, EXC_STD, 1 ; \
|
||||
EXC_REAL_END(name, start, size)
|
||||
|
||||
#define EXC_VIRT_MASKABLE(name, start, size, realvec, bitmask) \
|
||||
EXC_VIRT_BEGIN(name, start, size); \
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN ; \
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, realvec, 0, 0, bitmask ; \
|
||||
EXCEPTION_PROLOG_2_VIRT name##_common, EXC_STD ; \
|
||||
EXC_VIRT_END(name, start, size)
|
||||
|
||||
#define EXC_REAL_HV(name, start, size) \
|
||||
EXC_REAL_BEGIN(name, start, size); \
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN; \
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, start, 0, 0, 0 ; \
|
||||
EXCEPTION_PROLOG_2_REAL name##_common, EXC_HV, 1 ; \
|
||||
EXC_REAL_END(name, start, size)
|
||||
|
||||
#define EXC_VIRT_HV(name, start, size, realvec) \
|
||||
EXC_VIRT_BEGIN(name, start, size); \
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN; \
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, realvec, 0, 0, 0 ; \
|
||||
EXCEPTION_PROLOG_2_VIRT name##_common, EXC_HV ; \
|
||||
EXC_VIRT_END(name, start, size)
|
||||
|
||||
#define __EXC_REAL_OOL(name, start, size) \
|
||||
EXC_REAL_BEGIN(name, start, size); \
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN ; \
|
||||
b tramp_real_##name ; \
|
||||
EXC_REAL_END(name, start, size)
|
||||
|
||||
#define __TRAMP_REAL_OOL(name, vec) \
|
||||
TRAMP_REAL_BEGIN(tramp_real_##name); \
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, vec, 0, 0, 0 ; \
|
||||
EXCEPTION_PROLOG_2_REAL name##_common, EXC_STD, 1
|
||||
|
||||
#define EXC_REAL_OOL(name, start, size) \
|
||||
__EXC_REAL_OOL(name, start, size); \
|
||||
__TRAMP_REAL_OOL(name, start)
|
||||
|
||||
#define __EXC_REAL_OOL_MASKABLE(name, start, size) \
|
||||
__EXC_REAL_OOL(name, start, size)
|
||||
|
||||
#define __TRAMP_REAL_OOL_MASKABLE(name, vec, bitmask) \
|
||||
TRAMP_REAL_BEGIN(tramp_real_##name); \
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, vec, 0, 0, bitmask ; \
|
||||
EXCEPTION_PROLOG_2_REAL name##_common, EXC_STD, 1
|
||||
|
||||
#define EXC_REAL_OOL_MASKABLE(name, start, size, bitmask) \
|
||||
__EXC_REAL_OOL_MASKABLE(name, start, size); \
|
||||
__TRAMP_REAL_OOL_MASKABLE(name, start, bitmask)
|
||||
|
||||
#define __EXC_REAL_OOL_HV(name, start, size) \
|
||||
__EXC_REAL_OOL(name, start, size)
|
||||
|
||||
#define __TRAMP_REAL_OOL_HV(name, vec) \
|
||||
TRAMP_REAL_BEGIN(tramp_real_##name); \
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, 0, 0, 0 ; \
|
||||
EXCEPTION_PROLOG_2_REAL name##_common, EXC_HV, 1
|
||||
|
||||
#define EXC_REAL_OOL_HV(name, start, size) \
|
||||
__EXC_REAL_OOL_HV(name, start, size); \
|
||||
__TRAMP_REAL_OOL_HV(name, start)
|
||||
|
||||
#define __EXC_REAL_OOL_MASKABLE_HV(name, start, size) \
|
||||
__EXC_REAL_OOL(name, start, size)
|
||||
|
||||
#define __TRAMP_REAL_OOL_MASKABLE_HV(name, vec, bitmask) \
|
||||
TRAMP_REAL_BEGIN(tramp_real_##name); \
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, vec, 0, 0, bitmask ; \
|
||||
EXCEPTION_PROLOG_2_REAL name##_common, EXC_HV, 1
|
||||
|
||||
#define EXC_REAL_OOL_MASKABLE_HV(name, start, size, bitmask) \
|
||||
__EXC_REAL_OOL_MASKABLE_HV(name, start, size); \
|
||||
__TRAMP_REAL_OOL_MASKABLE_HV(name, start, bitmask)
|
||||
|
||||
#define __EXC_VIRT_OOL(name, start, size) \
|
||||
EXC_VIRT_BEGIN(name, start, size); \
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN ; \
|
||||
b tramp_virt_##name; \
|
||||
EXC_VIRT_END(name, start, size)
|
||||
|
||||
#define __TRAMP_VIRT_OOL(name, realvec) \
|
||||
TRAMP_VIRT_BEGIN(tramp_virt_##name); \
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, vec, 0, 0, 0 ; \
|
||||
EXCEPTION_PROLOG_2_VIRT name##_common, EXC_STD
|
||||
|
||||
#define EXC_VIRT_OOL(name, start, size, realvec) \
|
||||
__EXC_VIRT_OOL(name, start, size); \
|
||||
__TRAMP_VIRT_OOL(name, realvec)
|
||||
|
||||
#define __EXC_VIRT_OOL_MASKABLE(name, start, size) \
|
||||
__EXC_VIRT_OOL(name, start, size)
|
||||
|
||||
#define __TRAMP_VIRT_OOL_MASKABLE(name, realvec, bitmask) \
|
||||
TRAMP_VIRT_BEGIN(tramp_virt_##name); \
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, realvec, 0, 0, bitmask ; \
|
||||
EXCEPTION_PROLOG_2_VIRT name##_common, EXC_STD
|
||||
|
||||
#define EXC_VIRT_OOL_MASKABLE(name, start, size, realvec, bitmask) \
|
||||
__EXC_VIRT_OOL_MASKABLE(name, start, size); \
|
||||
__TRAMP_VIRT_OOL_MASKABLE(name, realvec, bitmask)
|
||||
|
||||
#define __EXC_VIRT_OOL_HV(name, start, size) \
|
||||
__EXC_VIRT_OOL(name, start, size)
|
||||
|
||||
#define __TRAMP_VIRT_OOL_HV(name, realvec) \
|
||||
TRAMP_VIRT_BEGIN(tramp_virt_##name); \
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, realvec, 0, 0, 0 ; \
|
||||
EXCEPTION_PROLOG_2_VIRT name##_common, EXC_HV
|
||||
|
||||
#define EXC_VIRT_OOL_HV(name, start, size, realvec) \
|
||||
__EXC_VIRT_OOL_HV(name, start, size); \
|
||||
__TRAMP_VIRT_OOL_HV(name, realvec)
|
||||
|
||||
#define __EXC_VIRT_OOL_MASKABLE_HV(name, start, size) \
|
||||
__EXC_VIRT_OOL(name, start, size)
|
||||
|
||||
#define __TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec, bitmask) \
|
||||
TRAMP_VIRT_BEGIN(tramp_virt_##name); \
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, realvec, 0, 0, bitmask ; \
|
||||
EXCEPTION_PROLOG_2_VIRT name##_common, EXC_HV
|
||||
|
||||
#define EXC_VIRT_OOL_MASKABLE_HV(name, start, size, realvec, bitmask) \
|
||||
__EXC_VIRT_OOL_MASKABLE_HV(name, start, size); \
|
||||
__TRAMP_VIRT_OOL_MASKABLE_HV(name, realvec, bitmask)
|
||||
|
||||
#define TRAMP_KVM(area, n) \
|
||||
TRAMP_KVM_BEGIN(do_kvm_##n); \
|
||||
|
@ -943,9 +812,7 @@ BEGIN_FTR_SECTION
|
|||
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
|
||||
#endif
|
||||
|
||||
EXCEPTION_PROLOG_0 PACA_EXNMI
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXNMI, 1, 0x100, 0, 0, 0
|
||||
EXCEPTION_PROLOG_2_REAL system_reset_common, EXC_STD, 0
|
||||
INT_HANDLER system_reset, 0x100, 0, 0, 0, EXC_STD, PACA_EXNMI, 0, 0, 0, 0, 1
|
||||
/*
|
||||
* MSR_RI is not enabled, because PACA_EXNMI and nmi stack is
|
||||
* being used, so a nested NMI exception would corrupt it.
|
||||
|
@ -975,9 +842,7 @@ TRAMP_REAL_BEGIN(system_reset_idle_wake)
|
|||
*/
|
||||
TRAMP_REAL_BEGIN(system_reset_fwnmi)
|
||||
/* See comment at system_reset exception, don't turn on RI */
|
||||
EXCEPTION_PROLOG_0 PACA_EXNMI
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXNMI, 0, 0x100, 0, 0, 0
|
||||
EXCEPTION_PROLOG_2_REAL system_reset_common, EXC_STD, 0
|
||||
INT_HANDLER system_reset, 0x100, 0, 0, 0, EXC_STD, PACA_EXNMI, 0, 0, 0, 0, 0
|
||||
|
||||
#endif /* CONFIG_PPC_PSERIES */
|
||||
|
||||
|
@ -1040,10 +905,7 @@ EXC_COMMON_BEGIN(system_reset_common)
|
|||
|
||||
|
||||
EXC_REAL_BEGIN(machine_check, 0x200, 0x100)
|
||||
EXCEPTION_PROLOG_0 PACA_EXMC
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXMC, 0, 0x200, 1, 1, 0
|
||||
mfctr r10 /* save ctr, even for !RELOCATABLE */
|
||||
BRANCH_TO_C000(r11, machine_check_early_common)
|
||||
INT_HANDLER machine_check, 0x200, 0, 1, 0, EXC_STD, PACA_EXMC, 0, 1, 1, 0, 0
|
||||
/*
|
||||
* MSR_RI is not enabled, because PACA_EXMC is being used, so a
|
||||
* nested machine check corrupts it. machine_check_common enables
|
||||
|
@ -1055,10 +917,7 @@ EXC_VIRT_NONE(0x4200, 0x100)
|
|||
#ifdef CONFIG_PPC_PSERIES
|
||||
TRAMP_REAL_BEGIN(machine_check_fwnmi)
|
||||
/* See comment at machine_check exception, don't turn on RI */
|
||||
EXCEPTION_PROLOG_0 PACA_EXMC
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXMC, 0, 0x200, 1, 1, 0
|
||||
mfctr r10 /* save ctr */
|
||||
BRANCH_TO_C000(r11, machine_check_early_common)
|
||||
INT_HANDLER machine_check, 0x200, 0, 1, 0, EXC_STD, PACA_EXMC, 0, 1, 1, 0, 0
|
||||
#endif
|
||||
|
||||
TRAMP_KVM_SKIP(PACA_EXMC, 0x200)
|
||||
|
@ -1209,9 +1068,7 @@ BEGIN_FTR_SECTION
|
|||
END_FTR_SECTION_IFSET(CPU_FTR_CFAR)
|
||||
MACHINE_CHECK_HANDLER_WINDUP
|
||||
/* See comment at machine_check exception, don't turn on RI */
|
||||
EXCEPTION_PROLOG_0 PACA_EXMC
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXMC, 1, 0x200, 1, 1, 0
|
||||
EXCEPTION_PROLOG_2_REAL machine_check_common, EXC_STD, 0
|
||||
INT_HANDLER machine_check, 0x200, 0, 0, 0, EXC_STD, PACA_EXMC, 0, 1, 1, 0, 1
|
||||
|
||||
EXC_COMMON_BEGIN(machine_check_common)
|
||||
/*
|
||||
|
@ -1297,18 +1154,10 @@ END_FTR_SECTION_IFSET(CPU_FTR_HVMODE)
|
|||
|
||||
|
||||
EXC_REAL_BEGIN(data_access, 0x300, 0x80)
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN
|
||||
b tramp_real_data_access
|
||||
INT_HANDLER data_access, 0x300, 1, 0, 0, EXC_STD, PACA_EXGEN, 1, 1, 1, 0, 1
|
||||
EXC_REAL_END(data_access, 0x300, 0x80)
|
||||
|
||||
TRAMP_REAL_BEGIN(tramp_real_data_access)
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, 0x300, 1, 1, 0
|
||||
EXCEPTION_PROLOG_2_REAL data_access_common, EXC_STD, 1
|
||||
|
||||
EXC_VIRT_BEGIN(data_access, 0x4300, 0x80)
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, 0x300, 1, 1, 0
|
||||
EXCEPTION_PROLOG_2_VIRT data_access_common, EXC_STD
|
||||
INT_HANDLER data_access, 0x300, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 1, 1, 0, 0
|
||||
EXC_VIRT_END(data_access, 0x4300, 0x80)
|
||||
|
||||
TRAMP_KVM_SKIP(PACA_EXGEN, 0x300)
|
||||
|
@ -1336,18 +1185,10 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
|
|||
|
||||
|
||||
EXC_REAL_BEGIN(data_access_slb, 0x380, 0x80)
|
||||
EXCEPTION_PROLOG_0 PACA_EXSLB
|
||||
b tramp_real_data_access_slb
|
||||
INT_HANDLER data_access_slb, 0x380, 1, 0, 0, 0, PACA_EXSLB, 1, 1, 0, 0, 1
|
||||
EXC_REAL_END(data_access_slb, 0x380, 0x80)
|
||||
|
||||
TRAMP_REAL_BEGIN(tramp_real_data_access_slb)
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXSLB, 1, 0x380, 1, 0, 0
|
||||
EXCEPTION_PROLOG_2_REAL data_access_slb_common, EXC_STD, 1
|
||||
|
||||
EXC_VIRT_BEGIN(data_access_slb, 0x4380, 0x80)
|
||||
EXCEPTION_PROLOG_0 PACA_EXSLB
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXSLB, 0, 0x380, 1, 0, 0
|
||||
EXCEPTION_PROLOG_2_VIRT data_access_slb_common, EXC_STD
|
||||
INT_HANDLER data_access_slb, 0x380, 0, 0, 1, 0, PACA_EXSLB, 1, 1, 0, 0, 0
|
||||
EXC_VIRT_END(data_access_slb, 0x4380, 0x80)
|
||||
|
||||
TRAMP_KVM_SKIP(PACA_EXSLB, 0x380)
|
||||
|
@ -1378,8 +1219,13 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
|
|||
b ret_from_except
|
||||
|
||||
|
||||
EXC_REAL(instruction_access, 0x400, 0x80)
|
||||
EXC_VIRT(instruction_access, 0x4400, 0x80, 0x400)
|
||||
EXC_REAL_BEGIN(instruction_access, 0x400, 0x80)
|
||||
INT_HANDLER instruction_access, 0x400, 0, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(instruction_access, 0x400, 0x80)
|
||||
EXC_VIRT_BEGIN(instruction_access, 0x4400, 0x80)
|
||||
INT_HANDLER instruction_access, 0x400, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(instruction_access, 0x4400, 0x80)
|
||||
|
||||
TRAMP_KVM(PACA_EXGEN, 0x400)
|
||||
|
||||
EXC_COMMON_BEGIN(instruction_access_common)
|
||||
|
@ -1398,8 +1244,12 @@ MMU_FTR_SECTION_ELSE
|
|||
ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
|
||||
|
||||
|
||||
__EXC_REAL(instruction_access_slb, 0x480, 0x80, PACA_EXSLB)
|
||||
__EXC_VIRT(instruction_access_slb, 0x4480, 0x80, 0x480, PACA_EXSLB)
|
||||
EXC_REAL_BEGIN(instruction_access_slb, 0x480, 0x80)
|
||||
INT_HANDLER instruction_access_slb, 0x480, 0, 0, 0, EXC_STD, PACA_EXSLB, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(instruction_access_slb, 0x480, 0x80)
|
||||
EXC_VIRT_BEGIN(instruction_access_slb, 0x4480, 0x80)
|
||||
INT_HANDLER instruction_access_slb, 0x480, 0, 0, 1, EXC_STD, PACA_EXSLB, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(instruction_access_slb, 0x4480, 0x80)
|
||||
TRAMP_KVM(PACA_EXSLB, 0x480)
|
||||
|
||||
EXC_COMMON_BEGIN(instruction_access_slb_common)
|
||||
|
@ -1426,17 +1276,11 @@ ALT_MMU_FTR_SECTION_END_IFCLR(MMU_FTR_TYPE_RADIX)
|
|||
bl do_bad_slb_fault
|
||||
b ret_from_except
|
||||
|
||||
|
||||
EXC_REAL_BEGIN(hardware_interrupt, 0x500, 0x100)
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN
|
||||
EXCEPTION_PROLOG_1 EXC_HV_OR_STD, PACA_EXGEN, 1, 0x500, 0, 0, IRQS_DISABLED
|
||||
EXCEPTION_PROLOG_2_REAL hardware_interrupt_common, EXC_HV_OR_STD, 1
|
||||
INT_HANDLER hardware_interrupt, 0x500, 0, 0, 0, EXC_HV_OR_STD, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 1
|
||||
EXC_REAL_END(hardware_interrupt, 0x500, 0x100)
|
||||
|
||||
EXC_VIRT_BEGIN(hardware_interrupt, 0x4500, 0x100)
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN
|
||||
EXCEPTION_PROLOG_1 EXC_HV_OR_STD, PACA_EXGEN, 1, 0x500, 0, 0, IRQS_DISABLED
|
||||
EXCEPTION_PROLOG_2_VIRT hardware_interrupt_common, EXC_HV_OR_STD
|
||||
INT_HANDLER hardware_interrupt, 0x500, 0, 0, 1, EXC_HV_OR_STD, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 1
|
||||
EXC_VIRT_END(hardware_interrupt, 0x4500, 0x100)
|
||||
|
||||
TRAMP_KVM(PACA_EXGEN, 0x500)
|
||||
|
@ -1445,15 +1289,10 @@ EXC_COMMON_ASYNC(hardware_interrupt_common, 0x500, do_IRQ)
|
|||
|
||||
|
||||
EXC_REAL_BEGIN(alignment, 0x600, 0x100)
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 1, 0x600, 1, 1, 0
|
||||
EXCEPTION_PROLOG_2_REAL alignment_common, EXC_STD, 1
|
||||
INT_HANDLER alignment, 0x600, 0, 0, 0, EXC_STD, PACA_EXGEN, 1, 1, 1, 0, 1
|
||||
EXC_REAL_END(alignment, 0x600, 0x100)
|
||||
|
||||
EXC_VIRT_BEGIN(alignment, 0x4600, 0x100)
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN
|
||||
EXCEPTION_PROLOG_1 EXC_STD, PACA_EXGEN, 0, 0x600, 1, 1, 0
|
||||
EXCEPTION_PROLOG_2_VIRT alignment_common, EXC_STD
|
||||
INT_HANDLER alignment, 0x600, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 1, 1, 0, 0
|
||||
EXC_VIRT_END(alignment, 0x4600, 0x100)
|
||||
|
||||
TRAMP_KVM(PACA_EXGEN, 0x600)
|
||||
|
@ -1470,8 +1309,12 @@ EXC_COMMON_BEGIN(alignment_common)
|
|||
b ret_from_except
|
||||
|
||||
|
||||
EXC_REAL(program_check, 0x700, 0x100)
|
||||
EXC_VIRT(program_check, 0x4700, 0x100, 0x700)
|
||||
EXC_REAL_BEGIN(program_check, 0x700, 0x100)
|
||||
INT_HANDLER program_check, 0x700, 0, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(program_check, 0x700, 0x100)
|
||||
EXC_VIRT_BEGIN(program_check, 0x4700, 0x100)
|
||||
INT_HANDLER program_check, 0x700, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(program_check, 0x4700, 0x100)
|
||||
TRAMP_KVM(PACA_EXGEN, 0x700)
|
||||
EXC_COMMON_BEGIN(program_check_common)
|
||||
/*
|
||||
|
@ -1508,8 +1351,12 @@ EXC_COMMON_BEGIN(program_check_common)
|
|||
b ret_from_except
|
||||
|
||||
|
||||
EXC_REAL(fp_unavailable, 0x800, 0x100)
|
||||
EXC_VIRT(fp_unavailable, 0x4800, 0x100, 0x800)
|
||||
EXC_REAL_BEGIN(fp_unavailable, 0x800, 0x100)
|
||||
INT_HANDLER fp_unavailable, 0x800, 0, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(fp_unavailable, 0x800, 0x100)
|
||||
EXC_VIRT_BEGIN(fp_unavailable, 0x4800, 0x100)
|
||||
INT_HANDLER fp_unavailable, 0x800, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(fp_unavailable, 0x4800, 0x100)
|
||||
TRAMP_KVM(PACA_EXGEN, 0x800)
|
||||
EXC_COMMON_BEGIN(fp_unavailable_common)
|
||||
EXCEPTION_COMMON(PACA_EXGEN, 0x800)
|
||||
|
@ -1542,20 +1389,32 @@ END_FTR_SECTION_IFSET(CPU_FTR_TM)
|
|||
#endif
|
||||
|
||||
|
||||
EXC_REAL_OOL_MASKABLE(decrementer, 0x900, 0x80, IRQS_DISABLED)
|
||||
EXC_VIRT_MASKABLE(decrementer, 0x4900, 0x80, 0x900, IRQS_DISABLED)
|
||||
EXC_REAL_BEGIN(decrementer, 0x900, 0x80)
|
||||
INT_HANDLER decrementer, 0x900, 1, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 1
|
||||
EXC_REAL_END(decrementer, 0x900, 0x80)
|
||||
EXC_VIRT_BEGIN(decrementer, 0x4900, 0x80)
|
||||
INT_HANDLER decrementer, 0x900, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 0
|
||||
EXC_VIRT_END(decrementer, 0x4900, 0x80)
|
||||
TRAMP_KVM(PACA_EXGEN, 0x900)
|
||||
EXC_COMMON_ASYNC(decrementer_common, 0x900, timer_interrupt)
|
||||
|
||||
|
||||
EXC_REAL_HV(hdecrementer, 0x980, 0x80)
|
||||
EXC_VIRT_HV(hdecrementer, 0x4980, 0x80, 0x980)
|
||||
EXC_REAL_BEGIN(hdecrementer, 0x980, 0x80)
|
||||
INT_HANDLER hdecrementer, 0x980, 0, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(hdecrementer, 0x980, 0x80)
|
||||
EXC_VIRT_BEGIN(hdecrementer, 0x4980, 0x80)
|
||||
INT_HANDLER hdecrementer, 0x980, 0, 0, 1, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_VIRT_END(hdecrementer, 0x4980, 0x80)
|
||||
TRAMP_KVM_HV(PACA_EXGEN, 0x980)
|
||||
EXC_COMMON(hdecrementer_common, 0x980, hdec_interrupt)
|
||||
|
||||
|
||||
EXC_REAL_MASKABLE(doorbell_super, 0xa00, 0x100, IRQS_DISABLED)
|
||||
EXC_VIRT_MASKABLE(doorbell_super, 0x4a00, 0x100, 0xa00, IRQS_DISABLED)
|
||||
EXC_REAL_BEGIN(doorbell_super, 0xa00, 0x100)
|
||||
INT_HANDLER doorbell_super, 0xa00, 0, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 1
|
||||
EXC_REAL_END(doorbell_super, 0xa00, 0x100)
|
||||
EXC_VIRT_BEGIN(doorbell_super, 0x4a00, 0x100)
|
||||
INT_HANDLER doorbell_super, 0xa00, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 0
|
||||
EXC_VIRT_END(doorbell_super, 0x4a00, 0x100)
|
||||
TRAMP_KVM(PACA_EXGEN, 0xa00)
|
||||
#ifdef CONFIG_PPC_DOORBELL
|
||||
EXC_COMMON_ASYNC(doorbell_super_common, 0xa00, doorbell_exception)
|
||||
|
@ -1669,7 +1528,6 @@ END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)
|
|||
EXC_REAL_BEGIN(system_call, 0xc00, 0x100)
|
||||
SYSTEM_CALL 0
|
||||
EXC_REAL_END(system_call, 0xc00, 0x100)
|
||||
|
||||
EXC_VIRT_BEGIN(system_call, 0x4c00, 0x100)
|
||||
SYSTEM_CALL 1
|
||||
EXC_VIRT_END(system_call, 0x4c00, 0x100)
|
||||
|
@ -1699,13 +1557,22 @@ TRAMP_KVM_BEGIN(do_kvm_0xc00)
|
|||
#endif
|
||||
|
||||
|
||||
EXC_REAL(single_step, 0xd00, 0x100)
|
||||
EXC_VIRT(single_step, 0x4d00, 0x100, 0xd00)
|
||||
EXC_REAL_BEGIN(single_step, 0xd00, 0x100)
|
||||
INT_HANDLER single_step, 0xd00, 0, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(single_step, 0xd00, 0x100)
|
||||
EXC_VIRT_BEGIN(single_step, 0x4d00, 0x100)
|
||||
INT_HANDLER single_step, 0xd00, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(single_step, 0x4d00, 0x100)
|
||||
TRAMP_KVM(PACA_EXGEN, 0xd00)
|
||||
EXC_COMMON(single_step_common, 0xd00, single_step_exception)
|
||||
|
||||
EXC_REAL_OOL_HV(h_data_storage, 0xe00, 0x20)
|
||||
EXC_VIRT_OOL_HV(h_data_storage, 0x4e00, 0x20, 0xe00)
|
||||
|
||||
EXC_REAL_BEGIN(h_data_storage, 0xe00, 0x20)
|
||||
INT_HANDLER h_data_storage, 0xe00, 1, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(h_data_storage, 0xe00, 0x20)
|
||||
EXC_VIRT_BEGIN(h_data_storage, 0x4e00, 0x20)
|
||||
INT_HANDLER h_data_storage, 0xe00, 1, 0, 1, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_VIRT_END(h_data_storage, 0x4e00, 0x20)
|
||||
TRAMP_KVM_HV_SKIP(PACA_EXGEN, 0xe00)
|
||||
EXC_COMMON_BEGIN(h_data_storage_common)
|
||||
mfspr r10,SPRN_HDAR
|
||||
|
@ -1729,14 +1596,22 @@ ALT_MMU_FTR_SECTION_END_IFSET(MMU_FTR_TYPE_RADIX)
|
|||
b ret_from_except
|
||||
|
||||
|
||||
EXC_REAL_OOL_HV(h_instr_storage, 0xe20, 0x20)
|
||||
EXC_VIRT_OOL_HV(h_instr_storage, 0x4e20, 0x20, 0xe20)
|
||||
EXC_REAL_BEGIN(h_instr_storage, 0xe20, 0x20)
|
||||
INT_HANDLER h_instr_storage, 0xe20, 1, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(h_instr_storage, 0xe20, 0x20)
|
||||
EXC_VIRT_BEGIN(h_instr_storage, 0x4e20, 0x20)
|
||||
INT_HANDLER h_instr_storage, 0xe20, 1, 0, 1, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_VIRT_END(h_instr_storage, 0x4e20, 0x20)
|
||||
TRAMP_KVM_HV(PACA_EXGEN, 0xe20)
|
||||
EXC_COMMON(h_instr_storage_common, 0xe20, unknown_exception)
|
||||
|
||||
|
||||
EXC_REAL_OOL_HV(emulation_assist, 0xe40, 0x20)
|
||||
EXC_VIRT_OOL_HV(emulation_assist, 0x4e40, 0x20, 0xe40)
|
||||
EXC_REAL_BEGIN(emulation_assist, 0xe40, 0x20)
|
||||
INT_HANDLER emulation_assist, 0xe40, 1, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(emulation_assist, 0xe40, 0x20)
|
||||
EXC_VIRT_BEGIN(emulation_assist, 0x4e40, 0x20)
|
||||
INT_HANDLER emulation_assist, 0xe40, 1, 0, 1, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_VIRT_END(emulation_assist, 0x4e40, 0x20)
|
||||
TRAMP_KVM_HV(PACA_EXGEN, 0xe40)
|
||||
EXC_COMMON(emulation_assist_common, 0xe40, emulation_assist_interrupt)
|
||||
|
||||
|
@ -1747,15 +1622,10 @@ EXC_COMMON(emulation_assist_common, 0xe40, emulation_assist_interrupt)
|
|||
* mode.
|
||||
*/
|
||||
EXC_REAL_BEGIN(hmi_exception, 0xe60, 0x20)
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN
|
||||
b hmi_exception_early
|
||||
INT_HANDLER hmi_exception, 0xe60, 1, 1, 0, EXC_HV, PACA_EXGEN, 0, 0, 0, 0, 1
|
||||
EXC_REAL_END(hmi_exception, 0xe60, 0x20)
|
||||
EXC_VIRT_NONE(0x4e60, 0x20)
|
||||
TRAMP_KVM_HV(PACA_EXGEN, 0xe60)
|
||||
TRAMP_REAL_BEGIN(hmi_exception_early)
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, 0xe60, 0, 0, 0
|
||||
mfctr r10 /* save ctr, even for !RELOCATABLE */
|
||||
BRANCH_TO_C000(r11, hmi_exception_early_common)
|
||||
|
||||
EXC_COMMON_BEGIN(hmi_exception_early_common)
|
||||
mtctr r10 /* Restore ctr */
|
||||
|
@ -1782,9 +1652,7 @@ EXC_COMMON_BEGIN(hmi_exception_early_common)
|
|||
* firmware.
|
||||
*/
|
||||
EXCEPTION_RESTORE_REGS EXC_HV
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 1, 0xe60, 0, 0, IRQS_DISABLED
|
||||
EXCEPTION_PROLOG_2_REAL hmi_exception_common, EXC_HV, 1
|
||||
INT_HANDLER hmi_exception, 0xe60, 0, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 1
|
||||
|
||||
EXC_COMMON_BEGIN(hmi_exception_common)
|
||||
EXCEPTION_COMMON(PACA_EXGEN, 0xe60)
|
||||
|
@ -1796,8 +1664,13 @@ EXC_COMMON_BEGIN(hmi_exception_common)
|
|||
bl handle_hmi_exception
|
||||
b ret_from_except
|
||||
|
||||
EXC_REAL_OOL_MASKABLE_HV(h_doorbell, 0xe80, 0x20, IRQS_DISABLED)
|
||||
EXC_VIRT_OOL_MASKABLE_HV(h_doorbell, 0x4e80, 0x20, 0xe80, IRQS_DISABLED)
|
||||
|
||||
EXC_REAL_BEGIN(h_doorbell, 0xe80, 0x20)
|
||||
INT_HANDLER h_doorbell, 0xe80, 1, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 1
|
||||
EXC_REAL_END(h_doorbell, 0xe80, 0x20)
|
||||
EXC_VIRT_BEGIN(h_doorbell, 0x4e80, 0x20)
|
||||
INT_HANDLER h_doorbell, 0xe80, 1, 0, 1, EXC_HV, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 1
|
||||
EXC_VIRT_END(h_doorbell, 0x4e80, 0x20)
|
||||
TRAMP_KVM_HV(PACA_EXGEN, 0xe80)
|
||||
#ifdef CONFIG_PPC_DOORBELL
|
||||
EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, doorbell_exception)
|
||||
|
@ -1806,8 +1679,12 @@ EXC_COMMON_ASYNC(h_doorbell_common, 0xe80, unknown_exception)
|
|||
#endif
|
||||
|
||||
|
||||
EXC_REAL_OOL_MASKABLE_HV(h_virt_irq, 0xea0, 0x20, IRQS_DISABLED)
|
||||
EXC_VIRT_OOL_MASKABLE_HV(h_virt_irq, 0x4ea0, 0x20, 0xea0, IRQS_DISABLED)
|
||||
EXC_REAL_BEGIN(h_virt_irq, 0xea0, 0x20)
|
||||
INT_HANDLER h_virt_irq, 0xea0, 1, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 1
|
||||
EXC_REAL_END(h_virt_irq, 0xea0, 0x20)
|
||||
EXC_VIRT_BEGIN(h_virt_irq, 0x4ea0, 0x20)
|
||||
INT_HANDLER h_virt_irq, 0xea0, 1, 0, 1, EXC_HV, PACA_EXGEN, 1, 0, 0, IRQS_DISABLED, 1
|
||||
EXC_VIRT_END(h_virt_irq, 0x4ea0, 0x20)
|
||||
TRAMP_KVM_HV(PACA_EXGEN, 0xea0)
|
||||
EXC_COMMON_ASYNC(h_virt_irq_common, 0xea0, do_IRQ)
|
||||
|
||||
|
@ -1818,14 +1695,22 @@ EXC_REAL_NONE(0xee0, 0x20)
|
|||
EXC_VIRT_NONE(0x4ee0, 0x20)
|
||||
|
||||
|
||||
EXC_REAL_OOL_MASKABLE(performance_monitor, 0xf00, 0x20, IRQS_PMI_DISABLED)
|
||||
EXC_VIRT_OOL_MASKABLE(performance_monitor, 0x4f00, 0x20, 0xf00, IRQS_PMI_DISABLED)
|
||||
EXC_REAL_BEGIN(performance_monitor, 0xf00, 0x20)
|
||||
INT_HANDLER performance_monitor, 0xf00, 1, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, IRQS_PMI_DISABLED, 1
|
||||
EXC_REAL_END(performance_monitor, 0xf00, 0x20)
|
||||
EXC_VIRT_BEGIN(performance_monitor, 0x4f00, 0x20)
|
||||
INT_HANDLER performance_monitor, 0xf00, 1, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, IRQS_PMI_DISABLED, 0
|
||||
EXC_VIRT_END(performance_monitor, 0x4f00, 0x20)
|
||||
TRAMP_KVM(PACA_EXGEN, 0xf00)
|
||||
EXC_COMMON_ASYNC(performance_monitor_common, 0xf00, performance_monitor_exception)
|
||||
|
||||
|
||||
EXC_REAL_OOL(altivec_unavailable, 0xf20, 0x20)
|
||||
EXC_VIRT_OOL(altivec_unavailable, 0x4f20, 0x20, 0xf20)
|
||||
EXC_REAL_BEGIN(altivec_unavailable, 0xf20, 0x20)
|
||||
INT_HANDLER altivec_unavailable, 0xf20, 1, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(altivec_unavailable, 0xf20, 0x20)
|
||||
EXC_VIRT_BEGIN(altivec_unavailable, 0x4f20, 0x20)
|
||||
INT_HANDLER altivec_unavailable, 0xf20, 1, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(altivec_unavailable, 0x4f20, 0x20)
|
||||
TRAMP_KVM(PACA_EXGEN, 0xf20)
|
||||
EXC_COMMON_BEGIN(altivec_unavailable_common)
|
||||
EXCEPTION_COMMON(PACA_EXGEN, 0xf20)
|
||||
|
@ -1861,8 +1746,12 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
|
|||
b ret_from_except
|
||||
|
||||
|
||||
EXC_REAL_OOL(vsx_unavailable, 0xf40, 0x20)
|
||||
EXC_VIRT_OOL(vsx_unavailable, 0x4f40, 0x20, 0xf40)
|
||||
EXC_REAL_BEGIN(vsx_unavailable, 0xf40, 0x20)
|
||||
INT_HANDLER vsx_unavailable, 0xf40, 1, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(vsx_unavailable, 0xf40, 0x20)
|
||||
EXC_VIRT_BEGIN(vsx_unavailable, 0x4f40, 0x20)
|
||||
INT_HANDLER vsx_unavailable, 0xf40, 1, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(vsx_unavailable, 0x4f40, 0x20)
|
||||
TRAMP_KVM(PACA_EXGEN, 0xf40)
|
||||
EXC_COMMON_BEGIN(vsx_unavailable_common)
|
||||
EXCEPTION_COMMON(PACA_EXGEN, 0xf40)
|
||||
|
@ -1897,14 +1786,22 @@ END_FTR_SECTION_IFSET(CPU_FTR_VSX)
|
|||
b ret_from_except
|
||||
|
||||
|
||||
EXC_REAL_OOL(facility_unavailable, 0xf60, 0x20)
|
||||
EXC_VIRT_OOL(facility_unavailable, 0x4f60, 0x20, 0xf60)
|
||||
EXC_REAL_BEGIN(facility_unavailable, 0xf60, 0x20)
|
||||
INT_HANDLER facility_unavailable, 0xf60, 1, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(facility_unavailable, 0xf60, 0x20)
|
||||
EXC_VIRT_BEGIN(facility_unavailable, 0x4f60, 0x20)
|
||||
INT_HANDLER facility_unavailable, 0xf60, 1, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(facility_unavailable, 0x4f60, 0x20)
|
||||
TRAMP_KVM(PACA_EXGEN, 0xf60)
|
||||
EXC_COMMON(facility_unavailable_common, 0xf60, facility_unavailable_exception)
|
||||
|
||||
|
||||
EXC_REAL_OOL_HV(h_facility_unavailable, 0xf80, 0x20)
|
||||
EXC_VIRT_OOL_HV(h_facility_unavailable, 0x4f80, 0x20, 0xf80)
|
||||
EXC_REAL_BEGIN(h_facility_unavailable, 0xf80, 0x20)
|
||||
INT_HANDLER h_facility_unavailable, 0xf80, 1, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(h_facility_unavailable, 0xf80, 0x20)
|
||||
EXC_VIRT_BEGIN(h_facility_unavailable, 0x4f80, 0x20)
|
||||
INT_HANDLER h_facility_unavailable, 0xf80, 1, 0, 1, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_VIRT_END(h_facility_unavailable, 0x4f80, 0x20)
|
||||
TRAMP_KVM_HV(PACA_EXGEN, 0xf80)
|
||||
EXC_COMMON(h_facility_unavailable_common, 0xf80, facility_unavailable_exception)
|
||||
|
||||
|
@ -1922,7 +1819,9 @@ EXC_REAL_NONE(0x1100, 0x100)
|
|||
EXC_VIRT_NONE(0x5100, 0x100)
|
||||
|
||||
#ifdef CONFIG_CBE_RAS
|
||||
EXC_REAL_HV(cbe_system_error, 0x1200, 0x100)
|
||||
EXC_REAL_BEGIN(cbe_system_error, 0x1200, 0x100)
|
||||
INT_HANDLER cbe_system_error, 0x1200, 1, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(cbe_system_error, 0x1200, 0x100)
|
||||
EXC_VIRT_NONE(0x5200, 0x100)
|
||||
TRAMP_KVM_HV_SKIP(PACA_EXGEN, 0x1200)
|
||||
EXC_COMMON(cbe_system_error_common, 0x1200, cbe_system_error_exception)
|
||||
|
@ -1932,24 +1831,26 @@ EXC_VIRT_NONE(0x5200, 0x100)
|
|||
#endif
|
||||
|
||||
|
||||
EXC_REAL(instruction_breakpoint, 0x1300, 0x100)
|
||||
EXC_VIRT(instruction_breakpoint, 0x5300, 0x100, 0x1300)
|
||||
EXC_REAL_BEGIN(instruction_breakpoint, 0x1300, 0x100)
|
||||
INT_HANDLER instruction_breakpoint, 0x1300, 0, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(instruction_breakpoint, 0x1300, 0x100)
|
||||
EXC_VIRT_BEGIN(instruction_breakpoint, 0x5300, 0x100)
|
||||
INT_HANDLER instruction_breakpoint, 0x1300, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(instruction_breakpoint, 0x5300, 0x100)
|
||||
TRAMP_KVM_SKIP(PACA_EXGEN, 0x1300)
|
||||
EXC_COMMON(instruction_breakpoint_common, 0x1300, instruction_breakpoint_exception)
|
||||
|
||||
|
||||
EXC_REAL_NONE(0x1400, 0x100)
|
||||
EXC_VIRT_NONE(0x5400, 0x100)
|
||||
|
||||
EXC_REAL_BEGIN(denorm_exception_hv, 0x1500, 0x100)
|
||||
EXCEPTION_PROLOG_0 PACA_EXGEN
|
||||
EXCEPTION_PROLOG_1 EXC_HV, PACA_EXGEN, 0, 0x1500, 0, 0, 0
|
||||
|
||||
INT_HANDLER denorm_exception_hv, 0x1500, 0, 2, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
#ifdef CONFIG_PPC_DENORMALISATION
|
||||
mfspr r10,SPRN_HSRR1
|
||||
andis. r10,r10,(HSRR1_DENORM)@h /* denorm? */
|
||||
bne+ denorm_assist
|
||||
#endif
|
||||
|
||||
KVMTEST EXC_HV 0x1500
|
||||
EXCEPTION_PROLOG_2_REAL denorm_common, EXC_HV, 1
|
||||
EXC_REAL_END(denorm_exception_hv, 0x1500, 0x100)
|
||||
|
@ -2037,7 +1938,9 @@ EXC_COMMON(denorm_common, 0x1500, unknown_exception)
|
|||
|
||||
|
||||
#ifdef CONFIG_CBE_RAS
|
||||
EXC_REAL_HV(cbe_maintenance, 0x1600, 0x100)
|
||||
EXC_REAL_BEGIN(cbe_maintenance, 0x1600, 0x100)
|
||||
INT_HANDLER cbe_maintenance, 0x1600, 1, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(cbe_maintenance, 0x1600, 0x100)
|
||||
EXC_VIRT_NONE(0x5600, 0x100)
|
||||
TRAMP_KVM_HV_SKIP(PACA_EXGEN, 0x1600)
|
||||
EXC_COMMON(cbe_maintenance_common, 0x1600, cbe_maintenance_exception)
|
||||
|
@ -2047,8 +1950,12 @@ EXC_VIRT_NONE(0x5600, 0x100)
|
|||
#endif
|
||||
|
||||
|
||||
EXC_REAL(altivec_assist, 0x1700, 0x100)
|
||||
EXC_VIRT(altivec_assist, 0x5700, 0x100, 0x1700)
|
||||
EXC_REAL_BEGIN(altivec_assist, 0x1700, 0x100)
|
||||
INT_HANDLER altivec_assist, 0x1700, 0, 0, 0, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(altivec_assist, 0x1700, 0x100)
|
||||
EXC_VIRT_BEGIN(altivec_assist, 0x5700, 0x100)
|
||||
INT_HANDLER altivec_assist, 0x1700, 0, 0, 1, EXC_STD, PACA_EXGEN, 1, 0, 0, 0, 0
|
||||
EXC_VIRT_END(altivec_assist, 0x5700, 0x100)
|
||||
TRAMP_KVM(PACA_EXGEN, 0x1700)
|
||||
#ifdef CONFIG_ALTIVEC
|
||||
EXC_COMMON(altivec_assist_common, 0x1700, altivec_assist_exception)
|
||||
|
@ -2058,7 +1965,9 @@ EXC_COMMON(altivec_assist_common, 0x1700, unknown_exception)
|
|||
|
||||
|
||||
#ifdef CONFIG_CBE_RAS
|
||||
EXC_REAL_HV(cbe_thermal, 0x1800, 0x100)
|
||||
EXC_REAL_BEGIN(cbe_thermal, 0x1800, 0x100)
|
||||
INT_HANDLER cbe_thermal, 0x1800, 1, 0, 0, EXC_HV, PACA_EXGEN, 1, 0, 0, 0, 1
|
||||
EXC_REAL_END(cbe_thermal, 0x1800, 0x100)
|
||||
EXC_VIRT_NONE(0x5800, 0x100)
|
||||
TRAMP_KVM_HV_SKIP(PACA_EXGEN, 0x1800)
|
||||
EXC_COMMON(cbe_thermal_common, 0x1800, cbe_thermal_exception)
|
||||
|
@ -2067,6 +1976,7 @@ EXC_REAL_NONE(0x1800, 0x100)
|
|||
EXC_VIRT_NONE(0x5800, 0x100)
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef CONFIG_PPC_WATCHDOG
|
||||
|
||||
#define MASKED_DEC_HANDLER_LABEL 3f
|
||||
|
|
Loading…
Reference in New Issue