| From c2b32c8ebc9ba8914d5dee83d9aee46107d1ce4d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 31 Jul 2018 07:39:21 -0700 |
| Subject: KVM: PPC: Book3S PR: Exiting split hack mode needs to fixup both PC |
| and LR |
| |
| From: Cameron Kaiser <spectre@floodgap.com> |
| |
| [ Upstream commit 1006284c5e411872333967b1970c2ca46a9e225f ] |
| |
| When an OS (currently only classic Mac OS) is running in KVM-PR and makes a |
| linked jump from code with split hack addressing enabled into code that does |
| not, LR is not correctly updated and reflects the previously munged PC. |
| |
| To fix this, this patch undoes the address munge when exiting split |
| hack mode so that code relying on LR being a proper address will now |
| execute. This does not affect OS X or other operating systems running |
| on KVM-PR. |
| |
| Signed-off-by: Cameron Kaiser <spectre@floodgap.com> |
| Signed-off-by: Paul Mackerras <paulus@ozlabs.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/powerpc/kvm/book3s.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c |
| index 73c3c127d8584..209cad89a11a5 100644 |
| --- a/arch/powerpc/kvm/book3s.c |
| +++ b/arch/powerpc/kvm/book3s.c |
| @@ -78,8 +78,11 @@ void kvmppc_unfixup_split_real(struct kvm_vcpu *vcpu) |
| { |
| if (vcpu->arch.hflags & BOOK3S_HFLAG_SPLIT_HACK) { |
| ulong pc = kvmppc_get_pc(vcpu); |
| + ulong lr = kvmppc_get_lr(vcpu); |
| if ((pc & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS) |
| kvmppc_set_pc(vcpu, pc & ~SPLIT_HACK_MASK); |
| + if ((lr & SPLIT_HACK_MASK) == SPLIT_HACK_OFFS) |
| + kvmppc_set_lr(vcpu, lr & ~SPLIT_HACK_MASK); |
| vcpu->arch.hflags &= ~BOOK3S_HFLAG_SPLIT_HACK; |
| } |
| } |
| -- |
| 2.20.1 |
| |