[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 05/11] target-i386: rework CPL checks during task swi
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PULL 05/11] target-i386: rework CPL checks during task switch, preparing for next patch |
Date: |
Wed, 4 Jun 2014 13:20:06 +0200 |
During task switch, all of CS.DPL, CS.RPL, SS.DPL must match (in addition
to all the other requirements) and will be the new CPL. So far this worked
by carefully setting the CS selector and flags before doing the task
switch; but this will not work once we get the CPL from SS.DPL.
Temporarily assume that the CPL comes from CS.RPL during task switch
to a protected-mode task, until the descriptor of SS is loaded.
Tested-by: Kevin O'Connor <address@hidden>
Signed-off-by: Paolo Bonzini <address@hidden>
---
target-i386/seg_helper.c | 23 +++++++++--------------
1 file changed, 9 insertions(+), 14 deletions(-)
diff --git a/target-i386/seg_helper.c b/target-i386/seg_helper.c
index 6f7efee..0f00aed 100644
--- a/target-i386/seg_helper.c
+++ b/target-i386/seg_helper.c
@@ -135,11 +135,10 @@ static inline void get_ss_esp_from_tss(CPUX86State *env,
uint32_t *ss_ptr,
}
}
-/* XXX: merge with load_seg() */
-static void tss_load_seg(CPUX86State *env, int seg_reg, int selector)
+static void tss_load_seg(CPUX86State *env, int seg_reg, int selector, int cpl)
{
uint32_t e1, e2;
- int rpl, dpl, cpl;
+ int rpl, dpl;
if ((selector & 0xfffc) != 0) {
if (load_segment(env, &e1, &e2, selector) != 0) {
@@ -150,18 +149,13 @@ static void tss_load_seg(CPUX86State *env, int seg_reg,
int selector)
}
rpl = selector & 3;
dpl = (e2 >> DESC_DPL_SHIFT) & 3;
- cpl = env->hflags & HF_CPL_MASK;
if (seg_reg == R_CS) {
if (!(e2 & DESC_CS_MASK)) {
raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc);
}
- /* XXX: is it correct? */
if (dpl != rpl) {
raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc);
}
- if ((e2 & DESC_C_MASK) && dpl > rpl) {
- raise_exception_err(env, EXCP0A_TSS, selector & 0xfffc);
- }
} else if (seg_reg == R_SS) {
/* SS must be writable data */
if ((e2 & DESC_CS_MASK) || !(e2 & DESC_W_MASK)) {
@@ -448,12 +442,13 @@ static void switch_tss(CPUX86State *env, int tss_selector,
/* load the segments */
if (!(new_eflags & VM_MASK)) {
- tss_load_seg(env, R_CS, new_segs[R_CS]);
- tss_load_seg(env, R_SS, new_segs[R_SS]);
- tss_load_seg(env, R_ES, new_segs[R_ES]);
- tss_load_seg(env, R_DS, new_segs[R_DS]);
- tss_load_seg(env, R_FS, new_segs[R_FS]);
- tss_load_seg(env, R_GS, new_segs[R_GS]);
+ int cpl = new_segs[R_CS] & 3;
+ tss_load_seg(env, R_CS, new_segs[R_CS], cpl);
+ tss_load_seg(env, R_SS, new_segs[R_SS], cpl);
+ tss_load_seg(env, R_ES, new_segs[R_ES], cpl);
+ tss_load_seg(env, R_DS, new_segs[R_DS], cpl);
+ tss_load_seg(env, R_FS, new_segs[R_FS], cpl);
+ tss_load_seg(env, R_GS, new_segs[R_GS], cpl);
}
/* check that env->eip is in the CS segment limits */
--
1.8.3.1
- [Qemu-devel] [PULL 00/11] KVM changes for 2014-06-04, Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 01/11] kvmclock: Ensure time in migration never goes backward, Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 03/11] target-i386: Fix vm86 mode regression introduced in fd460606fd6f., Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 05/11] target-i386: rework CPL checks during task switch, preparing for next patch,
Paolo Bonzini <=
- [Qemu-devel] [PULL 06/11] target-i386: get CPL from SS.DPL, Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 07/11] target-i386: set CC_OP to CC_OP_EFLAGS in cpu_load_eflags, Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 02/11] kvm_stat: allow choosing between tracepoints and old stats, Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 10/11] kvmclock: Ensure proper env->tsc value for kvmclock_current_nsec calculation, Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 04/11] target-i386: fix segment flags for SMM and VM86 mode, Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 11/11] kvm: Fix eax for cpuid leaf 0x40000000, Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 09/11] kvm: Enable -cpu option to hide KVM, Paolo Bonzini, 2014/06/04
- [Qemu-devel] [PULL 08/11] kvm: Ensure negative return value on kvm_init() error handling path, Paolo Bonzini, 2014/06/04
- Re: [Qemu-devel] [PULL 00/11] KVM changes for 2014-06-04, Peter Maydell, 2014/06/05