mirror of
https://github.com/Dasharo/linux.git
synced 2026-03-06 15:25:10 -08:00
powerpc/64s/exception: Move KVM test to common code
This allows more code to be moved out of unrelocated regions. The system call KVMTEST is changed to be open-coded and remain in the tramp area to avoid having to move it to entry_64.S. The custom nature of the system call entry code means the hcall case can be made more streamlined than regular interrupt handlers. mpe: Incorporate fix from Nick: Moving KVM test to the common entry code missed the case of HMI and MCE, which do not do __GEN_COMMON_ENTRY (because they don't want to switch to virt mode). This means a MCE or HMI exception that is taken while KVM is running a guest context will not be switched out of that context, and KVM won't be notified. Found by running sigfuz in guest with patched host on POWER9 DD2.3, which causes some TM related HMI interrupts (which are expected and supposed to be handled by KVM). This fix adds a __GEN_REALMODE_COMMON_ENTRY for those handlers to add the KVM test. This makes them look a little more like other handlers that all use __GEN_COMMON_ENTRY. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200225173541.1549955-13-npiggin@gmail.com
This commit is contained in:
committed by
Michael Ellerman
parent
0eddf327e1
commit
9600f261ac
File diff suppressed because it is too large
Load Diff
@@ -1266,7 +1266,6 @@ kvmppc_interrupt_hv:
|
||||
* R12 = (guest CR << 32) | interrupt vector
|
||||
* R13 = PACA
|
||||
* guest R12 saved in shadow VCPU SCRATCH0
|
||||
* guest CTR saved in shadow VCPU SCRATCH1 if RELOCATABLE
|
||||
* guest R13 saved in SPRN_SCRATCH0
|
||||
*/
|
||||
std r9, HSTATE_SCRATCH2(r13)
|
||||
@@ -1367,12 +1366,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR)
|
||||
11: stw r3,VCPU_HEIR(r9)
|
||||
|
||||
/* these are volatile across C function calls */
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
ld r3, HSTATE_SCRATCH1(r13)
|
||||
mtctr r3
|
||||
#else
|
||||
mfctr r3
|
||||
#endif
|
||||
mfxer r4
|
||||
std r3, VCPU_CTR(r9)
|
||||
std r4, VCPU_XER(r9)
|
||||
@@ -3258,7 +3252,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_P9_TM_HV_ASSIST)
|
||||
* r12 is (CR << 32) | vector
|
||||
* r13 points to our PACA
|
||||
* r12 is saved in HSTATE_SCRATCH0(r13)
|
||||
* ctr is saved in HSTATE_SCRATCH1(r13) if RELOCATABLE
|
||||
* r9 is saved in HSTATE_SCRATCH2(r13)
|
||||
* r13 is saved in HSPRG1
|
||||
* cfar is saved in HSTATE_CFAR(r13)
|
||||
@@ -3307,11 +3300,7 @@ kvmppc_bad_host_intr:
|
||||
ld r5, HSTATE_CFAR(r13)
|
||||
std r5, ORIG_GPR3(r1)
|
||||
mflr r3
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
ld r4, HSTATE_SCRATCH1(r13)
|
||||
#else
|
||||
mfctr r4
|
||||
#endif
|
||||
mfxer r5
|
||||
lbz r6, PACAIRQSOFTMASK(r13)
|
||||
std r3, _LINK(r1)
|
||||
|
||||
@@ -167,16 +167,9 @@ kvmppc_interrupt_pr:
|
||||
* R12 = (guest CR << 32) | exit handler id
|
||||
* R13 = PACA
|
||||
* HSTATE.SCRATCH0 = guest R12
|
||||
* HSTATE.SCRATCH1 = guest CTR if RELOCATABLE
|
||||
*/
|
||||
#ifdef CONFIG_PPC64
|
||||
/* Match 32-bit entry */
|
||||
#ifdef CONFIG_RELOCATABLE
|
||||
std r9, HSTATE_SCRATCH2(r13)
|
||||
ld r9, HSTATE_SCRATCH1(r13)
|
||||
mtctr r9
|
||||
ld r9, HSTATE_SCRATCH2(r13)
|
||||
#endif
|
||||
rotldi r12, r12, 32 /* Flip R12 halves for stw */
|
||||
stw r12, HSTATE_SCRATCH1(r13) /* CR is now in the low half */
|
||||
srdi r12, r12, 32 /* shift trap into low half */
|
||||
|
||||
Reference in New Issue
Block a user