[PATCH 21/27] KVM: PPC: Emulate segment fault

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Alexander Graf
Date: Thursday, April 15, 2010 - 3:11 pm

Book3S_32 doesn't know about segment faults. It only knows about page faults.
So in order to know that we didn't map a segment, we need to fake segment
faults.

We do this by setting invalid segment registers to an invalid VSID and then
check for that VSID on normal page faults.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 arch/powerpc/kvm/book3s.c |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c
index b917b97..178ddd4 100644
--- a/arch/powerpc/kvm/book3s.c
+++ b/arch/powerpc/kvm/book3s.c
@@ -774,6 +774,18 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	switch (exit_nr) {
 	case BOOK3S_INTERRUPT_INST_STORAGE:
 		vcpu->stat.pf_instruc++;
+
+#ifdef CONFIG_PPC_BOOK3S_32
+		/* We set segments as unused segments when invalidating them. So
+		 * treat the respective fault as segment fault. */
+		if (to_svcpu(vcpu)->sr[kvmppc_get_pc(vcpu) >> SID_SHIFT]
+		    == SR_INVALID) {
+			kvmppc_mmu_map_segment(vcpu, kvmppc_get_pc(vcpu));
+			r = RESUME_GUEST;
+			break;
+		}
+#endif
+
 		/* only care about PTEG not found errors, but leave NX alone */
 		if (to_svcpu(vcpu)->shadow_srr1 & 0x40000000) {
 			r = kvmppc_handle_pagefault(run, vcpu, kvmppc_get_pc(vcpu), exit_nr);
@@ -798,6 +810,17 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
 	{
 		ulong dar = kvmppc_get_fault_dar(vcpu);
 		vcpu->stat.pf_storage++;
+
+#ifdef CONFIG_PPC_BOOK3S_32
+		/* We set segments as unused segments when invalidating them. So
+		 * treat the respective fault as segment fault. */
+		if ((to_svcpu(vcpu)->sr[dar >> SID_SHIFT]) == SR_INVALID) {
+			kvmppc_mmu_map_segment(vcpu, dar);
+			r = RESUME_GUEST;
+			break;
+		}
+#endif
+
 		/* The only case we need to handle is missing shadow PTEs */
 		if (to_svcpu(vcpu)->fault_dsisr & DSISR_NOHPTE) {
 			r = kvmppc_handle_pagefault(run, vcpu, dar, exit_nr);
-- 
1.6.0.2

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH 00/27] Book3S_32 (PPC32) KVM support, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 01/27] KVM: PPC: Name generic 64-bit code generic, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 02/27] KVM: PPC: Add host MMU Support, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 03/27] KVM: PPC: Add SR swapping code, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 04/27] KVM: PPC: Add generic segment switching code, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 05/27] PPC: Split context init/destroy functions, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 06/27] KVM: PPC: Add kvm_book3s_64.h, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 07/27] KVM: PPC: Add kvm_book3s_32.h, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 08/27] KVM: PPC: Add fields to shadow vcpu, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 09/27] KVM: PPC: Improve indirect svcpu accessors, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 10/27] KVM: PPC: Use KVM_BOOK3S_HANDLER, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 11/27] KVM: PPC: Use CONFIG_PPC_BOOK3S define, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 12/27] PPC: Add STLU, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 13/27] KVM: PPC: Use now shadowed vcpu fields, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 14/27] KVM: PPC: Extract MMU init, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 15/27] KVM: PPC: Make real mode handler generic, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 16/27] KVM: PPC: Make highmem code generic, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 18/27] KVM: PPC: Release clean pages as clean, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 19/27] KVM: PPC: Remove fetch fail code, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 20/27] KVM: PPC: Add SVCPU to Book3S_32, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 21/27] KVM: PPC: Emulate segment fault, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 22/27] KVM: PPC: Add Book3S compatibility code, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 23/27] KVM: PPC: Export MMU variables, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 24/27] PPC: Export SWITCH_FRAME_SIZE, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 25/27] KVM: PPC: Check max IRQ prio, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 26/27] KVM: PPC: Add KVM intercept handlers, Alexander Graf, (Thu Apr 15, 3:11 pm)
[PATCH 27/27] KVM: PPC: Enable Book3S_32 KVM building, Alexander Graf, (Thu Apr 15, 3:11 pm)
Re: [PATCH 05/27] PPC: Split context init/destroy functions, Benjamin Herrenschmidt, (Thu Apr 15, 11:46 pm)
Re: [PATCH 12/27] PPC: Add STLU, Benjamin Herrenschmidt, (Thu Apr 15, 11:47 pm)
Re: [PATCH 23/27] KVM: PPC: Export MMU variables, Benjamin Herrenschmidt, (Thu Apr 15, 11:47 pm)
Re: [PATCH 24/27] PPC: Export SWITCH_FRAME_SIZE, Benjamin Herrenschmidt, (Thu Apr 15, 11:48 pm)
Re: [PATCH 26/27] KVM: PPC: Add KVM intercept handlers, Benjamin Herrenschmidt, (Thu Apr 15, 11:48 pm)
Re: [PATCH 23/27] KVM: PPC: Export MMU variables, Alexander Graf, (Fri Apr 16, 2:07 am)
Re: [PATCH 23/27] KVM: PPC: Export MMU variables, Benjamin Herrenschmidt, (Fri Apr 16, 2:22 am)
Re: [PATCH 23/27] KVM: PPC: Export MMU variables, Alexander Graf, (Fri Apr 16, 2:25 am)
Re: [PATCH 23/27] KVM: PPC: Export MMU variables, Alexander Graf, (Fri Apr 16, 2:31 am)
Re: [PATCH 23/27] KVM: PPC: Export MMU variables, Alexander Graf, (Fri Apr 16, 4:18 am)
Re: [PATCH 00/27] Book3S_32 (PPC32) KVM support, Avi Kivity, (Wed Apr 21, 2:42 am)