提交 e4706772 编写于 作者: H Harvey Harrison 提交者: Avi Kivity

KVM: x86 emulator: make register_address, address_mask static inlines

Signed-off-by: NHarvey Harrison <harvey.harrison@gmail.com>
Signed-off-by: NAvi Kivity <avi@qumranet.com>
上级 ddcb2885
...@@ -486,11 +486,21 @@ static inline unsigned long ad_mask(struct decode_cache *c) ...@@ -486,11 +486,21 @@ static inline unsigned long ad_mask(struct decode_cache *c)
} }
/* Access/update address held in a register, based on addressing mode. */ /* Access/update address held in a register, based on addressing mode. */
#define address_mask(reg) \ static inline unsigned long
((c->ad_bytes == sizeof(unsigned long)) ? \ address_mask(struct decode_cache *c, unsigned long reg)
(reg) : ((reg) & ad_mask(c))) {
#define register_address(base, reg) \ if (c->ad_bytes == sizeof(unsigned long))
((base) + address_mask(reg)) return reg;
else
return reg & ad_mask(c);
}
static inline unsigned long
register_address(struct decode_cache *c, unsigned long base, unsigned long reg)
{
return base + address_mask(c, reg);
}
#define register_address_increment(reg, inc) \ #define register_address_increment(reg, inc) \
do { \ do { \
/* signed type ensures sign extension to long */ \ /* signed type ensures sign extension to long */ \
...@@ -1056,7 +1066,7 @@ static inline void emulate_push(struct x86_emulate_ctxt *ctxt) ...@@ -1056,7 +1066,7 @@ static inline void emulate_push(struct x86_emulate_ctxt *ctxt)
c->dst.bytes = c->op_bytes; c->dst.bytes = c->op_bytes;
c->dst.val = c->src.val; c->dst.val = c->src.val;
register_address_increment(c->regs[VCPU_REGS_RSP], -c->op_bytes); register_address_increment(c->regs[VCPU_REGS_RSP], -c->op_bytes);
c->dst.ptr = (void *) register_address(ctxt->ss_base, c->dst.ptr = (void *) register_address(c, ctxt->ss_base,
c->regs[VCPU_REGS_RSP]); c->regs[VCPU_REGS_RSP]);
} }
...@@ -1066,7 +1076,7 @@ static inline int emulate_grp1a(struct x86_emulate_ctxt *ctxt, ...@@ -1066,7 +1076,7 @@ static inline int emulate_grp1a(struct x86_emulate_ctxt *ctxt,
struct decode_cache *c = &ctxt->decode; struct decode_cache *c = &ctxt->decode;
int rc; int rc;
rc = ops->read_std(register_address(ctxt->ss_base, rc = ops->read_std(register_address(c, ctxt->ss_base,
c->regs[VCPU_REGS_RSP]), c->regs[VCPU_REGS_RSP]),
&c->dst.val, c->dst.bytes, ctxt->vcpu); &c->dst.val, c->dst.bytes, ctxt->vcpu);
if (rc != 0) if (rc != 0)
...@@ -1388,11 +1398,11 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1388,11 +1398,11 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
register_address_increment(c->regs[VCPU_REGS_RSP], register_address_increment(c->regs[VCPU_REGS_RSP],
-c->op_bytes); -c->op_bytes);
c->dst.ptr = (void *) register_address( c->dst.ptr = (void *) register_address(
ctxt->ss_base, c->regs[VCPU_REGS_RSP]); c, ctxt->ss_base, c->regs[VCPU_REGS_RSP]);
break; break;
case 0x58 ... 0x5f: /* pop reg */ case 0x58 ... 0x5f: /* pop reg */
pop_instruction: pop_instruction:
if ((rc = ops->read_std(register_address(ctxt->ss_base, if ((rc = ops->read_std(register_address(c, ctxt->ss_base,
c->regs[VCPU_REGS_RSP]), c->dst.ptr, c->regs[VCPU_REGS_RSP]), c->dst.ptr,
c->op_bytes, ctxt->vcpu)) != 0) c->op_bytes, ctxt->vcpu)) != 0)
goto done; goto done;
...@@ -1417,9 +1427,9 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1417,9 +1427,9 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
1, 1,
(c->d & ByteOp) ? 1 : c->op_bytes, (c->d & ByteOp) ? 1 : c->op_bytes,
c->rep_prefix ? c->rep_prefix ?
address_mask(c->regs[VCPU_REGS_RCX]) : 1, address_mask(c, c->regs[VCPU_REGS_RCX]) : 1,
(ctxt->eflags & EFLG_DF), (ctxt->eflags & EFLG_DF),
register_address(ctxt->es_base, register_address(c, ctxt->es_base,
c->regs[VCPU_REGS_RDI]), c->regs[VCPU_REGS_RDI]),
c->rep_prefix, c->rep_prefix,
c->regs[VCPU_REGS_RDX]) == 0) { c->regs[VCPU_REGS_RDX]) == 0) {
...@@ -1433,9 +1443,9 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1433,9 +1443,9 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
0, 0,
(c->d & ByteOp) ? 1 : c->op_bytes, (c->d & ByteOp) ? 1 : c->op_bytes,
c->rep_prefix ? c->rep_prefix ?
address_mask(c->regs[VCPU_REGS_RCX]) : 1, address_mask(c, c->regs[VCPU_REGS_RCX]) : 1,
(ctxt->eflags & EFLG_DF), (ctxt->eflags & EFLG_DF),
register_address(c->override_base ? register_address(c, c->override_base ?
*c->override_base : *c->override_base :
ctxt->ds_base, ctxt->ds_base,
c->regs[VCPU_REGS_RSI]), c->regs[VCPU_REGS_RSI]),
...@@ -1525,10 +1535,10 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1525,10 +1535,10 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
case 0xa4 ... 0xa5: /* movs */ case 0xa4 ... 0xa5: /* movs */
c->dst.type = OP_MEM; c->dst.type = OP_MEM;
c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
c->dst.ptr = (unsigned long *)register_address( c->dst.ptr = (unsigned long *)register_address(c,
ctxt->es_base, ctxt->es_base,
c->regs[VCPU_REGS_RDI]); c->regs[VCPU_REGS_RDI]);
if ((rc = ops->read_emulated(register_address( if ((rc = ops->read_emulated(register_address(c,
c->override_base ? *c->override_base : c->override_base ? *c->override_base :
ctxt->ds_base, ctxt->ds_base,
c->regs[VCPU_REGS_RSI]), c->regs[VCPU_REGS_RSI]),
...@@ -1545,7 +1555,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1545,7 +1555,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
case 0xa6 ... 0xa7: /* cmps */ case 0xa6 ... 0xa7: /* cmps */
c->src.type = OP_NONE; /* Disable writeback. */ c->src.type = OP_NONE; /* Disable writeback. */
c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
c->src.ptr = (unsigned long *)register_address( c->src.ptr = (unsigned long *)register_address(c,
c->override_base ? *c->override_base : c->override_base ? *c->override_base :
ctxt->ds_base, ctxt->ds_base,
c->regs[VCPU_REGS_RSI]); c->regs[VCPU_REGS_RSI]);
...@@ -1557,7 +1567,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1557,7 +1567,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
c->dst.type = OP_NONE; /* Disable writeback. */ c->dst.type = OP_NONE; /* Disable writeback. */
c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
c->dst.ptr = (unsigned long *)register_address( c->dst.ptr = (unsigned long *)register_address(c,
ctxt->es_base, ctxt->es_base,
c->regs[VCPU_REGS_RDI]); c->regs[VCPU_REGS_RDI]);
if ((rc = ops->read_emulated((unsigned long)c->dst.ptr, if ((rc = ops->read_emulated((unsigned long)c->dst.ptr,
...@@ -1581,7 +1591,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1581,7 +1591,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
case 0xaa ... 0xab: /* stos */ case 0xaa ... 0xab: /* stos */
c->dst.type = OP_MEM; c->dst.type = OP_MEM;
c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
c->dst.ptr = (unsigned long *)register_address( c->dst.ptr = (unsigned long *)register_address(c,
ctxt->es_base, ctxt->es_base,
c->regs[VCPU_REGS_RDI]); c->regs[VCPU_REGS_RDI]);
c->dst.val = c->regs[VCPU_REGS_RAX]; c->dst.val = c->regs[VCPU_REGS_RAX];
...@@ -1593,7 +1603,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops) ...@@ -1593,7 +1603,7 @@ x86_emulate_insn(struct x86_emulate_ctxt *ctxt, struct x86_emulate_ops *ops)
c->dst.type = OP_REG; c->dst.type = OP_REG;
c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX]; c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX];
if ((rc = ops->read_emulated(register_address( if ((rc = ops->read_emulated(register_address(c,
c->override_base ? *c->override_base : c->override_base ? *c->override_base :
ctxt->ds_base, ctxt->ds_base,
c->regs[VCPU_REGS_RSI]), c->regs[VCPU_REGS_RSI]),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册