Merge tag 'powerpc-4.13-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc fixes from Michael Ellerman: "A handful of fixes, mostly for new code: - some reworking of the new STRICT_KERNEL_RWX support to make sure we also remove executable permission from __init memory before it's freed. - a fix to some recent optimisations to the hypercall entry where we were clobbering r12, this was breaking nested guests (PR KVM). - a fix for the recent patch to opal_configure_cores(). This could break booting on bare metal Power8 boxes if the kernel was built without CONFIG_JUMP_LABEL_FEATURE_CHECK_DEBUG. - .. and finally a workaround for spurious PMU interrupts on Power9 DD2. Thanks to: Nicholas Piggin, Anton Blanchard, Balbir Singh" * tag 'powerpc-4.13-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/mm: Mark __init memory no-execute when STRICT_KERNEL_RWX=y powerpc/mm/hash: Refactor hash__mark_rodata_ro() powerpc/mm/radix: Refactor radix__mark_rodata_ro() powerpc/64s: Fix hypercall entry clobbering r12 input powerpc/perf: Avoid spurious PMU interrupts after idle powerpc/powernv: Fix boot on Power8 bare metal due to opal_configure_cores()
This commit is contained in:
@@ -824,7 +824,7 @@ EXC_COMMON(trap_0b_common, 0xb00, unknown_exception)
|
||||
* r3 volatile parameter and return value for status
|
||||
* r4-r10 volatile input and output value
|
||||
* r11 volatile hypercall number and output value
|
||||
* r12 volatile
|
||||
* r12 volatile input and output value
|
||||
* r13-r31 nonvolatile
|
||||
* LR nonvolatile
|
||||
* CTR volatile
|
||||
@@ -834,25 +834,26 @@ EXC_COMMON(trap_0b_common, 0xb00, unknown_exception)
|
||||
* Other registers nonvolatile
|
||||
*
|
||||
* The intersection of volatile registers that don't contain possible
|
||||
* inputs is: r12, cr0, xer, ctr. We may use these as scratch regs
|
||||
* upon entry without saving.
|
||||
* inputs is: cr0, xer, ctr. We may use these as scratch regs upon entry
|
||||
* without saving, though xer is not a good idea to use, as hardware may
|
||||
* interpret some bits so it may be costly to change them.
|
||||
*/
|
||||
#ifdef CONFIG_KVM_BOOK3S_64_HANDLER
|
||||
/*
|
||||
* There is a little bit of juggling to get syscall and hcall
|
||||
* working well. Save r10 in ctr to be restored in case it is a
|
||||
* hcall.
|
||||
* working well. Save r13 in ctr to avoid using SPRG scratch
|
||||
* register.
|
||||
*
|
||||
* Userspace syscalls have already saved the PPR, hcalls must save
|
||||
* it before setting HMT_MEDIUM.
|
||||
*/
|
||||
#define SYSCALL_KVMTEST \
|
||||
mr r12,r13; \
|
||||
mtctr r13; \
|
||||
GET_PACA(r13); \
|
||||
mtctr r10; \
|
||||
std r10,PACA_EXGEN+EX_R10(r13); \
|
||||
KVMTEST_PR(0xc00); /* uses r10, branch to do_kvm_0xc00_system_call */ \
|
||||
HMT_MEDIUM; \
|
||||
mr r9,r12; \
|
||||
mfctr r9;
|
||||
|
||||
#else
|
||||
#define SYSCALL_KVMTEST \
|
||||
@@ -935,8 +936,8 @@ EXC_VIRT_END(system_call, 0x4c00, 0x100)
|
||||
* This is a hcall, so register convention is as above, with these
|
||||
* differences:
|
||||
* r13 = PACA
|
||||
* r12 = orig r13
|
||||
* ctr = orig r10
|
||||
* ctr = orig r13
|
||||
* orig r10 saved in PACA
|
||||
*/
|
||||
TRAMP_KVM_BEGIN(do_kvm_0xc00)
|
||||
/*
|
||||
@@ -944,14 +945,13 @@ TRAMP_KVM_BEGIN(do_kvm_0xc00)
|
||||
* HMT_MEDIUM. That allows the KVM code to save that value into the
|
||||
* guest state (it is the guest's PPR value).
|
||||
*/
|
||||
OPT_GET_SPR(r0, SPRN_PPR, CPU_FTR_HAS_PPR)
|
||||
OPT_GET_SPR(r10, SPRN_PPR, CPU_FTR_HAS_PPR)
|
||||
HMT_MEDIUM
|
||||
OPT_SAVE_REG_TO_PACA(PACA_EXGEN+EX_PPR, r0, CPU_FTR_HAS_PPR)
|
||||
OPT_SAVE_REG_TO_PACA(PACA_EXGEN+EX_PPR, r10, CPU_FTR_HAS_PPR)
|
||||
mfctr r10
|
||||
SET_SCRATCH0(r12)
|
||||
SET_SCRATCH0(r10)
|
||||
std r9,PACA_EXGEN+EX_R9(r13)
|
||||
mfcr r9
|
||||
std r10,PACA_EXGEN+EX_R10(r13)
|
||||
KVM_HANDLER(PACA_EXGEN, EXC_STD, 0xc00)
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user