aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/kvm/x86_emulate.c
diff options
context:
space:
mode:
authorNitin A Kamble <nitin.a.kamble@intel.com>2007-08-28 21:22:47 -0400
committerAvi Kivity <avi@qumranet.com>2007-10-13 04:18:28 -0400
commitfd2a76086527cbe074b08a8820253228cd919ece (patch)
tree01af6402d5437b4f7686ce790b673da3f453d210 /drivers/kvm/x86_emulate.c
parentf6eed39135c03d39ff4095b1ddd947672469dfee (diff)
KVM: x86 emulator: pushf
Implement emulation of instruction pushf opcode: 0x9c Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers/kvm/x86_emulate.c')
-rw-r--r--drivers/kvm/x86_emulate.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c
index 9f1772fd7480..18c2b2cea608 100644
--- a/drivers/kvm/x86_emulate.c
+++ b/drivers/kvm/x86_emulate.c
@@ -123,7 +123,7 @@ static u8 opcode_table[256] = {
123 ByteOp | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov, 123 ByteOp | DstReg | SrcMem | ModRM | Mov, DstReg | SrcMem | ModRM | Mov,
124 0, 0, 0, DstMem | SrcNone | ModRM | Mov, 124 0, 0, 0, DstMem | SrcNone | ModRM | Mov,
125 /* 0x90 - 0x9F */ 125 /* 0x90 - 0x9F */
126 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 126 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ImplicitOps, 0, 0, 0,
127 /* 0xA0 - 0xA7 */ 127 /* 0xA0 - 0xA7 */
128 ByteOp | DstReg | SrcMem | Mov, DstReg | SrcMem | Mov, 128 ByteOp | DstReg | SrcMem | Mov, DstReg | SrcMem | Mov,
129 ByteOp | DstMem | SrcReg | Mov, DstMem | SrcReg | Mov, 129 ByteOp | DstMem | SrcReg | Mov, DstMem | SrcReg | Mov,
@@ -928,7 +928,8 @@ push:
928 dst.bytes = op_bytes; 928 dst.bytes = op_bytes;
929 dst.val = src.val; 929 dst.val = src.val;
930 register_address_increment(_regs[VCPU_REGS_RSP], -op_bytes); 930 register_address_increment(_regs[VCPU_REGS_RSP], -op_bytes);
931 dst.ptr = register_address(ctxt->ss_base, _regs[VCPU_REGS_RSP]); 931 dst.ptr = (void *) register_address(ctxt->ss_base,
932 _regs[VCPU_REGS_RSP]);
932 break; 933 break;
933 case 0x80 ... 0x83: /* Grp1 */ 934 case 0x80 ... 0x83: /* Grp1 */
934 switch (modrm_reg) { 935 switch (modrm_reg) {
@@ -1216,6 +1217,12 @@ special_insn:
1216 ) == 0) 1217 ) == 0)
1217 return -1; 1218 return -1;
1218 return 0; 1219 return 0;
1220
1221 case 0x9c: /* pushf */
1222 src.val = (unsigned long) _eflags;
1223 goto push;
1224 break;
1225
1219 } 1226 }
1220 if (rep_prefix) { 1227 if (rep_prefix) {
1221 if (_regs[VCPU_REGS_RCX] == 0) { 1228 if (_regs[VCPU_REGS_RCX] == 0) {