From: Marcelo Tosatti <mtosatti@redhat.com>
To: Avi Kivity <avi@qumranet.com>
Cc: kvm@vger.kernel.org, Marcelo Tosatti <mtosatti@redhat.com>
Subject: [patch 3/3] KVM: task switch: check for segment base translation failure
Date: Sat, 19 Jul 2008 19:08:09 -0300 [thread overview]
Message-ID: <20080719220933.000583030@localhost.localdomain> (raw)
In-Reply-To: 20080719220806.152409866@localhost.localdomain
[-- Attachment #1: task-switch-checks-2 --]
[-- Type: text/plain, Size: 2768 bytes --]
Subject says it all.
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Index: kvm-vmx-checks/arch/x86/kvm/x86.c
===================================================================
--- kvm-vmx-checks.orig/arch/x86/kvm/x86.c
+++ kvm-vmx-checks/arch/x86/kvm/x86.c
@@ -3253,6 +3253,8 @@ static int load_guest_segment_descriptor
return 1;
}
gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, dtable.base);
+ if (gpa == UNMAPPED_GVA)
+ return 1;
gpa += index * 8;
return kvm_read_guest(vcpu->kvm, gpa, seg_desc, 8);
}
@@ -3270,11 +3272,13 @@ static int save_guest_segment_descriptor
if (dtable.limit < index * 8 + 7)
return 1;
gpa = vcpu->arch.mmu.gva_to_gpa(vcpu, dtable.base);
+ if (gpa == UNMAPPED_GVA)
+ return 1;
gpa += index * 8;
return kvm_write_guest(vcpu->kvm, gpa, seg_desc, 8);
}
-static u32 get_tss_base_addr(struct kvm_vcpu *vcpu,
+static gpa_t get_tss_base_addr(struct kvm_vcpu *vcpu,
struct desc_struct *seg_desc)
{
u32 base_addr;
@@ -3446,8 +3450,13 @@ static int kvm_task_switch_16(struct kvm
struct desc_struct *nseg_desc)
{
struct tss_segment_16 tss_segment_16;
+ gpa_t tss_base;
int ret = 0;
+ tss_base = get_tss_base_addr(vcpu, nseg_desc);
+ if (tss_base == UNMAPPED_GVA)
+ goto out;
+
if (kvm_read_guest(vcpu->kvm, old_tss_base, &tss_segment_16,
sizeof tss_segment_16))
goto out;
@@ -3458,8 +3467,8 @@ static int kvm_task_switch_16(struct kvm
sizeof tss_segment_16))
goto out;
- if (kvm_read_guest(vcpu->kvm, get_tss_base_addr(vcpu, nseg_desc),
- &tss_segment_16, sizeof tss_segment_16))
+ if (kvm_read_guest(vcpu->kvm, tss_base, &tss_segment_16,
+ sizeof tss_segment_16))
goto out;
if (load_state_from_tss16(vcpu, &tss_segment_16))
@@ -3475,8 +3484,13 @@ static int kvm_task_switch_32(struct kvm
struct desc_struct *nseg_desc)
{
struct tss_segment_32 tss_segment_32;
+ gpa_t tss_base;
int ret = 0;
+ tss_base = get_tss_base_addr(vcpu, nseg_desc);
+ if (tss_base == UNMAPPED_GVA)
+ goto out;
+
if (kvm_read_guest(vcpu->kvm, old_tss_base, &tss_segment_32,
sizeof tss_segment_32))
goto out;
@@ -3487,7 +3501,7 @@ static int kvm_task_switch_32(struct kvm
sizeof tss_segment_32))
goto out;
- if (kvm_read_guest(vcpu->kvm, get_tss_base_addr(vcpu, nseg_desc),
+ if (kvm_read_guest(vcpu->kvm, tss_base,
&tss_segment_32, sizeof tss_segment_32))
goto out;
@@ -3509,6 +3523,8 @@ int kvm_task_switch(struct kvm_vcpu *vcp
u16 old_tss_sel = get_segment_selector(vcpu, VCPU_SREG_TR);
old_tss_base = vcpu->arch.mmu.gva_to_gpa(vcpu, old_tss_base);
+ if (old_tss_base == UNMAPPED_GVA)
+ return 1;
/* FIXME: Handle errors. Failure to read either TSS or their
* descriptors should generate a pagefault.
--
next prev parent reply other threads:[~2008-07-19 22:10 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-07-19 22:08 [patch 0/3] task switch fixes Marcelo Tosatti
2008-07-19 22:08 ` [patch 1/3] KVM: task switch: translate guest segment limit to virt-extension byte granular field Marcelo Tosatti
2008-07-20 9:22 ` Avi Kivity
2008-07-20 16:43 ` Marcelo Tosatti
2008-07-21 8:14 ` Avi Kivity
2008-07-19 22:08 ` [patch 2/3] KVM: task switch: check task busy state Marcelo Tosatti
2008-07-19 22:08 ` Marcelo Tosatti [this message]
2008-07-20 9:24 ` [patch 3/3] KVM: task switch: check for segment base translation failure Avi Kivity
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080719220933.000583030@localhost.localdomain \
--to=mtosatti@redhat.com \
--cc=avi@qumranet.com \
--cc=kvm@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.