From: Gleb Natapov <gleb@redhat.com>
To: Kevin Wolf <kwolf@redhat.com>
Cc: kvm@vger.kernel.org, joerg.roedel@amd.com,
yoshikawa.takuya@oss.ntt.co.jp, avi@redhat.com,
mtosatti@redhat.com
Subject: Re: [PATCH 3/3] KVM: x86 emulator: Allow PM/VM86 switch during task switch
Date: Tue, 24 Jan 2012 12:57:21 +0200 [thread overview]
Message-ID: <20120124105721.GR9571@redhat.com> (raw)
In-Reply-To: <1327335048-31925-4-git-send-email-kwolf@redhat.com>
On Mon, Jan 23, 2012 at 05:10:48PM +0100, Kevin Wolf wrote:
> Task switches can switch between Protected Mode and VM86. The current
> mode must be updated during the task switch emulation so that the new
> segment selectors are interpreted correctly and privilege checks
> succeed.
>
> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> ---
> arch/x86/include/asm/kvm_emulate.h | 1 +
> arch/x86/kvm/emulate.c | 17 +++++++++++++++++
> arch/x86/kvm/x86.c | 6 ++++++
> 3 files changed, 24 insertions(+), 0 deletions(-)
>
> diff --git a/arch/x86/include/asm/kvm_emulate.h b/arch/x86/include/asm/kvm_emulate.h
> index c8a9cf3..4a21c7d 100644
> --- a/arch/x86/include/asm/kvm_emulate.h
> +++ b/arch/x86/include/asm/kvm_emulate.h
> @@ -176,6 +176,7 @@ struct x86_emulate_ops {
> void (*set_idt)(struct x86_emulate_ctxt *ctxt, struct desc_ptr *dt);
> ulong (*get_cr)(struct x86_emulate_ctxt *ctxt, int cr);
> int (*set_cr)(struct x86_emulate_ctxt *ctxt, int cr, ulong val);
> + void (*set_rflags)(struct x86_emulate_ctxt *ctxt, ulong val);
> int (*cpl)(struct x86_emulate_ctxt *ctxt);
> int (*get_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong *dest);
> int (*set_dr)(struct x86_emulate_ctxt *ctxt, int dr, ulong value);
> diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
> index 833969e..52fce89 100644
> --- a/arch/x86/kvm/emulate.c
> +++ b/arch/x86/kvm/emulate.c
> @@ -2273,6 +2273,23 @@ static int load_state_from_tss32(struct x86_emulate_ctxt *ctxt,
> return emulate_gp(ctxt, 0);
> ctxt->_eip = tss->eip;
> ctxt->eflags = tss->eflags | 2;
> +
> + /*
> + * If we're switching between Protected Mode and VM86, we need to make
> + * sure to update the mode before loading the segment descriptors so
> + * that the selectors are interpreted correctly.
> + *
> + * Need to get it to the vcpu struct immediately because it influences
> + * the CPL which is checked when loading the segment descriptors.
This is true only for VMX. SVM does not look at rflags. May be instead
of adding new x86_emulate_ops callback we need to get rid of get_cpl()
one and implement CPL checking using emulate.c:get_segment_selector().
> + */
> + if (ctxt->eflags & X86_EFLAGS_VM)
> + ctxt->mode = X86EMUL_MODE_VM86;
> + else
> + ctxt->mode = X86EMUL_MODE_PROT32;
> +
> + ctxt->ops->set_rflags(ctxt, ctxt->eflags);
> +
> + /* General purpose registers */
> ctxt->regs[VCPU_REGS_RAX] = tss->eax;
> ctxt->regs[VCPU_REGS_RCX] = tss->ecx;
> ctxt->regs[VCPU_REGS_RDX] = tss->edx;
> diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
> index dc3e945..502b5c3 100644
> --- a/arch/x86/kvm/x86.c
> +++ b/arch/x86/kvm/x86.c
> @@ -4040,6 +4040,11 @@ static int emulator_set_cr(struct x86_emulate_ctxt *ctxt, int cr, ulong val)
> return res;
> }
>
> +static void emulator_set_rflags(struct x86_emulate_ctxt *ctxt, ulong val)
> +{
> + kvm_set_rflags(emul_to_vcpu(ctxt), val);
> +}
> +
> static int emulator_get_cpl(struct x86_emulate_ctxt *ctxt)
> {
> return kvm_x86_ops->get_cpl(emul_to_vcpu(ctxt));
> @@ -4199,6 +4204,7 @@ static struct x86_emulate_ops emulate_ops = {
> .set_idt = emulator_set_idt,
> .get_cr = emulator_get_cr,
> .set_cr = emulator_set_cr,
> + .set_rflags = emulator_set_rflags,
> .cpl = emulator_get_cpl,
> .get_dr = emulator_get_dr,
> .set_dr = emulator_set_dr,
> --
> 1.7.6.5
--
Gleb.
next prev parent reply other threads:[~2012-01-24 10:57 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-23 16:10 [PATCH 0/3] Fix task switches into/out of VM86 Kevin Wolf
2012-01-23 16:10 ` [PATCH 1/3] KVM: x86 emulator: Fix task switch privilege checks Kevin Wolf
2012-01-24 9:52 ` Gleb Natapov
2012-01-24 10:09 ` Kevin Wolf
2012-01-24 10:17 ` Gleb Natapov
2012-01-24 10:38 ` Kevin Wolf
2012-01-24 10:52 ` Gleb Natapov
2012-01-24 11:23 ` Kevin Wolf
2012-01-24 11:25 ` Gleb Natapov
2012-01-24 14:03 ` Joerg Roedel
2012-01-24 14:15 ` Kevin Wolf
2012-01-24 14:16 ` Gleb Natapov
2012-01-24 14:24 ` Kevin Wolf
2012-01-24 16:23 ` Gleb Natapov
2012-01-25 16:00 ` Joerg Roedel
2012-01-25 18:29 ` Gleb Natapov
2012-01-27 12:58 ` Kevin Wolf
2012-01-27 13:34 ` Joerg Roedel
2012-01-27 13:55 ` Kevin Wolf
2012-01-27 14:17 ` Joerg Roedel
2012-01-27 15:02 ` Kevin Wolf
2012-01-27 15:45 ` Gleb Natapov
2012-01-23 16:10 ` [PATCH 2/3] KVM: x86 emulator: VM86 segments must have DPL 3 Kevin Wolf
2012-01-23 16:10 ` [PATCH 3/3] KVM: x86 emulator: Allow PM/VM86 switch during task switch Kevin Wolf
2012-01-24 10:57 ` Gleb Natapov [this message]
2012-01-24 11:31 ` Kevin Wolf
2012-01-24 11:37 ` Gleb Natapov
2012-01-24 11:44 ` Kevin Wolf
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=20120124105721.GR9571@redhat.com \
--to=gleb@redhat.com \
--cc=avi@redhat.com \
--cc=joerg.roedel@amd.com \
--cc=kvm@vger.kernel.org \
--cc=kwolf@redhat.com \
--cc=mtosatti@redhat.com \
--cc=yoshikawa.takuya@oss.ntt.co.jp \
/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.