# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID e83368c8d5e24c074002b10d8fad6a2a50d96a95
# Parent 37e5dfad8425bf92c40d47152b305a73d77b6653
[HVM] Add a mmio decode for 0F BA /4 for HVM guest.
Signed-off-by: Xiaohui Xin <xiaohui.xin@xxxxxxxxx>
---
xen/arch/x86/hvm/io.c | 10 +++++++---
xen/arch/x86/hvm/platform.c | 32 ++++++++++++++++++++++++++++----
2 files changed, 35 insertions(+), 7 deletions(-)
diff -r 37e5dfad8425 -r e83368c8d5e2 xen/arch/x86/hvm/io.c
--- a/xen/arch/x86/hvm/io.c Thu Aug 31 23:58:23 2006 +0100
+++ b/xen/arch/x86/hvm/io.c Thu Aug 31 23:59:11 2006 +0100
@@ -646,9 +646,13 @@ static void hvm_mmio_assist(struct cpu_u
break;
case INSTR_BT:
- index = operand_index(src);
- value = get_reg_value(size, index, 0, regs);
-
+ if ( src & REGISTER )
+ {
+ index = operand_index(src);
+ value = get_reg_value(size, index, 0, regs);
+ }
+ else if ( src & IMMEDIATE )
+ value = mmio_opp->immediate;
if (p->u.data & (1 << (value & ((1 << 5) - 1))))
regs->eflags |= X86_EFLAGS_CF;
else
diff -r 37e5dfad8425 -r e83368c8d5e2 xen/arch/x86/hvm/platform.c
--- a/xen/arch/x86/hvm/platform.c Thu Aug 31 23:58:23 2006 +0100
+++ b/xen/arch/x86/hvm/platform.c Thu Aug 31 23:59:11 2006 +0100
@@ -652,6 +652,23 @@ static int hvm_decode(int realmode, unsi
instr->operand[1] = mk_operand(instr->op_size, 0, 0, MEMORY);
return DECODE_success;
+ case 0xBA:
+ if (((opcode[1] >> 3) & 7) == 4) /* BT $imm8, m16/32/64 */
+ {
+ instr->instr = INSTR_BT;
+ GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
+ instr->immediate =
+ (signed char)get_immediate(realmode, opcode+1, BYTE);
+ instr->operand[0] = mk_operand(BYTE, 0, 0, IMMEDIATE);
+ instr->operand[1] = mk_operand(instr->op_size, 0, 0, MEMORY);
+ return DECODE_success;
+ }
+ else
+ {
+ printf("0f %x, This opcode subtype isn't handled yet\n", *opcode);
+ return DECODE_failure;
+ }
+
default:
printf("0f %x, This opcode isn't handled yet\n", *opcode);
return DECODE_failure;
@@ -1002,10 +1019,17 @@ void handle_mmio(unsigned long va, unsig
mmio_opp->operand[0] = mmio_inst.operand[0]; /* bit offset */
mmio_opp->operand[1] = mmio_inst.operand[1]; /* bit base */
- index = operand_index(mmio_inst.operand[0]);
- size = operand_size(mmio_inst.operand[0]);
- value = get_reg_value(size, index, 0, regs);
-
+ if ( mmio_inst.operand[0] & REGISTER )
+ {
+ index = operand_index(mmio_inst.operand[0]);
+ size = operand_size(mmio_inst.operand[0]);
+ value = get_reg_value(size, index, 0, regs);
+ }
+ else if ( mmio_inst.operand[0] & IMMEDIATE )
+ {
+ mmio_opp->immediate = mmio_inst.immediate;
+ value = mmio_inst.immediate;
+ }
send_mmio_req(IOREQ_TYPE_COPY, gpa + (value >> 5), 1,
mmio_inst.op_size, 0, IOREQ_READ, 0);
break;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|