SrcNone | ModRM | DstMem | Mov, 0,
SrcMem16 | ModRM | Mov, 0,
[Group9*8] =
-@@ -1623,12 +1628,6 @@ emulate_sysexit(struct x86_emulate_ctxt
+@@ -1573,12 +1578,6 @@ emulate_sysexit(struct x86_emulate_ctxt
return -1;
}
setup_syscalls_segments(ctxt, &cs, &ss);
if ((c->rex_prefix & 0x8) != 0x0)
-@@ -1692,6 +1691,12 @@ x86_emulate_insn(struct x86_emulate_ctxt
+@@ -1642,6 +1641,12 @@ x86_emulate_insn(struct x86_emulate_ctxt
memcpy(c->regs, ctxt->vcpu->arch.regs, sizeof c->regs);
saved_eip = c->eip;
+++ /dev/null
-From d4c6a1549c056f1d817e8f6f2f97d8b44933472f Mon Sep 17 00:00:00 2001
-From: Gleb Natapov <gleb@redhat.com>
-Date: Wed, 10 Feb 2010 14:21:34 +0200
-Subject: KVM: x86 emulator: Fix popf emulation
-
-From: Gleb Natapov <gleb@redhat.com>
-
-commit d4c6a1549c056f1d817e8f6f2f97d8b44933472f upstream.
-
-POPF behaves differently depending on current CPU mode. Emulate correct
-logic to prevent guest from changing flags that it can't change otherwise.
-
-Signed-off-by: Gleb Natapov <gleb@redhat.com>
-Signed-off-by: Avi Kivity <avi@redhat.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- arch/x86/kvm/emulate.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++-
- 1 file changed, 54 insertions(+), 1 deletion(-)
-
---- a/arch/x86/kvm/emulate.c
-+++ b/arch/x86/kvm/emulate.c
-@@ -334,11 +334,18 @@ static u32 group2_table[] = {
- };
-
- /* EFLAGS bit definitions. */
-+#define EFLG_ID (1<<21)
-+#define EFLG_VIP (1<<20)
-+#define EFLG_VIF (1<<19)
-+#define EFLG_AC (1<<18)
- #define EFLG_VM (1<<17)
- #define EFLG_RF (1<<16)
-+#define EFLG_IOPL (3<<12)
-+#define EFLG_NT (1<<14)
- #define EFLG_OF (1<<11)
- #define EFLG_DF (1<<10)
- #define EFLG_IF (1<<9)
-+#define EFLG_TF (1<<8)
- #define EFLG_SF (1<<7)
- #define EFLG_ZF (1<<6)
- #define EFLG_AF (1<<4)
-@@ -1199,6 +1206,49 @@ static int emulate_pop(struct x86_emulat
- return rc;
- }
-
-+static int emulate_popf(struct x86_emulate_ctxt *ctxt,
-+ struct x86_emulate_ops *ops,
-+ void *dest, int len)
-+{
-+ int rc;
-+ unsigned long val, change_mask;
-+ int iopl = (ctxt->eflags & X86_EFLAGS_IOPL) >> IOPL_SHIFT;
-+ int cpl = kvm_x86_ops->get_cpl(ctxt->vcpu);
-+
-+ rc = emulate_pop(ctxt, ops, &val, len);
-+ if (rc != X86EMUL_CONTINUE)
-+ return rc;
-+
-+ change_mask = EFLG_CF | EFLG_PF | EFLG_AF | EFLG_ZF | EFLG_SF | EFLG_OF
-+ | EFLG_TF | EFLG_DF | EFLG_NT | EFLG_RF | EFLG_AC | EFLG_ID;
-+
-+ switch(ctxt->mode) {
-+ case X86EMUL_MODE_PROT64:
-+ case X86EMUL_MODE_PROT32:
-+ case X86EMUL_MODE_PROT16:
-+ if (cpl == 0)
-+ change_mask |= EFLG_IOPL;
-+ if (cpl <= iopl)
-+ change_mask |= EFLG_IF;
-+ break;
-+ case X86EMUL_MODE_VM86:
-+ if (iopl < 3) {
-+ kvm_inject_gp(ctxt->vcpu, 0);
-+ return X86EMUL_PROPAGATE_FAULT;
-+ }
-+ change_mask |= EFLG_IF;
-+ break;
-+ default: /* real mode */
-+ change_mask |= (EFLG_IOPL | EFLG_IF);
-+ break;
-+ }
-+
-+ *(unsigned long *)dest =
-+ (ctxt->eflags & ~change_mask) | (val & change_mask);
-+
-+ return rc;
-+}
-+
- static inline int emulate_grp1a(struct x86_emulate_ctxt *ctxt,
- struct x86_emulate_ops *ops)
- {
-@@ -1929,7 +1979,10 @@ special_insn:
- c->dst.type = OP_REG;
- c->dst.ptr = (unsigned long *) &ctxt->eflags;
- c->dst.bytes = c->op_bytes;
-- goto pop_instruction;
-+ rc = emulate_popf(ctxt, ops, &c->dst.val, c->op_bytes);
-+ if (rc != X86EMUL_CONTINUE)
-+ goto done;
-+ break;
- case 0xa0 ... 0xa1: /* mov */
- c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX];
- c->dst.val = c->src.val;
kvm-x86-emulator-add-group8-instruction-decoding.patch
kvm-x86-emulator-forbid-modifying-cs-segment-register-by-mov-instruction.patch
kvm-x86-emulator-add-group9-instruction-decoding.patch
-kvm-x86-emulator-fix-popf-emulation.patch
kvm-x86-emulator-check-cpl-level-during-privilege-instruction-emulation.patch
sched-fix-sched_mv_power_savings-for-smt.patch
sched-fix-smt-scheduler-regression-in-find_busiest_queue.patch
SrcNone | ModRM | DstMem | Mov, 0,
SrcMem16 | ModRM | Mov, 0,
[Group9*8] =
-@@ -1700,12 +1705,6 @@ emulate_sysexit(struct x86_emulate_ctxt
+@@ -1650,12 +1655,6 @@ emulate_sysexit(struct x86_emulate_ctxt
return -1;
}
setup_syscalls_segments(ctxt, &cs, &ss);
if ((c->rex_prefix & 0x8) != 0x0)
-@@ -1769,6 +1768,12 @@ x86_emulate_insn(struct x86_emulate_ctxt
+@@ -1719,6 +1718,12 @@ x86_emulate_insn(struct x86_emulate_ctxt
memcpy(c->regs, ctxt->vcpu->arch.regs, sizeof c->regs);
saved_eip = c->eip;
+++ /dev/null
-From d4c6a1549c056f1d817e8f6f2f97d8b44933472f Mon Sep 17 00:00:00 2001
-From: Gleb Natapov <gleb@redhat.com>
-Date: Wed, 10 Feb 2010 14:21:34 +0200
-Subject: KVM: x86 emulator: Fix popf emulation
-
-From: Gleb Natapov <gleb@redhat.com>
-
-commit d4c6a1549c056f1d817e8f6f2f97d8b44933472f upstream.
-
-POPF behaves differently depending on current CPU mode. Emulate correct
-logic to prevent guest from changing flags that it can't change otherwise.
-
-Signed-off-by: Gleb Natapov <gleb@redhat.com>
-Signed-off-by: Avi Kivity <avi@redhat.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-
----
- arch/x86/kvm/emulate.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++-
- 1 file changed, 54 insertions(+), 1 deletion(-)
-
---- a/arch/x86/kvm/emulate.c
-+++ b/arch/x86/kvm/emulate.c
-@@ -343,11 +343,18 @@ static u32 group2_table[] = {
- };
-
- /* EFLAGS bit definitions. */
-+#define EFLG_ID (1<<21)
-+#define EFLG_VIP (1<<20)
-+#define EFLG_VIF (1<<19)
-+#define EFLG_AC (1<<18)
- #define EFLG_VM (1<<17)
- #define EFLG_RF (1<<16)
-+#define EFLG_IOPL (3<<12)
-+#define EFLG_NT (1<<14)
- #define EFLG_OF (1<<11)
- #define EFLG_DF (1<<10)
- #define EFLG_IF (1<<9)
-+#define EFLG_TF (1<<8)
- #define EFLG_SF (1<<7)
- #define EFLG_ZF (1<<6)
- #define EFLG_AF (1<<4)
-@@ -1213,6 +1220,49 @@ static int emulate_pop(struct x86_emulat
- return rc;
- }
-
-+static int emulate_popf(struct x86_emulate_ctxt *ctxt,
-+ struct x86_emulate_ops *ops,
-+ void *dest, int len)
-+{
-+ int rc;
-+ unsigned long val, change_mask;
-+ int iopl = (ctxt->eflags & X86_EFLAGS_IOPL) >> IOPL_SHIFT;
-+ int cpl = kvm_x86_ops->get_cpl(ctxt->vcpu);
-+
-+ rc = emulate_pop(ctxt, ops, &val, len);
-+ if (rc != X86EMUL_CONTINUE)
-+ return rc;
-+
-+ change_mask = EFLG_CF | EFLG_PF | EFLG_AF | EFLG_ZF | EFLG_SF | EFLG_OF
-+ | EFLG_TF | EFLG_DF | EFLG_NT | EFLG_RF | EFLG_AC | EFLG_ID;
-+
-+ switch(ctxt->mode) {
-+ case X86EMUL_MODE_PROT64:
-+ case X86EMUL_MODE_PROT32:
-+ case X86EMUL_MODE_PROT16:
-+ if (cpl == 0)
-+ change_mask |= EFLG_IOPL;
-+ if (cpl <= iopl)
-+ change_mask |= EFLG_IF;
-+ break;
-+ case X86EMUL_MODE_VM86:
-+ if (iopl < 3) {
-+ kvm_inject_gp(ctxt->vcpu, 0);
-+ return X86EMUL_PROPAGATE_FAULT;
-+ }
-+ change_mask |= EFLG_IF;
-+ break;
-+ default: /* real mode */
-+ change_mask |= (EFLG_IOPL | EFLG_IF);
-+ break;
-+ }
-+
-+ *(unsigned long *)dest =
-+ (ctxt->eflags & ~change_mask) | (val & change_mask);
-+
-+ return rc;
-+}
-+
- static void emulate_push_sreg(struct x86_emulate_ctxt *ctxt, int seg)
- {
- struct decode_cache *c = &ctxt->decode;
-@@ -2041,7 +2091,10 @@ special_insn:
- c->dst.type = OP_REG;
- c->dst.ptr = (unsigned long *) &ctxt->eflags;
- c->dst.bytes = c->op_bytes;
-- goto pop_instruction;
-+ rc = emulate_popf(ctxt, ops, &c->dst.val, c->op_bytes);
-+ if (rc != X86EMUL_CONTINUE)
-+ goto done;
-+ break;
- case 0xa0 ... 0xa1: /* mov */
- c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX];
- c->dst.val = c->src.val;
kvm-x86-emulator-add-group8-instruction-decoding.patch
kvm-x86-emulator-forbid-modifying-cs-segment-register-by-mov-instruction.patch
kvm-x86-emulator-add-group9-instruction-decoding.patch
-kvm-x86-emulator-fix-popf-emulation.patch
kvm-x86-emulator-check-cpl-level-during-privilege-instruction-emulation.patch
sched-fix-sched_mv_power_savings-for-smt.patch
sched-fix-smt-scheduler-regression-in-find_busiest_queue.patch