aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm
diff options
context:
space:
mode:
authorBandan Das <bsd@redhat.com>2014-04-16 12:46:13 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2014-07-11 03:14:01 -0400
commit573e80fe04db1aa44e8303037f65716ba5c3a343 (patch)
treef15305dc2d8d1fc9b8e20b05c05f5cf1f1ec0f9f /arch/x86/kvm
parentc44b4c6ab80eef3a9c52c7b3f0c632942e6489aa (diff)
KVM: emulate: rework seg_override
x86_decode_insn already sets a default for seg_override, so remove it from the zeroed area. Also replace set/get functions with direct access to the field. Signed-off-by: Bandan Das <bsd@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'arch/x86/kvm')
-rw-r--r--arch/x86/kvm/emulate.c41
1 files changed, 16 insertions, 25 deletions
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index 3e9bbdc4c76a..08badf638fb0 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -514,12 +514,6 @@ static u32 desc_limit_scaled(struct desc_struct *desc)
514 return desc->g ? (limit << 12) | 0xfff : limit; 514 return desc->g ? (limit << 12) | 0xfff : limit;
515} 515}
516 516
517static void set_seg_override(struct x86_emulate_ctxt *ctxt, int seg)
518{
519 ctxt->has_seg_override = true;
520 ctxt->seg_override = seg;
521}
522
523static unsigned long seg_base(struct x86_emulate_ctxt *ctxt, int seg) 517static unsigned long seg_base(struct x86_emulate_ctxt *ctxt, int seg)
524{ 518{
525 if (ctxt->mode == X86EMUL_MODE_PROT64 && seg < VCPU_SREG_FS) 519 if (ctxt->mode == X86EMUL_MODE_PROT64 && seg < VCPU_SREG_FS)
@@ -528,14 +522,6 @@ static unsigned long seg_base(struct x86_emulate_ctxt *ctxt, int seg)
528 return ctxt->ops->get_cached_segment_base(ctxt, seg); 522 return ctxt->ops->get_cached_segment_base(ctxt, seg);
529} 523}
530 524
531static unsigned seg_override(struct x86_emulate_ctxt *ctxt)
532{
533 if (!ctxt->has_seg_override)
534 return 0;
535
536 return ctxt->seg_override;
537}
538
539static int emulate_exception(struct x86_emulate_ctxt *ctxt, int vec, 525static int emulate_exception(struct x86_emulate_ctxt *ctxt, int vec,
540 u32 error, bool valid) 526 u32 error, bool valid)
541{ 527{
@@ -4169,7 +4155,7 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op,
4169 op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes; 4155 op->bytes = (ctxt->d & ByteOp) ? 1 : ctxt->op_bytes;
4170 op->addr.mem.ea = 4156 op->addr.mem.ea =
4171 register_address(ctxt, reg_read(ctxt, VCPU_REGS_RSI)); 4157 register_address(ctxt, reg_read(ctxt, VCPU_REGS_RSI));
4172 op->addr.mem.seg = seg_override(ctxt); 4158 op->addr.mem.seg = ctxt->seg_override;
4173 op->val = 0; 4159 op->val = 0;
4174 op->count = 1; 4160 op->count = 1;
4175 break; 4161 break;
@@ -4180,7 +4166,7 @@ static int decode_operand(struct x86_emulate_ctxt *ctxt, struct operand *op,
4180 register_address(ctxt, 4166 register_address(ctxt,
4181 reg_read(ctxt, VCPU_REGS_RBX) + 4167 reg_read(ctxt, VCPU_REGS_RBX) +
4182 (reg_read(ctxt, VCPU_REGS_RAX) & 0xff)); 4168 (reg_read(ctxt, VCPU_REGS_RAX) & 0xff));
4183 op->addr.mem.seg = seg_override(ctxt); 4169 op->addr.mem.seg = ctxt->seg_override;
4184 op->val = 0; 4170 op->val = 0;
4185 break; 4171 break;
4186 case OpImmFAddr: 4172 case OpImmFAddr:
@@ -4227,6 +4213,7 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
4227 int mode = ctxt->mode; 4213 int mode = ctxt->mode;
4228 int def_op_bytes, def_ad_bytes, goffset, simd_prefix; 4214 int def_op_bytes, def_ad_bytes, goffset, simd_prefix;
4229 bool op_prefix = false; 4215 bool op_prefix = false;
4216 bool has_seg_override = false;
4230 struct opcode opcode; 4217 struct opcode opcode;
4231 4218
4232 ctxt->memop.type = OP_NONE; 4219 ctxt->memop.type = OP_NONE;
@@ -4280,11 +4267,13 @@ int x86_decode_insn(struct x86_emulate_ctxt *ctxt, void *insn, int insn_len)
4280 case 0x2e: /* CS override */ 4267 case 0x2e: /* CS override */
4281 case 0x36: /* SS override */ 4268 case 0x36: /* SS override */
4282 case 0x3e: /* DS override */ 4269 case 0x3e: /* DS override */
4283 set_seg_override(ctxt, (ctxt->b >> 3) & 3); 4270 has_seg_override = true;
4271 ctxt->seg_override = (ctxt->b >> 3) & 3;
4284 break; 4272 break;
4285 case 0x64: /* FS override */ 4273 case 0x64: /* FS override */
4286 case 0x65: /* GS override */ 4274 case 0x65: /* GS override */
4287 set_seg_override(ctxt, ctxt->b & 7); 4275 has_seg_override = true;
4276 ctxt->seg_override = ctxt->b & 7;
4288 break; 4277 break;
4289 case 0x40 ... 0x4f: /* REX */ 4278 case 0x40 ... 0x4f: /* REX */
4290 if (mode != X86EMUL_MODE_PROT64) 4279 if (mode != X86EMUL_MODE_PROT64)
@@ -4422,17 +4411,19 @@ done_prefixes:
4422 /* ModRM and SIB bytes. */ 4411 /* ModRM and SIB bytes. */
4423 if (ctxt->d & ModRM) { 4412 if (ctxt->d & ModRM) {
4424 rc = decode_modrm(ctxt, &ctxt->memop); 4413 rc = decode_modrm(ctxt, &ctxt->memop);
4425 if (!ctxt->has_seg_override) 4414 if (!has_seg_override) {
4426 set_seg_override(ctxt, ctxt->modrm_seg); 4415 has_seg_override = true;
4416 ctxt->seg_override = ctxt->modrm_seg;
4417 }
4427 } else if (ctxt->d & MemAbs) 4418 } else if (ctxt->d & MemAbs)
4428 rc = decode_abs(ctxt, &ctxt->memop); 4419 rc = decode_abs(ctxt, &ctxt->memop);
4429 if (rc != X86EMUL_CONTINUE) 4420 if (rc != X86EMUL_CONTINUE)
4430 goto done; 4421 goto done;
4431 4422
4432 if (!ctxt->has_seg_override) 4423 if (!has_seg_override)
4433 set_seg_override(ctxt, VCPU_SREG_DS); 4424 ctxt->seg_override = VCPU_SREG_DS;
4434 4425
4435 ctxt->memop.addr.mem.seg = seg_override(ctxt); 4426 ctxt->memop.addr.mem.seg = ctxt->seg_override;
4436 4427
4437 if (ctxt->memop.type == OP_MEM && ctxt->ad_bytes != 8) 4428 if (ctxt->memop.type == OP_MEM && ctxt->ad_bytes != 8)
4438 ctxt->memop.addr.mem.ea = (u32)ctxt->memop.addr.mem.ea; 4429 ctxt->memop.addr.mem.ea = (u32)ctxt->memop.addr.mem.ea;
@@ -4534,8 +4525,8 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *))
4534 4525
4535void init_decode_cache(struct x86_emulate_ctxt *ctxt) 4526void init_decode_cache(struct x86_emulate_ctxt *ctxt)
4536{ 4527{
4537 memset(&ctxt->has_seg_override, 0, 4528 memset(&ctxt->rip_relative, 0,
4538 (void *)&ctxt->modrm - (void *)&ctxt->has_seg_override); 4529 (void *)&ctxt->modrm - (void *)&ctxt->rip_relative);
4539 4530
4540 ctxt->io_read.pos = 0; 4531 ctxt->io_read.pos = 0;
4541 ctxt->io_read.end = 0; 4532 ctxt->io_read.end = 0;