diff options
author | Nitin A Kamble <nitin.a.kamble@intel.com> | 2007-06-19 04:16:04 -0400 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2007-07-16 05:05:47 -0400 |
commit | 7f0aaee07b6afcf5a4ee8a1132447621d768076b (patch) | |
tree | 3eb2b7e51898db9ee355b2b4e07294ebf5bc44c0 /drivers/kvm | |
parent | 7700270ee3c1324c18f5b7c36ee5ba1a4165919a (diff) |
KVM: Implement emulation of "pop reg" instruction (opcode 0x58-0x5f)
For use in real mode.
Signed-off-by: Nitin A Kamble <nitin.a.kamble@intel.com>
Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'drivers/kvm')
-rw-r--r-- | drivers/kvm/x86_emulate.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/drivers/kvm/x86_emulate.c b/drivers/kvm/x86_emulate.c index a4a84817b274..46c38063a102 100644 --- a/drivers/kvm/x86_emulate.c +++ b/drivers/kvm/x86_emulate.c | |||
@@ -98,8 +98,11 @@ static u8 opcode_table[256] = { | |||
98 | 0, 0, 0, 0, | 98 | 0, 0, 0, 0, |
99 | /* 0x40 - 0x4F */ | 99 | /* 0x40 - 0x4F */ |
100 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 100 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
101 | /* 0x50 - 0x5F */ | 101 | /* 0x50 - 0x57 */ |
102 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 102 | 0, 0, 0, 0, 0, 0, 0, 0, |
103 | /* 0x58 - 0x5F */ | ||
104 | ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps, | ||
105 | ImplicitOps, ImplicitOps, ImplicitOps, ImplicitOps, | ||
103 | /* 0x60 - 0x6F */ | 106 | /* 0x60 - 0x6F */ |
104 | 0, 0, 0, DstReg | SrcMem32 | ModRM | Mov /* movsxd (x86/64) */ , | 107 | 0, 0, 0, DstReg | SrcMem32 | ModRM | Mov /* movsxd (x86/64) */ , |
105 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 108 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
@@ -1153,6 +1156,16 @@ special_insn: | |||
1153 | case 0xf4: /* hlt */ | 1156 | case 0xf4: /* hlt */ |
1154 | ctxt->vcpu->halt_request = 1; | 1157 | ctxt->vcpu->halt_request = 1; |
1155 | goto done; | 1158 | goto done; |
1159 | case 0x58 ... 0x5f: /* pop reg */ | ||
1160 | dst.ptr = (unsigned long *)&_regs[b & 0x7]; | ||
1161 | |||
1162 | if ((rc = ops->read_std(register_address(ctxt->ss_base, | ||
1163 | _regs[VCPU_REGS_RSP]), dst.ptr, op_bytes, ctxt)) != 0) | ||
1164 | goto done; | ||
1165 | |||
1166 | register_address_increment(_regs[VCPU_REGS_RSP], dst.bytes); | ||
1167 | dst.orig_val = dst.val; /* Disable writeback. */ | ||
1168 | break; | ||
1156 | } | 1169 | } |
1157 | goto writeback; | 1170 | goto writeback; |
1158 | 1171 | ||