aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kvm/x86_emulate.c
diff options
context:
space:
mode:
authorHarvey Harrison <harvey.harrison@gmail.com>2008-02-19 10:40:38 -0500
committerAvi Kivity <avi@qumranet.com>2008-04-27 04:53:22 -0400
commite4706772ea46e57cf69a7140c40063a21884c8e0 (patch)
treea8de3773d511d2b989c2e4c033dd4faaac3defa6 /arch/x86/kvm/x86_emulate.c
parentddcb2885e2902ebfc422eccd763b02c5ee22d68b (diff)
KVM: x86 emulator: make register_address, address_mask static inlines
Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com> Signed-off-by: Avi Kivity <avi@qumranet.com>
Diffstat (limited to 'arch/x86/kvm/x86_emulate.c')
-rw-r--r--arch/x86/kvm/x86_emulate.c48
1 files changed, 29 insertions, 19 deletions
diff --git a/arch/x86/kvm/x86_emulate.c b/arch/x86/kvm/x86_emulate.c
index f6f6544cf747..008db4dad7b2 100644
--- a/arch/x86/kvm/x86_emulate.c
+++ b/arch/x86/kvm/x86_emulate.c
@@ -486,11 +486,21 @@ static inline unsigned long ad_mask(struct decode_cache *c)
486} 486}
487 487
488/* Access/update address held in a register, based on addressing mode. */ 488/* Access/update address held in a register, based on addressing mode. */
489#define address_mask(reg) \ 489static inline unsigned long
490 ((c->ad_bytes == sizeof(unsigned long)) ? \ 490address_mask(struct decode_cache *c, unsigned long reg)
491 (reg) : ((reg) & ad_mask(c))) 491{
492#define register_address(base, reg) \ 492 if (c->ad_bytes == sizeof(unsigned long))
493 ((base) + address_mask(reg)) 493 return reg;
494 else
495 return reg & ad_mask(c);
496}
497
498static inline unsigned long
499register_address(struct decode_cache *c, unsigned long base, unsigned long reg)
500{
501 return base + address_mask(c, reg);
502}
503
494#define register_address_increment(reg, inc) \ 504#define register_address_increment(reg, inc) \
495 do { \ 505 do { \
496 /* signed type ensures sign extension to long */ \ 506 /* signed type ensures sign extension to long */ \
@@ -1056,7 +1066,7 @@ static inline void emulate_push(struct x86_emulate_ctxt *ctxt)
1056 c->dst.bytes = c->op_bytes; 1066 c->dst.bytes = c->op_bytes;
1057 c->dst.val = c->src.val; 1067 c->dst.val = c->src.val;
1058 register_address_increment(c->regs[VCPU_REGS_RSP], -c->op_bytes); 1068 register_address_increment(c->regs[VCPU_REGS_RSP], -c->op_bytes);
1059 c->dst.ptr = (void *) register_address(ctxt->ss_base, 1069 c->dst.ptr = (void *) register_address(c, ctxt->ss_base,
1060 c->regs[VCPU_REGS_RSP]); 1070 c->regs[VCPU_REGS_RSP]);
1061} 1071}
1062 1072
@@ -1066,7 +1076,7 @@ static inline int emulate_grp1a(struct x86_emulate_ctxt *ctxt,
1066 struct decode_cache *c = &ctxt->decode; 1076 struct decode_cache *c = &ctxt->decode;
1067 int rc; 1077 int rc;
1068 1078
1069 rc = ops->read_std(register_address(ctxt->ss_base, 1079 rc = ops->read_std(register_address(c, ctxt->ss_base,
1070 c->regs[VCPU_REGS_RSP]), 1080 c->regs[VCPU_REGS_RSP]),
1071 &c->dst.val, c->dst.bytes, ctxt->vcpu); 1081 &c->dst.val, c->dst.bytes, ctxt->vcpu);
1072 if (rc != 0) 1082 if (rc != 0)
@@ -1388,11 +1398,11 @@ special_insn:
1388 register_address_increment(c->regs[VCPU_REGS_RSP], 1398 register_address_increment(c->regs[VCPU_REGS_RSP],
1389 -c->op_bytes); 1399 -c->op_bytes);
1390 c->dst.ptr = (void *) register_address( 1400 c->dst.ptr = (void *) register_address(
1391 ctxt->ss_base, c->regs[VCPU_REGS_RSP]); 1401 c, ctxt->ss_base, c->regs[VCPU_REGS_RSP]);
1392 break; 1402 break;
1393 case 0x58 ... 0x5f: /* pop reg */ 1403 case 0x58 ... 0x5f: /* pop reg */
1394 pop_instruction: 1404 pop_instruction:
1395 if ((rc = ops->read_std(register_address(ctxt->ss_base, 1405 if ((rc = ops->read_std(register_address(c, ctxt->ss_base,
1396 c->regs[VCPU_REGS_RSP]), c->dst.ptr, 1406 c->regs[VCPU_REGS_RSP]), c->dst.ptr,
1397 c->op_bytes, ctxt->vcpu)) != 0) 1407 c->op_bytes, ctxt->vcpu)) != 0)
1398 goto done; 1408 goto done;
@@ -1417,9 +1427,9 @@ special_insn:
1417 1, 1427 1,
1418 (c->d & ByteOp) ? 1 : c->op_bytes, 1428 (c->d & ByteOp) ? 1 : c->op_bytes,
1419 c->rep_prefix ? 1429 c->rep_prefix ?
1420 address_mask(c->regs[VCPU_REGS_RCX]) : 1, 1430 address_mask(c, c->regs[VCPU_REGS_RCX]) : 1,
1421 (ctxt->eflags & EFLG_DF), 1431 (ctxt->eflags & EFLG_DF),
1422 register_address(ctxt->es_base, 1432 register_address(c, ctxt->es_base,
1423 c->regs[VCPU_REGS_RDI]), 1433 c->regs[VCPU_REGS_RDI]),
1424 c->rep_prefix, 1434 c->rep_prefix,
1425 c->regs[VCPU_REGS_RDX]) == 0) { 1435 c->regs[VCPU_REGS_RDX]) == 0) {
@@ -1433,9 +1443,9 @@ special_insn:
1433 0, 1443 0,
1434 (c->d & ByteOp) ? 1 : c->op_bytes, 1444 (c->d & ByteOp) ? 1 : c->op_bytes,
1435 c->rep_prefix ? 1445 c->rep_prefix ?
1436 address_mask(c->regs[VCPU_REGS_RCX]) : 1, 1446 address_mask(c, c->regs[VCPU_REGS_RCX]) : 1,
1437 (ctxt->eflags & EFLG_DF), 1447 (ctxt->eflags & EFLG_DF),
1438 register_address(c->override_base ? 1448 register_address(c, c->override_base ?
1439 *c->override_base : 1449 *c->override_base :
1440 ctxt->ds_base, 1450 ctxt->ds_base,
1441 c->regs[VCPU_REGS_RSI]), 1451 c->regs[VCPU_REGS_RSI]),
@@ -1525,10 +1535,10 @@ special_insn:
1525 case 0xa4 ... 0xa5: /* movs */ 1535 case 0xa4 ... 0xa5: /* movs */
1526 c->dst.type = OP_MEM; 1536 c->dst.type = OP_MEM;
1527 c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; 1537 c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
1528 c->dst.ptr = (unsigned long *)register_address( 1538 c->dst.ptr = (unsigned long *)register_address(c,
1529 ctxt->es_base, 1539 ctxt->es_base,
1530 c->regs[VCPU_REGS_RDI]); 1540 c->regs[VCPU_REGS_RDI]);
1531 if ((rc = ops->read_emulated(register_address( 1541 if ((rc = ops->read_emulated(register_address(c,
1532 c->override_base ? *c->override_base : 1542 c->override_base ? *c->override_base :
1533 ctxt->ds_base, 1543 ctxt->ds_base,
1534 c->regs[VCPU_REGS_RSI]), 1544 c->regs[VCPU_REGS_RSI]),
@@ -1545,7 +1555,7 @@ special_insn:
1545 case 0xa6 ... 0xa7: /* cmps */ 1555 case 0xa6 ... 0xa7: /* cmps */
1546 c->src.type = OP_NONE; /* Disable writeback. */ 1556 c->src.type = OP_NONE; /* Disable writeback. */
1547 c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; 1557 c->src.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
1548 c->src.ptr = (unsigned long *)register_address( 1558 c->src.ptr = (unsigned long *)register_address(c,
1549 c->override_base ? *c->override_base : 1559 c->override_base ? *c->override_base :
1550 ctxt->ds_base, 1560 ctxt->ds_base,
1551 c->regs[VCPU_REGS_RSI]); 1561 c->regs[VCPU_REGS_RSI]);
@@ -1557,7 +1567,7 @@ special_insn:
1557 1567
1558 c->dst.type = OP_NONE; /* Disable writeback. */ 1568 c->dst.type = OP_NONE; /* Disable writeback. */
1559 c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; 1569 c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
1560 c->dst.ptr = (unsigned long *)register_address( 1570 c->dst.ptr = (unsigned long *)register_address(c,
1561 ctxt->es_base, 1571 ctxt->es_base,
1562 c->regs[VCPU_REGS_RDI]); 1572 c->regs[VCPU_REGS_RDI]);
1563 if ((rc = ops->read_emulated((unsigned long)c->dst.ptr, 1573 if ((rc = ops->read_emulated((unsigned long)c->dst.ptr,
@@ -1581,7 +1591,7 @@ special_insn:
1581 case 0xaa ... 0xab: /* stos */ 1591 case 0xaa ... 0xab: /* stos */
1582 c->dst.type = OP_MEM; 1592 c->dst.type = OP_MEM;
1583 c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; 1593 c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
1584 c->dst.ptr = (unsigned long *)register_address( 1594 c->dst.ptr = (unsigned long *)register_address(c,
1585 ctxt->es_base, 1595 ctxt->es_base,
1586 c->regs[VCPU_REGS_RDI]); 1596 c->regs[VCPU_REGS_RDI]);
1587 c->dst.val = c->regs[VCPU_REGS_RAX]; 1597 c->dst.val = c->regs[VCPU_REGS_RAX];
@@ -1593,7 +1603,7 @@ special_insn:
1593 c->dst.type = OP_REG; 1603 c->dst.type = OP_REG;
1594 c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes; 1604 c->dst.bytes = (c->d & ByteOp) ? 1 : c->op_bytes;
1595 c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX]; 1605 c->dst.ptr = (unsigned long *)&c->regs[VCPU_REGS_RAX];
1596 if ((rc = ops->read_emulated(register_address( 1606 if ((rc = ops->read_emulated(register_address(c,
1597 c->override_base ? *c->override_base : 1607 c->override_base ? *c->override_base :
1598 ctxt->ds_base, 1608 ctxt->ds_base,
1599 c->regs[VCPU_REGS_RSI]), 1609 c->regs[VCPU_REGS_RSI]),