Hi all,
I will post patches for catching up the remain features for PV-on-HVM.
> * need to catchup for IPF
> + 02.ioemu_xen_evtchns.diff: applied (cs:10974-10976) *not yet*
> - Flip the device model over to using the new Xen event channels
> + 04.hvm_inter.diff: applied (cs:11057)
> - Add support for sending event channel interrupts to HVM guests.
> + 10.hvm_op_hypercall.diff: applied (cs:11079)
> - Add stubs to Linux for the new hvm_op hypercall.
> + 12.add_maddr_h.diff: applied (cs:11081) *not yet*
> - Split useful bits of page.h into new header maddr.h.
> + **hvm_op fixup**: applied (cs:11070)
> - HVMOP_get_param return parameter value within the provided
> parameter struct
I had posted several patches for these features, a few days ago.
> * catch up `hvm_op fixup'
> - This patch modifies HYPERVISOR_hvm_op().
> * catch up `hvm_inter'
> - This patch adds support for sending event channel interrupts
> to VT-i guests.
> * catch up `hvm_op_hypercall'
> - This patch includes HYPERVISOR_hvm_op() stabs for linux.
This patch includes:
* catch up `split maddr.h'
- Split page.h into maddr.h
- This patch is like Alex's patch, but it includes preparation
for PV-on-HVM.
* catch up `new Xen event channles'
- DM over to using the new Xen event channel for IPF
- Modify xc_ia64_hvm_build for using the new Xen event channel
- We can't use wait_on_xen_event_channel() macro as x86 code.
Because IPF code is different with x86 code about MMIO
emulation. In x86 code, it waits for MMIO completion
at scheduler tail code. The purpose of the code is enabling
interupt handling during MMIO intercepts. But, in IPF code,
it's different.
- We will want to modify IPF code like x86 code in the future.
Thanks,
- Tsunehisa Doi
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID 5c75dc35f1ba16216fad2b9df939d8c1c80ab9bd
# Parent d42e9a6f537883c707ee5f7dd2a2c980881934c8
Split page.h into maddr.h for IPF
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r d42e9a6f5378 -r 5c75dc35f1ba
linux-2.6-xen-sparse/include/asm-ia64/page.h
--- a/linux-2.6-xen-sparse/include/asm-ia64/page.h Fri Aug 18 15:01:04
2006 -0600
+++ b/linux-2.6-xen-sparse/include/asm-ia64/page.h Tue Aug 22 14:10:21
2006 +0900
@@ -224,12 +224,11 @@ get_order (unsigned long size)
#ifndef __ASSEMBLY__
#ifdef CONFIG_XEN
-#define INVALID_P2M_ENTRY (~0UL)
+#include <asm/maddr.h>
#include <linux/kernel.h>
#include <asm/hypervisor.h>
#include <xen/features.h> // to compile netback, netfront
-typedef unsigned long maddr_t; // to compile netback, netfront
/*
* XXX hack!
@@ -268,69 +267,6 @@ extern struct address_space xen_ia64_for
})
#define HAVE_ARCH_FREE_PAGE
-/* XXX xen page size != page size */
-
-static inline unsigned long
-pfn_to_mfn_for_dma(unsigned long pfn)
-{
- unsigned long mfn;
- mfn = HYPERVISOR_phystomach(pfn);
- BUG_ON(mfn == 0); // XXX
- BUG_ON(mfn == INVALID_P2M_ENTRY); // XXX
- BUG_ON(mfn == INVALID_MFN);
- return mfn;
-}
-
-static inline unsigned long
-phys_to_machine_for_dma(unsigned long phys)
-{
- unsigned long machine =
- pfn_to_mfn_for_dma(phys >> PAGE_SHIFT) << PAGE_SHIFT;
- machine |= (phys & ~PAGE_MASK);
- return machine;
-}
-
-static inline unsigned long
-mfn_to_pfn_for_dma(unsigned long mfn)
-{
- unsigned long pfn;
- pfn = HYPERVISOR_machtophys(mfn);
- BUG_ON(pfn == 0);
- //BUG_ON(pfn == INVALID_M2P_ENTRY);
- return pfn;
-}
-
-static inline unsigned long
-machine_to_phys_for_dma(unsigned long machine)
-{
- unsigned long phys =
- mfn_to_pfn_for_dma(machine >> PAGE_SHIFT) << PAGE_SHIFT;
- phys |= (machine & ~PAGE_MASK);
- return phys;
-}
-
-#define set_phys_to_machine(pfn, mfn) do { } while (0)
-#define xen_machphys_update(mfn, pfn) do { } while (0)
-
-/* XXX to compile set_phys_to_machine(vaddr, FOREIGN_FRAME(m)) */
-#define FOREIGN_FRAME(m) (INVALID_P2M_ENTRY)
-
-#define mfn_to_pfn(mfn) (mfn)
-#define mfn_to_virt(mfn) (__va((mfn) << PAGE_SHIFT))
-#define pfn_to_mfn(pfn) (pfn)
-#define virt_to_mfn(virt) (__pa(virt) >> PAGE_SHIFT)
-#define virt_to_machine(virt) __pa(virt) // for tpmfront.c
-
-static inline unsigned long
-mfn_to_local_pfn(unsigned long mfn)
-{
- extern unsigned long max_mapnr;
- unsigned long pfn = mfn_to_pfn_for_dma(mfn);
- if (!pfn_valid(pfn))
- return INVALID_P2M_ENTRY;
- return pfn;
-}
-
#endif /* CONFIG_XEN */
#endif /* __ASSEMBLY__ */
diff -r d42e9a6f5378 -r 5c75dc35f1ba
linux-2.6-xen-sparse/include/asm-ia64/maddr.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/linux-2.6-xen-sparse/include/asm-ia64/maddr.h Tue Aug 22 14:10:21
2006 +0900
@@ -0,0 +1,88 @@
+#ifndef _IA64_MADDR_H
+#define _IA64_MADDR_H
+
+#include <linux/kernel.h>
+#include <asm/hypervisor.h>
+#include <xen/features.h>
+#include <xen/interface/xen.h>
+
+#ifdef CONFIG_XEN
+
+#define INVALID_P2M_ENTRY (~0UL)
+
+/* XXX xen page size != page size */
+static inline unsigned long
+pfn_to_mfn_for_dma(unsigned long pfn)
+{
+ unsigned long mfn;
+ mfn = HYPERVISOR_phystomach(pfn);
+ BUG_ON(mfn == 0); // XXX
+ BUG_ON(mfn == INVALID_P2M_ENTRY); // XXX
+ BUG_ON(mfn == INVALID_MFN);
+ return mfn;
+}
+
+static inline unsigned long
+mfn_to_pfn_for_dma(unsigned long mfn)
+{
+ unsigned long pfn;
+ pfn = HYPERVISOR_machtophys(mfn);
+ BUG_ON(pfn == 0);
+ //BUG_ON(pfn == INVALID_M2P_ENTRY);
+ return pfn;
+}
+
+static inline unsigned long
+phys_to_machine_for_dma(unsigned long phys)
+{
+ unsigned long machine =
+ pfn_to_mfn_for_dma(phys >> PAGE_SHIFT) << PAGE_SHIFT;
+ machine |= (phys & ~PAGE_MASK);
+ return machine;
+}
+
+static inline unsigned long
+machine_to_phys_for_dma(unsigned long machine)
+{
+ unsigned long phys =
+ mfn_to_pfn_for_dma(machine >> PAGE_SHIFT) << PAGE_SHIFT;
+ phys |= (machine & ~PAGE_MASK);
+ return phys;
+}
+
+static inline unsigned long
+mfn_to_local_pfn(unsigned long mfn)
+{
+ extern unsigned long max_mapnr;
+ unsigned long pfn = mfn_to_pfn_for_dma(mfn);
+ if (!pfn_valid(pfn))
+ return INVALID_P2M_ENTRY;
+ return pfn;
+}
+
+#else /* !CONFIG_XEN */
+
+#define pfn_to_mfn_for_dma(pfn) (pfn)
+#define mfn_to_pfn_for_dma(mfn) (mfn)
+#define phys_to_machine_for_dma(phys) (phys)
+#define machine_to_phys_for_dma(machine) (machine)
+#define mfn_to_local_pfn(mfn) (mfn)
+
+#endif /* !CONFIG_XEN */
+
+/* XXX to compile set_phys_to_machine(vaddr, FOREIGN_FRAME(m)) */
+#define FOREIGN_FRAME(m) (INVALID_P2M_ENTRY)
+
+#define mfn_to_pfn(mfn) (mfn)
+#define pfn_to_mfn(pfn) (pfn)
+
+#define mfn_to_virt(mfn) (__va((mfn) << PAGE_SHIFT))
+#define virt_to_mfn(virt) (__pa(virt) >> PAGE_SHIFT)
+#define virt_to_machine(virt) __pa(virt) // for tpmfront.c
+
+#define set_phys_to_machine(pfn, mfn) do { } while (0)
+#define xen_machphys_update(mfn, pfn) do { } while (0)
+
+typedef unsigned long maddr_t; // to compile netback, netfront
+
+#endif /* _IA64_MADDR_H */
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID cda8a9d0a55755d6e7d02fc0e38737f73a97b3d1
# Parent 5c75dc35f1ba16216fad2b9df939d8c1c80ab9bd
DM over to using the new Xen event channels for IPF
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r 5c75dc35f1ba -r cda8a9d0a557 xen/arch/ia64/vmx/mmio.c
--- a/xen/arch/ia64/vmx/mmio.c Tue Aug 22 14:10:21 2006 +0900
+++ b/xen/arch/ia64/vmx/mmio.c Tue Aug 22 14:36:32 2006 +0900
@@ -155,10 +155,9 @@ static void low_mmio_access(VCPU *vcpu,
p->type = 1;
p->df = 0;
- set_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags);
- p->state = STATE_IOREQ_READY;
- evtchn_send(iopacket_port(v));
- vmx_wait_io();
+ p->io_count++;
+
+ vmx_send_assist_req(v);
if(dir==IOREQ_READ){ //read
*val=p->u.data;
}
@@ -187,11 +186,9 @@ static void legacy_io_access(VCPU *vcpu,
p->type = 0;
p->df = 0;
- set_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags);
- p->state = STATE_IOREQ_READY;
- evtchn_send(iopacket_port(v));
-
- vmx_wait_io();
+ p->io_count++;
+
+ vmx_send_assist_req(v);
if(dir==IOREQ_READ){ //read
*val=p->u.data;
}
diff -r 5c75dc35f1ba -r cda8a9d0a557 xen/arch/ia64/vmx/vmx_init.c
--- a/xen/arch/ia64/vmx/vmx_init.c Tue Aug 22 14:10:21 2006 +0900
+++ b/xen/arch/ia64/vmx/vmx_init.c Tue Aug 22 14:36:32 2006 +0900
@@ -207,7 +207,7 @@ vmx_create_vp(struct vcpu *v)
u64 ret;
vpd_t *vpd = (vpd_t *)v->arch.privregs;
u64 ivt_base;
- extern char vmx_ia64_ivt;
+ extern char vmx_ia64_ivt;
/* ia64_ivt is function pointer, so need this tranlation */
ivt_base = (u64) &vmx_ia64_ivt;
printk("ivt_base: 0x%lx\n", ivt_base);
@@ -266,6 +266,28 @@ vmx_load_state(struct vcpu *v)
* anchored in vcpu */
}
+static void vmx_create_event_channels(struct vcpu *v)
+{
+ vcpu_iodata_t *p;
+ struct vcpu *o;
+
+ if (v->vcpu_id == 0) {
+ /* Ugly: create event channels for every vcpu when vcpu 0
+ starts, so that they're available for ioemu to bind to. */
+ for_each_vcpu(v->domain, o) {
+ p = get_vio(v->domain, o->vcpu_id);
+ o->arch.arch_vmx.xen_port = p->vp_eport =
+ alloc_unbound_xen_event_channel(o, 0);
+ DPRINTK("Allocated port %d for hvm.\n",
o->arch.arch_vmx.xen_port);
+ }
+ }
+}
+
+static void vmx_release_assist_channel(struct vcpu *v)
+{
+ free_xen_event_channel(v, v->arch.arch_vmx.xen_port);
+}
+
/*
* Initialize VMX envirenment for guest. Only the 1st vp/vcpu
* is registered here.
@@ -287,6 +309,8 @@ vmx_final_setup_guest(struct vcpu *v)
#ifndef HASH_VHPT
init_domain_tlb(v);
#endif
+ vmx_create_event_channels(v);
+
/* v->arch.schedule_tail = arch_vmx_do_launch; */
vmx_create_vp(v);
@@ -302,6 +326,16 @@ vmx_final_setup_guest(struct vcpu *v)
set_bit(ARCH_VMX_INTR_ASSIST, &v->arch.arch_vmx.flags);
/* Set up guest 's indicator for VTi domain*/
set_bit(ARCH_VMX_DOMAIN, &v->arch.arch_vmx.flags);
+}
+
+void
+vmx_relinquish_guest_resources(struct domain *d)
+{
+ struct vcpu *v;
+
+ for_each_vcpu(d, v) {
+ vmx_release_assist_channel(v);
+ }
}
void
@@ -421,13 +455,5 @@ void vmx_setup_platform(struct domain *d
void vmx_do_launch(struct vcpu *v)
{
- if (evtchn_bind_vcpu(iopacket_port(v), v->vcpu_id) < 0) {
- printk("VMX domain bind port %d to vcpu %d failed!\n",
- iopacket_port(v), v->vcpu_id);
- domain_crash_synchronous();
- }
-
- clear_bit(iopacket_port(v), &v->domain->shared_info->evtchn_mask[0]);
-
vmx_load_all_rr(v);
}
diff -r 5c75dc35f1ba -r cda8a9d0a557 xen/arch/ia64/vmx/vmx_support.c
--- a/xen/arch/ia64/vmx/vmx_support.c Tue Aug 22 14:10:21 2006 +0900
+++ b/xen/arch/ia64/vmx/vmx_support.c Tue Aug 22 14:36:32 2006 +0900
@@ -1,4 +1,3 @@
-
/* -*- Mode:C; c-basic-offset:4; tab-width:4; indent-tabs-mode:nil -*- */
/*
* vmx_support.c: vmx specific support interface.
@@ -22,45 +21,11 @@
#include <xen/config.h>
#include <xen/sched.h>
#include <xen/hypercall.h>
+#include <xen/event.h>
#include <public/sched.h>
#include <public/hvm/ioreq.h>
#include <asm/vmx.h>
#include <asm/vmx_vcpu.h>
-
-/*
- * I/O emulation should be atomic from domain point of view. However,
- * when emulation code is waiting for I/O completion by blocking,
- * other events like DM interrupt, VBD, etc. may come and unblock
- * current exection flow. So we have to prepare for re-block if unblocked
- * by non I/O completion event. After io emulation is done, re-enable
- * pending indicaion if other ports are pending
- */
-void vmx_wait_io(void)
-{
- struct vcpu *v = current;
- struct domain *d = v->domain;
- int port = iopacket_port(v);
-
- for (;;) {
- if (test_and_clear_bit(0, &v->vcpu_info->evtchn_upcall_pending) &&
- test_and_clear_bit(port / BITS_PER_LONG,
- &v->vcpu_info->evtchn_pending_sel) &&
- test_and_clear_bit(port, &d->shared_info->evtchn_pending[0]))
- vmx_io_assist(v);
-
- if (!test_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags))
- break;
-
- do_sched_op_compat(SCHEDOP_block, 0);
- }
-
- /* re-enable indication if other pending events */
- if (d->shared_info->evtchn_pending[port / BITS_PER_LONG])
- set_bit(port / BITS_PER_LONG, &v->vcpu_info->evtchn_pending_sel);
-
- if (v->vcpu_info->evtchn_pending_sel)
- set_bit(0, &v->vcpu_info->evtchn_upcall_pending);
-}
/*
* Only place to call vmx_io_assist is mmio/legacy_io emulation.
@@ -83,17 +48,15 @@ void vmx_io_assist(struct vcpu *v)
p = &vio->vp_ioreq;
- if (test_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags)) {
- if (p->state != STATE_IORESP_READY) {
- /* Can't block here, for the same reason as other places to
- * use vmx_wait_io. Simple return is safe since vmx_wait_io will
- * try to block again
- */
- return;
- } else
- p->state = STATE_INVALID;
-
- clear_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags);
+ if (p->state == STATE_IORESP_READY) {
+ p->state = STATE_INVALID;
+ }
+ else {
+ /* Can't block here, for the same reason as other places to
+ * use vmx_wait_io. Simple return is safe since vmx_wait_io will
+ * try to block again
+ */
+ return;
}
}
@@ -108,31 +71,6 @@ void vmx_io_assist(struct vcpu *v)
*/
void vmx_intr_assist(struct vcpu *v)
{
- vcpu_iodata_t *vio;
- struct domain *d = v->domain;
- extern void vmx_vcpu_pend_batch_interrupt(VCPU *vcpu,
- unsigned long *pend_irr);
- int port = iopacket_port(v);
-
- if (test_bit(port, &d->shared_info->evtchn_pending[0]) ||
- test_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags))
- vmx_wait_io();
-
- /* I/O emulation is atomic, so it's impossible to see execution flow
- * out of vmx_wait_io, when guest is still waiting for response.
- */
- if (test_bit(ARCH_VMX_IO_WAIT, &v->arch.arch_vmx.flags))
- panic_domain(vcpu_regs(v),"!!!Bad resume to guest before I/O emulation
is done.\n");
-
- /* Even without event pending, we still need to sync pending bits
- * between DM and vlsapic. The reason is that interrupt delivery
- * shares same event channel as I/O emulation, with corresponding
- * indicator possibly cleared when vmx_wait_io().
- */
- vio = get_vio(v->domain, v->vcpu_id);
- if (!vio)
- panic_domain(vcpu_regs(v),"Corruption: bad shared page: %lx\n",
(unsigned long)vio);
-
#ifdef V_IOSAPIC_READY
/* Confirm virtual interrupt line signals, and set pending bits in vpd */
if(v->vcpu_id==0)
@@ -140,3 +78,52 @@ void vmx_intr_assist(struct vcpu *v)
#endif
return;
}
+
+void vmx_send_assist_req(struct vcpu *v)
+{
+ ioreq_t *p;
+
+ p = &get_vio(v->domain, v->vcpu_id)->vp_ioreq;
+ if (unlikely(p->state != STATE_INVALID)) {
+ /* This indicates a bug in the device model. Crash the
+ domain. */
+ printk("Device model set bad IO state %d.\n", p->state);
+ domain_crash(v->domain);
+ return;
+ }
+ wmb();
+ p->state = STATE_IOREQ_READY;
+ notify_via_xen_event_channel(v->arch.arch_vmx.xen_port);
+
+ /*
+ * Waiting for MMIO completion
+ * like the wait_on_xen_event_channel() macro like...
+ * but, we can't call do_softirq() at this point..
+ */
+ for (;;) {
+ if (p->state != STATE_IOREQ_READY &&
+ p->state != STATE_IOREQ_INPROCESS)
+ break;
+ set_bit(_VCPUF_blocked_in_xen, ¤t->vcpu_flags);
+ mb(); /* set blocked status /then/ re-evaluate condition */
+ if (p->state != STATE_IOREQ_READY &&
+ p->state != STATE_IOREQ_INPROCESS)
+ {
+ clear_bit(_VCPUF_blocked_in_xen, ¤t->vcpu_flags);
+ break;
+ }
+
+ /* I want to call __enter_scheduler() only */
+ do_sched_op_compat(SCHEDOP_yield, 0);
+ mb();
+ }
+
+ /* the code under this line is completer phase... */
+ vmx_io_assist(v);
+}
+
+/* Wake up a vcpu whihc is waiting for interrupts to come in */
+void vmx_prod_vcpu(struct vcpu *v)
+{
+ vcpu_unblock(v);
+}
diff -r 5c75dc35f1ba -r cda8a9d0a557 xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Tue Aug 22 14:10:21 2006 +0900
+++ b/xen/arch/ia64/xen/domain.c Tue Aug 22 14:36:32 2006 +0900
@@ -544,6 +544,10 @@ void domain_relinquish_resources(struct
// relase page traversing d->arch.mm.
relinquish_mm(d);
+ if (d->vcpu[0] && VMX_DOMAIN(d->vcpu[0])) {
+ vmx_relinquish_guest_resources(d);
+ }
+
relinquish_memory(d, &d->xenpage_list);
relinquish_memory(d, &d->page_list);
diff -r 5c75dc35f1ba -r cda8a9d0a557 xen/include/asm-ia64/vmx.h
--- a/xen/include/asm-ia64/vmx.h Tue Aug 22 14:10:21 2006 +0900
+++ b/xen/include/asm-ia64/vmx.h Tue Aug 22 14:36:32 2006 +0900
@@ -35,7 +35,6 @@ extern void vmx_save_state(struct vcpu *
extern void vmx_save_state(struct vcpu *v);
extern void vmx_load_state(struct vcpu *v);
extern void vmx_setup_platform(struct domain *d);
-extern void vmx_wait_io(void);
extern void vmx_io_assist(struct vcpu *v);
extern int ia64_hypercall (struct pt_regs *regs);
extern void vmx_save_state(struct vcpu *v);
@@ -53,17 +52,13 @@ extern void vmx_intr_assist(struct vcpu
extern void vmx_intr_assist(struct vcpu *v);
extern void set_illegal_op_isr (struct vcpu *vcpu);
extern void illegal_op (struct vcpu *vcpu);
+extern void vmx_relinquish_guest_resources(struct domain *d);
extern void vmx_relinquish_vcpu_resources(struct vcpu *v);
extern void vmx_die_if_kernel(char *str, struct pt_regs *regs, long err);
static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu)
{
return &((shared_iopage_t
*)d->arch.vmx_platform.shared_page_va)->vcpu_iodata[cpu];
-}
-
-static inline int iopacket_port(struct vcpu *v)
-{
- return get_vio(v->domain, v->vcpu_id)->vp_eport;
}
static inline shared_iopage_t *get_sp(struct domain *d)
diff -r 5c75dc35f1ba -r cda8a9d0a557 xen/include/asm-ia64/vmx_vpd.h
--- a/xen/include/asm-ia64/vmx_vpd.h Tue Aug 22 14:10:21 2006 +0900
+++ b/xen/include/asm-ia64/vmx_vpd.h Tue Aug 22 14:36:32 2006 +0900
@@ -96,7 +96,8 @@ struct arch_vmx_struct {
// unsigned long rfi_ipsr;
// unsigned long rfi_ifs;
// unsigned long in_service[4]; // vLsapic inservice IRQ bits
- unsigned long flags;
+ unsigned long flags;
+ unsigned long xen_port;
#ifdef VTI_DEBUG
unsigned long ivt_current;
struct ivt_debug ivt_debug[IVT_DEBUG_MAX];
# HG changeset patch
# User Doi.Tsunehisa@xxxxxxxxxxxxxx
# Node ID a30e25a2c6226308c4c09a78f675ea2108fc0617
# Parent cda8a9d0a55755d6e7d02fc0e38737f73a97b3d1
Modify xc_ia64_hvm_build for using the new Xen event channels
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@xxxxxxxxxxxxxx>
Signed-off-by: Tomonari Horikoshi <t.horikoshi@xxxxxxxxxxxxxx>
diff -r cda8a9d0a557 -r a30e25a2c622 tools/libxc/ia64/xc_ia64_hvm_build.c
--- a/tools/libxc/ia64/xc_ia64_hvm_build.c Tue Aug 22 14:36:32 2006 +0900
+++ b/tools/libxc/ia64/xc_ia64_hvm_build.c Tue Aug 22 14:39:37 2006 +0900
@@ -553,7 +553,6 @@ setup_guest(int xc_handle, uint32_t dom,
{
unsigned long page_array[2];
shared_iopage_t *sp;
- int i;
unsigned long dom_memsize = (memsize << 20);
DECLARE_DOM0_OP;
@@ -605,18 +604,6 @@ setup_guest(int xc_handle, uint32_t dom,
goto error_out;
memset(sp, 0, PAGE_SIZE);
-
- for (i = 0; i < vcpus; i++) {
- uint32_t vp_eport;
-
- vp_eport = xc_evtchn_alloc_unbound(xc_handle, dom, 0);
- if (vp_eport < 0) {
- DPRINTF("Couldn't get unbound port from VMX guest.\n");
- goto error_out;
- }
- sp->vcpu_iodata[i].vp_eport = vp_eport;
- }
-
munmap(sp, PAGE_SIZE);
return 0;
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|