diff options
author | Harvey Harrison <harvey.harrison@gmail.com> | 2008-02-19 10:40:38 -0500 |
---|---|---|
committer | Avi Kivity <avi@qumranet.com> | 2008-04-27 04:53:22 -0400 |
commit | e4706772ea46e57cf69a7140c40063a21884c8e0 (patch) | |
tree | a8de3773d511d2b989c2e4c033dd4faaac3defa6 /arch/x86/kvm/x86_emulate.c | |
parent | ddcb2885e2902ebfc422eccd763b02c5ee22d68b (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.c | 48 |
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) \ | 489 | static inline unsigned long |
490 | ((c->ad_bytes == sizeof(unsigned long)) ? \ | 490 | address_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 | |||
498 | static inline unsigned long | ||
499 | register_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]), |