# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxx
# Node ID 1b4ad6eb6968ce2258a7c2338d5ff9dab37388e4
# Parent 62d815160f01020359ef78705c5ce13614f766b2
Move mmio operation structure from domain to vcpu.
Also do some cleanup.
Signed-off-by: Xin Li <xin.b.li@xxxxxxxxx>
Signed-off-by: Nakajima Jun <nakajima.jun@xxxxxxxxx>
diff -r 62d815160f01 -r 1b4ad6eb6968 xen/arch/x86/vmx.c
--- a/xen/arch/x86/vmx.c Fri Oct 7 15:49:29 2005
+++ b/xen/arch/x86/vmx.c Fri Oct 7 22:17:24 2005
@@ -659,14 +659,14 @@
static void vmx_io_instruction(struct cpu_user_regs *regs,
unsigned long exit_qualification, unsigned long
inst_len)
{
- struct mi_per_cpu_info *mpcip;
+ struct mmio_op *mmio_opp;
unsigned long eip, cs, eflags;
unsigned long port, size, dir;
int vm86;
- mpcip = ¤t->domain->arch.vmx_platform.mpci;
- mpcip->instr = INSTR_PIO;
- mpcip->flags = 0;
+ mmio_opp = ¤t->arch.arch_vmx.mmio_op;
+ mmio_opp->instr = INSTR_PIO;
+ mmio_opp->flags = 0;
__vmread(GUEST_RIP, &eip);
__vmread(GUEST_CS_SELECTOR, &cs);
@@ -700,7 +700,7 @@
addr = dir == IOREQ_WRITE ? regs->esi : regs->edi;
if (test_bit(5, &exit_qualification)) { /* "rep" prefix */
- mpcip->flags |= REPZ;
+ mmio_opp->flags |= REPZ;
count = vm86 ? regs->ecx & 0xFFFF : regs->ecx;
}
@@ -711,7 +711,7 @@
if ((addr & PAGE_MASK) != ((addr + size - 1) & PAGE_MASK)) {
unsigned long value = 0;
- mpcip->flags |= OVERLAP;
+ mmio_opp->flags |= OVERLAP;
if (dir == IOREQ_WRITE)
vmx_copy(&value, addr, size, VMX_COPY_IN);
send_pio_req(regs, port, 1, size, value, dir, 0);
@@ -1695,7 +1695,7 @@
(unsigned long)regs.eax, (unsigned long)regs.ebx,
(unsigned long)regs.ecx, (unsigned long)regs.edx,
(unsigned long)regs.esi, (unsigned long)regs.edi);
- v->domain->arch.vmx_platform.mpci.inst_decoder_regs = ®s;
+ v->arch.arch_vmx.mmio_op.inst_decoder_regs = ®s;
if (!(error = vmx_do_page_fault(va, ®s))) {
/*
diff -r 62d815160f01 -r 1b4ad6eb6968 xen/arch/x86/vmx_io.c
--- a/xen/arch/x86/vmx_io.c Fri Oct 7 15:49:29 2005
+++ b/xen/arch/x86/vmx_io.c Fri Oct 7 22:17:24 2005
@@ -1,5 +1,5 @@
/*
- * vmx_io.c: handling I/O, interrupts related VMX entry/exit
+ * vmx_io.c: handling I/O, interrupts related VMX entry/exit
* Copyright (c) 2004, Intel Corporation.
*
* This program is free software; you can redistribute it and/or modify it
@@ -42,7 +42,7 @@
#ifdef CONFIG_VMX
#if defined (__i386__)
void load_cpu_user_regs(struct cpu_user_regs *regs)
-{
+{
/*
* Write the guest register value into VMCS
*/
@@ -52,7 +52,7 @@
__vmwrite(GUEST_RFLAGS, regs->eflags);
if (regs->eflags & EF_TF)
__vm_set_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_DB);
- else
+ else
__vm_clear_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_DB);
__vmwrite(GUEST_CS_SELECTOR, regs->cs);
@@ -189,7 +189,7 @@
__vmwrite(GUEST_RFLAGS, regs->rflags);
if (regs->rflags & EF_TF)
__vm_set_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_DB);
- else
+ else
__vm_clear_bit(EXCEPTION_BITMAP, EXCEPTION_BITMAP_DB);
__vmwrite(GUEST_CS_SELECTOR, regs->cs);
@@ -265,52 +265,52 @@
}
switch (index) {
- case 0:
+ case 0:
__set_reg_value(®s->rax, size, value);
break;
- case 1:
+ case 1:
__set_reg_value(®s->rcx, size, value);
break;
- case 2:
+ case 2:
__set_reg_value(®s->rdx, size, value);
break;
- case 3:
+ case 3:
__set_reg_value(®s->rbx, size, value);
break;
- case 4:
+ case 4:
__set_reg_value(®s->rsp, size, value);
break;
- case 5:
+ case 5:
__set_reg_value(®s->rbp, size, value);
break;
- case 6:
+ case 6:
__set_reg_value(®s->rsi, size, value);
break;
- case 7:
+ case 7:
__set_reg_value(®s->rdi, size, value);
break;
- case 8:
+ case 8:
__set_reg_value(®s->r8, size, value);
break;
- case 9:
+ case 9:
__set_reg_value(®s->r9, size, value);
break;
- case 10:
+ case 10:
__set_reg_value(®s->r10, size, value);
break;
- case 11:
+ case 11:
__set_reg_value(®s->r11, size, value);
break;
- case 12:
+ case 12:
__set_reg_value(®s->r12, size, value);
break;
- case 13:
+ case 13:
__set_reg_value(®s->r13, size, value);
break;
- case 14:
+ case 14:
__set_reg_value(®s->r14, size, value);
break;
- case 15:
+ case 15:
__set_reg_value(®s->r15, size, value);
break;
default:
@@ -391,7 +391,7 @@
}
static void vmx_pio_assist(struct cpu_user_regs *regs, ioreq_t *p,
- struct mi_per_cpu_info *mpcip)
+ struct mmio_op *mmio_opp)
{
unsigned long old_eax;
int sign = p->df ? -1 : 1;
@@ -399,15 +399,15 @@
if (p->dir == IOREQ_WRITE) {
if (p->pdata_valid) {
regs->esi += sign * p->count * p->size;
- if (mpcip->flags & REPZ)
+ if (mmio_opp->flags & REPZ)
regs->ecx -= p->count;
}
} else {
- if (mpcip->flags & OVERLAP) {
+ if (mmio_opp->flags & OVERLAP) {
unsigned long addr;
regs->edi += sign * p->count * p->size;
- if (mpcip->flags & REPZ)
+ if (mmio_opp->flags & REPZ)
regs->ecx -= p->count;
addr = regs->edi;
@@ -416,7 +416,7 @@
vmx_copy(&p->u.data, addr, p->size, VMX_COPY_OUT);
} else if (p->pdata_valid) {
regs->edi += sign * p->count * p->size;
- if (mpcip->flags & REPZ)
+ if (mmio_opp->flags & REPZ)
regs->ecx -= p->count;
} else {
old_eax = regs->eax;
@@ -439,18 +439,18 @@
}
static void vmx_mmio_assist(struct cpu_user_regs *regs, ioreq_t *p,
- struct mi_per_cpu_info *mpcip)
+ struct mmio_op *mmio_opp)
{
int sign = p->df ? -1 : 1;
int size = -1, index = -1;
unsigned long value = 0, diff = 0;
unsigned long src, dst;
- src = mpcip->operand[0];
- dst = mpcip->operand[1];
+ src = mmio_opp->operand[0];
+ dst = mmio_opp->operand[1];
size = operand_size(src);
- switch (mpcip->instr) {
+ switch (mmio_opp->instr) {
case INSTR_MOV:
if (dst & REGISTER) {
index = operand_index(dst);
@@ -475,7 +475,7 @@
regs->esi += sign * p->count * p->size;
regs->edi += sign * p->count * p->size;
- if ((mpcip->flags & OVERLAP) && p->dir == IOREQ_READ) {
+ if ((mmio_opp->flags & OVERLAP) && p->dir == IOREQ_READ) {
unsigned long addr = regs->edi;
if (sign > 0)
@@ -483,14 +483,14 @@
vmx_copy(&p->u.data, addr, p->size, VMX_COPY_OUT);
}
- if (mpcip->flags & REPZ)
+ if (mmio_opp->flags & REPZ)
regs->ecx -= p->count;
break;
case INSTR_STOS:
sign = p->df ? -1 : 1;
regs->edi += sign * p->count * p->size;
- if (mpcip->flags & REPZ)
+ if (mmio_opp->flags & REPZ)
regs->ecx -= p->count;
break;
@@ -500,7 +500,7 @@
value = get_reg_value(size, index, 0, regs);
diff = (unsigned long) p->u.data & value;
} else if (src & IMMEDIATE) {
- value = mpcip->immediate;
+ value = mmio_opp->immediate;
diff = (unsigned long) p->u.data & value;
} else if (src & MEMORY) {
index = operand_index(dst);
@@ -527,7 +527,7 @@
value = get_reg_value(size, index, 0, regs);
diff = (unsigned long) p->u.data | value;
} else if (src & IMMEDIATE) {
- value = mpcip->immediate;
+ value = mmio_opp->immediate;
diff = (unsigned long) p->u.data | value;
} else if (src & MEMORY) {
index = operand_index(dst);
@@ -554,7 +554,7 @@
value = get_reg_value(size, index, 0, regs);
diff = (unsigned long) p->u.data ^ value;
} else if (src & IMMEDIATE) {
- value = mpcip->immediate;
+ value = mmio_opp->immediate;
diff = (unsigned long) p->u.data ^ value;
} else if (src & MEMORY) {
index = operand_index(dst);
@@ -581,7 +581,7 @@
value = get_reg_value(size, index, 0, regs);
diff = (unsigned long) p->u.data - value;
} else if (src & IMMEDIATE) {
- value = mpcip->immediate;
+ value = mmio_opp->immediate;
diff = (unsigned long) p->u.data - value;
} else if (src & MEMORY) {
index = operand_index(dst);
@@ -608,7 +608,7 @@
index = operand_index(src);
value = get_reg_value(size, index, 0, regs);
} else if (src & IMMEDIATE) {
- value = mpcip->immediate;
+ value = mmio_opp->immediate;
} else if (src & MEMORY) {
index = operand_index(dst);
value = get_reg_value(size, index, 0, regs);
@@ -629,21 +629,21 @@
load_cpu_user_regs(regs);
}
-void vmx_io_assist(struct vcpu *v)
+void vmx_io_assist(struct vcpu *v)
{
vcpu_iodata_t *vio;
ioreq_t *p;
struct cpu_user_regs *regs = guest_cpu_user_regs();
- struct mi_per_cpu_info *mpci_p;
+ struct mmio_op *mmio_opp;
struct cpu_user_regs *inst_decoder_regs;
- mpci_p = &v->domain->arch.vmx_platform.mpci;
- inst_decoder_regs = mpci_p->inst_decoder_regs;
+ mmio_opp = &v->arch.arch_vmx.mmio_op;
+ inst_decoder_regs = mmio_opp->inst_decoder_regs;
vio = get_vio(v->domain, v->vcpu_id);
if (vio == 0) {
- VMX_DBG_LOG(DBG_LEVEL_1,
+ VMX_DBG_LOG(DBG_LEVEL_1,
"bad shared page: %lx", (unsigned long) vio);
printf("bad shared page: %lx\n", (unsigned long) vio);
domain_crash_synchronous();
@@ -660,15 +660,15 @@
clear_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags);
if (p->type == IOREQ_TYPE_PIO)
- vmx_pio_assist(regs, p, mpci_p);
+ vmx_pio_assist(regs, p, mmio_opp);
else
- vmx_mmio_assist(regs, p, mpci_p);
+ vmx_mmio_assist(regs, p, mmio_opp);
}
/* else an interrupt send event raced us */
}
}
-int vmx_clear_pending_io_event(struct vcpu *v)
+int vmx_clear_pending_io_event(struct vcpu *v)
{
struct domain *d = v->domain;
int port = iopacket_port(d);
@@ -678,7 +678,7 @@
clear_bit(port>>5, &v->vcpu_info->evtchn_pending_sel);
/* Note: VMX domains may need upcalls as well */
- if (!v->vcpu_info->evtchn_pending_sel)
+ if (!v->vcpu_info->evtchn_pending_sel)
clear_bit(0, &v->vcpu_info->evtchn_upcall_pending);
/* clear the pending bit for port */
@@ -688,18 +688,18 @@
/* Because we've cleared the pending events first, we need to guarantee that
* all events to be handled by xen for VMX domains are taken care of here.
*
- * interrupts are guaranteed to be checked before resuming guest.
- * VMX upcalls have been already arranged for if necessary.
+ * interrupts are guaranteed to be checked before resuming guest.
+ * VMX upcalls have been already arranged for if necessary.
*/
-void vmx_check_events(struct vcpu *d)
-{
- /* clear the event *before* checking for work. This should avoid
+void vmx_check_events(struct vcpu *v)
+{
+ /* clear the event *before* checking for work. This should avoid
the set-and-check races */
if (vmx_clear_pending_io_event(current))
- vmx_io_assist(d);
-}
-
-/* On exit from vmx_wait_io, we're guaranteed to have a I/O response from
+ vmx_io_assist(v);
+}
+
+/* On exit from vmx_wait_io, we're guaranteed to have a I/O response from
the device model */
void vmx_wait_io()
{
@@ -782,7 +782,7 @@
return __fls(pintr[0]);
}
-#define BSP_CPU(d) (!(d->vcpu_id))
+#define BSP_CPU(v) (!(v->vcpu_id))
static inline void clear_extint(struct vcpu *v)
{
global_iodata_t *spg;
@@ -883,7 +883,7 @@
return ((eflags & X86_EFLAGS_IF) == 0);
}
-asmlinkage void vmx_intr_assist(void)
+asmlinkage void vmx_intr_assist(void)
{
int intr_type = 0;
int highest_vector;
@@ -945,19 +945,19 @@
return;
}
-void vmx_do_resume(struct vcpu *d)
+void vmx_do_resume(struct vcpu *v)
{
vmx_stts();
- if (event_pending(d)) {
- vmx_check_events(d);
-
- if (test_bit(ARCH_VMX_IO_WAIT, &d->arch.arch_vmx.flags))
+ if (event_pending(v)) {
+ vmx_check_events(v);
+
+ if (test_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags))
vmx_wait_io();
}
/* We can't resume the guest if we're waiting on I/O */
- ASSERT(!test_bit(ARCH_VMX_IO_WAIT, &d->arch.arch_vmx.flags));
+ ASSERT(!test_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags));
}
#endif /* CONFIG_VMX */
diff -r 62d815160f01 -r 1b4ad6eb6968 xen/arch/x86/vmx_platform.c
--- a/xen/arch/x86/vmx_platform.c Fri Oct 7 15:49:29 2005
+++ b/xen/arch/x86/vmx_platform.c Fri Oct 7 22:17:24 2005
@@ -22,8 +22,8 @@
#include <xen/mm.h>
#include <asm/shadow.h>
#include <xen/domain_page.h>
-#include <asm/page.h>
-#include <xen/event.h>
+#include <asm/page.h>
+#include <xen/event.h>
#include <xen/trace.h>
#include <asm/vmx.h>
#include <asm/vmx_platform.h>
@@ -69,16 +69,16 @@
}
}
-long get_reg_value(int size, int index, int seg, struct cpu_user_regs *regs)
+long get_reg_value(int size, int index, int seg, struct cpu_user_regs *regs)
{
if (size == BYTE) {
- switch (index) {
+ switch (index) {
case 0: /* %al */
return (char)(regs->rax & 0xFF);
case 1: /* %cl */
return (char)(regs->rcx & 0xFF);
case 2: /* %dl */
- return (char)(regs->rdx & 0xFF);
+ return (char)(regs->rdx & 0xFF);
case 3: /* %bl */
return (char)(regs->rbx & 0xFF);
case 4: /* %ah */
@@ -90,7 +90,7 @@
case 7: /* %bh */
return (char)((regs->rbx & 0xFF00) >> 8);
default:
- printf("Error: (get_reg_value) Invalid index value\n");
+ printf("Error: (get_reg_value) Invalid index value\n");
domain_crash_synchronous();
}
/* NOTREACHED */
@@ -114,7 +114,7 @@
case 14: return __get_reg_value(regs->r14, size);
case 15: return __get_reg_value(regs->r15, size);
default:
- printf("Error: (get_reg_value) Invalid index value\n");
+ printf("Error: (get_reg_value) Invalid index value\n");
domain_crash_synchronous();
}
}
@@ -131,7 +131,7 @@
}
static inline long __get_reg_value(unsigned long reg, int size)
-{
+{
switch(size) {
case WORD:
return (short)(reg & 0xFFFF);
@@ -144,15 +144,15 @@
}
long get_reg_value(int size, int index, int seg, struct cpu_user_regs *regs)
-{
+{
if (size == BYTE) {
- switch (index) {
+ switch (index) {
case 0: /* %al */
return (char)(regs->eax & 0xFF);
case 1: /* %cl */
return (char)(regs->ecx & 0xFF);
case 2: /* %dl */
- return (char)(regs->edx & 0xFF);
+ return (char)(regs->edx & 0xFF);
case 3: /* %bl */
return (char)(regs->ebx & 0xFF);
case 4: /* %ah */
@@ -164,7 +164,7 @@
case 7: /* %bh */
return (char)((regs->ebx & 0xFF00) >> 8);
default:
- printf("Error: (get_reg_value) Invalid index value\n");
+ printf("Error: (get_reg_value) Invalid index value\n");
domain_crash_synchronous();
}
}
@@ -179,7 +179,7 @@
case 6: return __get_reg_value(regs->esi, size);
case 7: return __get_reg_value(regs->edi, size);
default:
- printf("Error: (get_reg_value) Invalid index value\n");
+ printf("Error: (get_reg_value) Invalid index value\n");
domain_crash_synchronous();
}
}
@@ -283,9 +283,9 @@
//Only one operand in the instruction is register
if (mod == 3) {
- return (rm + (rex_b << 3));
+ return (rm + (rex_b << 3));
} else {
- return (reg + (rex_r << 3));
+ return (reg + (rex_r << 3));
}
return 0;
}
@@ -299,7 +299,7 @@
mmio_inst->operand[0] = 0;
mmio_inst->operand[1] = 0;
-
+
mmio_inst->flags = 0;
}
@@ -498,12 +498,12 @@
instr->instr = INSTR_MOVS;
instr->op_size = BYTE;
return DECODE_success;
-
+
case 0xA5: /* movsw/movsl */
instr->instr = INSTR_MOVS;
GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
return DECODE_success;
-
+
case 0xAA: /* stosb */
instr->instr = INSTR_STOS;
instr->op_size = BYTE;
@@ -513,7 +513,7 @@
instr->instr = INSTR_STOS;
GET_OP_SIZE_FOR_NONEBYTE(instr->op_size);
return DECODE_success;
-
+
case 0xC6:
if (((opcode[1] >> 3) & 7) == 0) { /* mov $imm8, m8 */
instr->instr = INSTR_MOV;
@@ -522,11 +522,11 @@
instr->operand[0] = mk_operand(instr->op_size, 0, 0, IMMEDIATE);
instr->immediate = get_immediate(vm86, opcode+1, instr->op_size);
instr->operand[1] = mk_operand(instr->op_size, 0, 0, MEMORY);
-
+
return DECODE_success;
} else
return DECODE_failure;
-
+
case 0xC7:
if (((opcode[1] >> 3) & 7) == 0) { /* mov $imm16/32, m16/32 */
instr->instr = INSTR_MOV;
@@ -535,7 +535,7 @@
instr->operand[0] = mk_operand(instr->op_size, 0, 0, IMMEDIATE);
instr->immediate = get_immediate(vm86, opcode+1, instr->op_size);
instr->operand[1] = mk_operand(instr->op_size, 0, 0, MEMORY);
-
+
return DECODE_success;
} else
return DECODE_failure;
@@ -598,34 +598,34 @@
return inst_len;
}
-void send_mmio_req(unsigned char type, unsigned long gpa,
+void send_mmio_req(unsigned char type, unsigned long gpa,
unsigned long count, int size, long value, int dir, int
pvalid)
{
- struct vcpu *d = current;
+ struct vcpu *v = current;
vcpu_iodata_t *vio;
ioreq_t *p;
int vm86;
struct cpu_user_regs *regs;
extern long evtchn_send(int lport);
- regs = current->domain->arch.vmx_platform.mpci.inst_decoder_regs;
-
- vio = get_vio(d->domain, d->vcpu_id);
+ regs = current->arch.arch_vmx.mmio_op.inst_decoder_regs;
+
+ vio = get_vio(v->domain, v->vcpu_id);
if (vio == NULL) {
printf("bad shared page\n");
- domain_crash_synchronous();
+ domain_crash_synchronous();
}
p = &vio->vp_ioreq;
vm86 = regs->eflags & X86_EFLAGS_VM;
- if (test_bit(ARCH_VMX_IO_WAIT, &d->arch.arch_vmx.flags)) {
+ if (test_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags)) {
printf("VMX I/O has not yet completed\n");
domain_crash_synchronous();
}
- set_bit(ARCH_VMX_IO_WAIT, &d->arch.arch_vmx.flags);
+ set_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags);
p->dir = dir;
p->pdata_valid = pvalid;
@@ -647,27 +647,27 @@
if (vmx_mmio_intercept(p)){
p->state = STATE_IORESP_READY;
- vmx_io_assist(d);
+ vmx_io_assist(v);
return;
}
- evtchn_send(iopacket_port(d->domain));
+ evtchn_send(iopacket_port(v->domain));
vmx_wait_io();
}
static void mmio_operands(int type, unsigned long gpa, struct instruction
*inst,
- struct mi_per_cpu_info *mpcip, struct cpu_user_regs
*regs)
+ struct mmio_op *mmio_opp, struct cpu_user_regs *regs)
{
unsigned long value = 0;
int index, size;
-
+
size = operand_size(inst->operand[0]);
- mpcip->flags = inst->flags;
- mpcip->instr = inst->instr;
- mpcip->operand[0] = inst->operand[0]; /* source */
- mpcip->operand[1] = inst->operand[1]; /* destination */
- mpcip->immediate = inst->immediate;
+ mmio_opp->flags = inst->flags;
+ mmio_opp->instr = inst->instr;
+ mmio_opp->operand[0] = inst->operand[0]; /* source */
+ mmio_opp->operand[1] = inst->operand[1]; /* destination */
+ mmio_opp->immediate = inst->immediate;
if (inst->operand[0] & REGISTER) { /* dest is memory */
index = operand_index(inst->operand[0]);
@@ -687,19 +687,19 @@
#define GET_REPEAT_COUNT() \
(mmio_inst.flags & REPZ ? (vm86 ? regs->ecx & 0xFFFF : regs->ecx) : 1)
-
+
void handle_mmio(unsigned long va, unsigned long gpa)
{
unsigned long eip, eflags, cs;
unsigned long inst_len, inst_addr;
- struct mi_per_cpu_info *mpcip;
+ struct mmio_op *mmio_opp;
struct cpu_user_regs *regs;
struct instruction mmio_inst;
unsigned char inst[MAX_INST_LEN];
int i, vm86, ret;
-
- mpcip = ¤t->domain->arch.vmx_platform.mpci;
- regs = mpcip->inst_decoder_regs;
+
+ mmio_opp = ¤t->arch.arch_vmx.mmio_op;
+ regs = mmio_opp->inst_decoder_regs;
__vmread(GUEST_RIP, &eip);
__vmread(VM_EXIT_INSTRUCTION_LEN, &inst_len);
@@ -720,7 +720,7 @@
}
init_instruction(&mmio_inst);
-
+
if (vmx_decode(inst, &mmio_inst) == DECODE_failure) {
printf("mmio opcode: va 0x%lx, gpa 0x%lx, len %ld:",
va, gpa, inst_len);
@@ -735,7 +735,7 @@
switch (mmio_inst.instr) {
case INSTR_MOV:
- mmio_operands(IOREQ_TYPE_COPY, gpa, &mmio_inst, mpcip, regs);
+ mmio_operands(IOREQ_TYPE_COPY, gpa, &mmio_inst, mmio_opp, regs);
break;
case INSTR_MOVS:
@@ -769,8 +769,8 @@
}
}
- mpcip->flags = mmio_inst.flags;
- mpcip->instr = mmio_inst.instr;
+ mmio_opp->flags = mmio_inst.flags;
+ mmio_opp->instr = mmio_inst.instr;
/*
* In case of a movs spanning multiple pages, we break the accesses
@@ -785,7 +785,7 @@
if ((addr & PAGE_MASK) != ((addr + size - 1) & PAGE_MASK)) {
unsigned long value = 0;
- mpcip->flags |= OVERLAP;
+ mmio_opp->flags |= OVERLAP;
regs->eip -= inst_len; /* do not advance %eip */
@@ -808,7 +808,7 @@
}
case INSTR_MOVZ:
- mmio_operands(IOREQ_TYPE_COPY, gpa, &mmio_inst, mpcip, regs);
+ mmio_operands(IOREQ_TYPE_COPY, gpa, &mmio_inst, mmio_opp, regs);
break;
case INSTR_STOS:
@@ -816,31 +816,31 @@
* Since the destination is always in (contiguous) mmio space we don't
* need to break it up into pages.
*/
- mpcip->flags = mmio_inst.flags;
- mpcip->instr = mmio_inst.instr;
+ mmio_opp->flags = mmio_inst.flags;
+ mmio_opp->instr = mmio_inst.instr;
send_mmio_req(IOREQ_TYPE_COPY, gpa,
GET_REPEAT_COUNT(), mmio_inst.op_size, regs->eax,
IOREQ_WRITE, 0);
break;
case INSTR_OR:
- mmio_operands(IOREQ_TYPE_OR, gpa, &mmio_inst, mpcip, regs);
+ mmio_operands(IOREQ_TYPE_OR, gpa, &mmio_inst, mmio_opp, regs);
break;
case INSTR_AND:
- mmio_operands(IOREQ_TYPE_AND, gpa, &mmio_inst, mpcip, regs);
+ mmio_operands(IOREQ_TYPE_AND, gpa, &mmio_inst, mmio_opp, regs);
break;
case INSTR_XOR:
- mmio_operands(IOREQ_TYPE_XOR, gpa, &mmio_inst, mpcip, regs);
+ mmio_operands(IOREQ_TYPE_XOR, gpa, &mmio_inst, mmio_opp, regs);
break;
case INSTR_CMP: /* Pass through */
case INSTR_TEST:
- mpcip->flags = mmio_inst.flags;
- mpcip->instr = mmio_inst.instr;
- mpcip->operand[0] = mmio_inst.operand[0]; /* source */
- mpcip->operand[1] = mmio_inst.operand[1]; /* destination */
- mpcip->immediate = mmio_inst.immediate;
+ mmio_opp->flags = mmio_inst.flags;
+ mmio_opp->instr = mmio_inst.instr;
+ mmio_opp->operand[0] = mmio_inst.operand[0]; /* source */
+ mmio_opp->operand[1] = mmio_inst.operand[1]; /* destination */
+ mmio_opp->immediate = mmio_inst.immediate;
/* send the request and wait for the value */
send_mmio_req(IOREQ_TYPE_COPY, gpa, 1, mmio_inst.op_size, 0,
IOREQ_READ, 0);
diff -r 62d815160f01 -r 1b4ad6eb6968 xen/include/asm-x86/vmx_platform.h
--- a/xen/include/asm-x86/vmx_platform.h Fri Oct 7 15:49:29 2005
+++ b/xen/include/asm-x86/vmx_platform.h Fri Oct 7 22:17:24 2005
@@ -75,20 +75,11 @@
#define MAX_INST_LEN 32
-struct mi_per_cpu_info {
- int flags;
- int instr; /* instruction */
- unsigned long operand[2]; /* operands */
- unsigned long immediate; /* immediate portion */
- struct cpu_user_regs *inst_decoder_regs; /* current context */
-};
-
struct virtual_platform_def {
unsigned long *real_mode_data; /* E820, etc. */
unsigned long shared_page_va;
struct vmx_virpit_t vmx_pit;
struct vmx_handler_t vmx_handler;
- struct mi_per_cpu_info mpci; /* MMIO */
};
extern void handle_mmio(unsigned long, unsigned long);
diff -r 62d815160f01 -r 1b4ad6eb6968 xen/include/asm-x86/vmx_vmcs.h
--- a/xen/include/asm-x86/vmx_vmcs.h Fri Oct 7 15:49:29 2005
+++ b/xen/include/asm-x86/vmx_vmcs.h Fri Oct 7 22:17:24 2005
@@ -71,6 +71,14 @@
unsigned long shadow_gs;
};
+struct mmio_op {
+ int flags;
+ int instr; /* instruction */
+ unsigned long operand[2]; /* operands */
+ unsigned long immediate; /* immediate portion */
+ struct cpu_user_regs *inst_decoder_regs; /* current context */
+};
+
#define PC_DEBUG_PORT 0x80
struct arch_vmx_struct {
@@ -83,7 +91,8 @@
unsigned long cpu_state;
unsigned long cpu_based_exec_control;
struct msr_state msr_content;
- void *io_bitmap_a, *io_bitmap_b;
+ struct mmio_op mmio_op; /* MMIO */
+ void *io_bitmap_a, *io_bitmap_b;
};
#define vmx_schedule_tail(next) \
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|