[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-3.0-testing] [HVM] Fix a bug in the emulation of the xchg instruction.



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID d316d7faf64e7240c748acb598eb0cf83d86c536
# Parent  b6a04d27b6e16cf16a3bdbad61a00719df62b8d3
[HVM] Fix a bug in the emulation of the xchg instruction.

This bug has prevented us from booting fully virtualized SMP guests
that write to the APIC using the xchg instruction (when
CONFIG_X86_GOOD_APIC is not set). On 32 bit platforms, sles 10 kernels
are built without CONFIG_x86_GOOD_APIC not set and hence we have had
problems booting fully virtualized SMP sles 10 guests.

Signed-off-by: K. Y. Srinivasan <ksrinivasan@xxxxxxxxxx>
xen-unstable changeset:   10179:5be9e927533d94ed1389f8926d51c65849133556
xen-unstable date:        Tue May 30 12:30:47 2006 +0100
---
 xen/arch/x86/hvm/io.c       |   10 ++++++++++
 xen/arch/x86/hvm/platform.c |   24 ++++++++++++++++++++----
 2 files changed, 30 insertions(+), 4 deletions(-)

diff -r b6a04d27b6e1 -r d316d7faf64e xen/arch/x86/hvm/io.c
--- a/xen/arch/x86/hvm/io.c     Wed May 31 07:32:04 2006 +0100
+++ b/xen/arch/x86/hvm/io.c     Wed May 31 07:32:55 2006 +0100
@@ -646,6 +646,16 @@ static void hvm_mmio_assist(struct vcpu 
             regs->eflags &= ~X86_EFLAGS_CF;
 
         break;
+
+    case INSTR_XCHG:
+       if (src & REGISTER) {
+               index = operand_index(src);
+               set_reg_value(size, index, 0, regs, p->u.data);
+       } else {
+               index = operand_index(dst);
+               set_reg_value(size, index, 0, regs, p->u.data);
+       }
+       break;
     }
 
     hvm_load_cpu_guest_regs(v, regs);
diff -r b6a04d27b6e1 -r d316d7faf64e xen/arch/x86/hvm/platform.c
--- a/xen/arch/x86/hvm/platform.c       Wed May 31 07:32:04 2006 +0100
+++ b/xen/arch/x86/hvm/platform.c       Wed May 31 07:32:55 2006 +0100
@@ -954,10 +954,26 @@ void handle_mmio(unsigned long va, unsig
         mmio_opp->instr = mmio_inst.instr;
         mmio_opp->operand[0] = mmio_inst.operand[0]; /* source */
         mmio_opp->operand[1] = mmio_inst.operand[1]; /* destination */
-
-        /* send the request and wait for the value */
-        send_mmio_req(IOREQ_TYPE_XCHG, gpa, 1,
-                      mmio_inst.op_size, 0, IOREQ_WRITE, 0);
+       if (mmio_inst.operand[0] & REGISTER) {
+               long value;
+               unsigned long operand = mmio_inst.operand[0];
+               value = get_reg_value(operand_size(operand), 
+                                     operand_index(operand), 0,
+                                     mmio_opp->inst_decoder_regs);
+               /* send the request and wait for the value */
+               send_mmio_req(IOREQ_TYPE_XCHG, gpa, 1,
+                      mmio_inst.op_size, value, IOREQ_WRITE, 0);
+       } else {
+               /* the destination is a register */
+               long value;
+               unsigned long operand = mmio_inst.operand[1];
+               value = get_reg_value(operand_size(operand), 
+                                     operand_index(operand), 0,
+                                     mmio_opp->inst_decoder_regs);
+               /* send the request and wait for the value */
+               send_mmio_req(IOREQ_TYPE_XCHG, gpa, 1,
+                      mmio_inst.op_size, value, IOREQ_WRITE, 0);
+       }
         break;
 
     default:

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.