diff options
author | Kevin Wolf <kwolf@redhat.com> | 2012-02-08 14:34:41 +0100 |
---|---|---|
committer | Avi Kivity <avi@redhat.com> | 2012-03-08 14:10:29 +0200 |
commit | 4cee4798a304ee1ea579423ca048f16ceaccdfb5 (patch) | |
tree | 1088f534433daf9e9f705453038ced11c059570e /arch/x86/kvm/x86.c | |
parent | ea5e97e8bf1d56a4d9461c39e082b9c31a7be4ff (diff) | |
download | op-kernel-dev-4cee4798a304ee1ea579423ca048f16ceaccdfb5.zip op-kernel-dev-4cee4798a304ee1ea579423ca048f16ceaccdfb5.tar.gz |
KVM: x86 emulator: Allow PM/VM86 switch during task switch
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.
In order to let privilege checks succeed, rflags needs to be updated in
the vcpu struct as this causes a CPL update.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/x86/kvm/x86.c')
-rw-r--r-- | arch/x86/kvm/x86.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 490a1b1..03a1fd4 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -4129,6 +4129,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)); @@ -4310,6 +4315,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, |