# HG changeset patch
# User emellor@xxxxxxxxxxxxxxxxxxxxxx
# Node ID 0afdf20b3efae5b7858f8378f8171159e891b068
# Parent d61fc1f33954b70e61fc4b086aed50f499fcf8b9
# Parent 7fd7f276bb38f08984fda45ef20ea8a085b482cd
Merged.
---
linux-2.6-xen-sparse/drivers/xen/netback/netback.c | 1
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c | 5
linux-2.6-xen-sparse/scripts/Makefile.xen | 6
tools/ioemu/configure | 2
tools/python/xen/xend/XendBootloader.py | 10 +
tools/python/xen/xend/XendDomainInfo.py | 3
tools/python/xen/xend/server/pciif.py | 2
tools/python/xen/xm/create.py | 14 +
xen/arch/x86/domain.c | 3
xen/arch/x86/hvm/svm/svm.c | 6
xen/arch/x86/hvm/vmx/io.c | 23 ++-
xen/arch/x86/hvm/vmx/vmx.c | 120 ++++++++---------
xen/arch/x86/irq.c | 1
xen/arch/x86/smp.c | 8 -
xen/arch/x86/traps.c | 2
xen/include/asm-x86/hvm/vmx/vmcs.h | 1
xen/include/asm-x86/hvm/vmx/vmx.h | 1
17 files changed, 122 insertions(+), 86 deletions(-)
diff -r d61fc1f33954 -r 0afdf20b3efa
linux-2.6-xen-sparse/drivers/xen/netback/netback.c
--- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Fri May 05
18:36:12 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Fri May 05
18:36:26 2006 +0100
@@ -659,6 +659,7 @@ static void net_tx_action(unsigned long
skb->data_len = txreq.size - data_len;
skb->len += skb->data_len;
+ skb->truesize += skb->data_len;
skb->dev = netif->dev;
skb->protocol = eth_type_trans(skb, skb->dev);
diff -r d61fc1f33954 -r 0afdf20b3efa
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c
--- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Fri May 05
18:36:12 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Fri May 05
18:36:26 2006 +0100
@@ -1069,6 +1069,11 @@ static int __init wait_for_devices(void)
{
unsigned long timeout = jiffies + 10*HZ;
+ if (xen_init() < 0) {
+ DPRINTK("failed");
+ return -ENODEV;
+ }
+
while (time_before(jiffies, timeout)) {
if (all_devices_ready())
return 0;
diff -r d61fc1f33954 -r 0afdf20b3efa linux-2.6-xen-sparse/scripts/Makefile.xen
--- a/linux-2.6-xen-sparse/scripts/Makefile.xen Fri May 05 18:36:12 2006 +0100
+++ b/linux-2.6-xen-sparse/scripts/Makefile.xen Fri May 05 18:36:26 2006 +0100
@@ -2,9 +2,9 @@
# cherrypickxen($1 = allobj)
cherrypickxen = $(foreach var, $(1), \
$(shell o=$(var); \
- c=$${o/%.o/-xen.c}; \
- s=$${o/%.o/-xen.S}; \
- oxen=$${o/%.o/-xen.o}; \
+ c=$${o%.o}-xen.c; \
+ s=$${o%.o}-xen.S; \
+ oxen=$${o%.o}-xen.o; \
[ -f $(srctree)/$(src)/$${c} ] || \
[ -f $(srctree)/$(src)/$${s} ] \
&& echo $$oxen \
diff -r d61fc1f33954 -r 0afdf20b3efa tools/ioemu/configure
--- a/tools/ioemu/configure Fri May 05 18:36:12 2006 +0100
+++ b/tools/ioemu/configure Fri May 05 18:36:26 2006 +0100
@@ -230,7 +230,7 @@ fi
if test -z "$vnc"; then
-if libvncserver-config --version >& /dev/null; then
+if libvncserver-config --version > /dev/null 2>&1; then
vnc=yes
else
vnc=no
diff -r d61fc1f33954 -r 0afdf20b3efa tools/python/xen/xend/XendBootloader.py
--- a/tools/python/xen/xend/XendBootloader.py Fri May 05 18:36:12 2006 +0100
+++ b/tools/python/xen/xend/XendBootloader.py Fri May 05 18:36:26 2006 +0100
@@ -19,7 +19,7 @@ from XendLogging import log
from XendLogging import log
from XendError import VmError
-def bootloader(blexec, disk, quiet = 0, blargs = None):
+def bootloader(blexec, disk, quiet = 0, blargs = None, imgcfg = None):
"""Run the boot loader executable on the given disk and return a
config image.
@param blexec Binary to use as the boot loader
@@ -86,4 +86,10 @@ def bootloader(blexec, disk, quiet = 0,
pin = sxp.Parser()
pin.input(ret)
pin.input_eof()
- return pin.val
+ blcfg = pin.val
+
+ if imgcfg is None:
+ return blcfg
+ else:
+ c = sxp.merge(blcfg, imgcfg)
+ return c
diff -r d61fc1f33954 -r 0afdf20b3efa tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py Fri May 05 18:36:12 2006 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py Fri May 05 18:36:26 2006 +0100
@@ -1633,7 +1633,8 @@ class XendDomainInfo:
continue
fn = blkdev_uname_to_file(disk)
blcfg = bootloader(self.info['bootloader'], fn, 1,
- self.info['bootloader_args'])
+ self.info['bootloader_args'],
+ self.info['image'])
break
if blcfg is None:
msg = "Had a bootloader specified, but can't find disk"
diff -r d61fc1f33954 -r 0afdf20b3efa tools/python/xen/xend/server/pciif.py
--- a/tools/python/xen/xend/server/pciif.py Fri May 05 18:36:12 2006 +0100
+++ b/tools/python/xen/xend/server/pciif.py Fri May 05 18:36:26 2006 +0100
@@ -94,7 +94,7 @@ class PciController(DevController):
else:
# Xen 2.0 configuration compatibility
- domain = get_param(dev_config, 'domain', 0)
+ domain = get_param(config, 'domain', 0)
bus = get_param(config, 'bus')
slot = get_param(config, 'dev')
func = get_param(config, 'func')
diff -r d61fc1f33954 -r 0afdf20b3efa tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py Fri May 05 18:36:12 2006 +0100
+++ b/tools/python/xen/xm/create.py Fri May 05 18:36:26 2006 +0100
@@ -448,8 +448,11 @@ def configure_image(vals):
def configure_image(vals):
"""Create the image config.
"""
+ if not vals.builder:
+ return None
config_image = [ vals.builder ]
- config_image.append([ 'kernel', os.path.abspath(vals.kernel) ])
+ if vals.kernel:
+ config_image.append([ 'kernel', os.path.abspath(vals.kernel) ])
if vals.ramdisk:
config_image.append([ 'ramdisk', os.path.abspath(vals.ramdisk) ])
if vals.cmdline_ip:
@@ -616,7 +619,7 @@ def configure_hvm(config_image, vals):
if (vals.__dict__[a]):
config_image.append([a, vals.__dict__[a]])
-def run_bootloader(vals):
+def run_bootloader(vals, config_image):
if not os.access(vals.bootloader, os.X_OK):
err("Bootloader isn't executable")
if len(vals.disk) < 1:
@@ -630,7 +633,7 @@ def run_bootloader(vals):
vals.bootargs = "--entry=%s" %(vals.bootentry,)
return bootloader(vals.bootloader, file, not vals.console_autoconnect,
- vals.bootargs)
+ vals.bootargs, config_image)
def make_config(vals):
"""Create the domain configuration.
@@ -662,13 +665,12 @@ def make_config(vals):
if vals.tpmif:
config.append(['backend', ['tpmif']])
+ config_image = configure_image(vals)
if vals.bootloader:
- config_image = run_bootloader(vals)
+ config_image = run_bootloader(vals, config_image)
config.append(['bootloader', vals.bootloader])
if vals.bootargs:
config.append(['bootloader_args'], vals.bootargs)
- else:
- config_image = configure_image(vals)
config.append(['image', config_image])
config_devs = []
diff -r d61fc1f33954 -r 0afdf20b3efa xen/arch/x86/domain.c
--- a/xen/arch/x86/domain.c Fri May 05 18:36:12 2006 +0100
+++ b/xen/arch/x86/domain.c Fri May 05 18:36:26 2006 +0100
@@ -753,7 +753,10 @@ int __sync_lazy_execstate(void)
switch_required = (this_cpu(curr_vcpu) != current);
if ( switch_required )
+ {
+ ASSERT(current == idle_vcpu[smp_processor_id()]);
__context_switch();
+ }
local_irq_restore(flags);
diff -r d61fc1f33954 -r 0afdf20b3efa xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Fri May 05 18:36:12 2006 +0100
+++ b/xen/arch/x86/hvm/svm/svm.c Fri May 05 18:36:26 2006 +0100
@@ -2821,11 +2821,7 @@ asmlinkage void svm_load_cr2(void)
struct vcpu *v = current;
local_irq_disable();
-#ifdef __i386__
- asm volatile("movl %0,%%cr2": :"r" (v->arch.hvm_svm.cpu_cr2));
-#else
- asm volatile("movq %0,%%cr2": :"r" (v->arch.hvm_svm.cpu_cr2));
-#endif
+ asm volatile("mov %0,%%cr2": :"r" (v->arch.hvm_svm.cpu_cr2));
}
asmlinkage void svm_asid(void)
diff -r d61fc1f33954 -r 0afdf20b3efa xen/arch/x86/hvm/vmx/io.c
--- a/xen/arch/x86/hvm/vmx/io.c Fri May 05 18:36:12 2006 +0100
+++ b/xen/arch/x86/hvm/vmx/io.c Fri May 05 18:36:26 2006 +0100
@@ -166,20 +166,26 @@ asmlinkage void vmx_intr_assist(void)
}
has_ext_irq = cpu_has_pending_irq(v);
+
+ if (unlikely(v->arch.hvm_vmx.vector_injected)) {
+ v->arch.hvm_vmx.vector_injected=0;
+ if (unlikely(has_ext_irq)) enable_irq_window(v);
+ return;
+ }
+
__vmread(IDT_VECTORING_INFO_FIELD, &idtv_info_field);
- if (idtv_info_field & INTR_INFO_VALID_MASK) {
+ if (unlikely(idtv_info_field & INTR_INFO_VALID_MASK)) {
__vmwrite(VM_ENTRY_INTR_INFO_FIELD, idtv_info_field);
__vmread(VM_EXIT_INSTRUCTION_LEN, &inst_len);
- if (inst_len >= 1 && inst_len <= 15)
- __vmwrite(VM_ENTRY_INSTRUCTION_LEN, inst_len);
-
- if (idtv_info_field & 0x800) { /* valid error code */
+ __vmwrite(VM_ENTRY_INSTRUCTION_LEN, inst_len);
+
+ if (unlikely(idtv_info_field & 0x800)) { /* valid error code */
unsigned long error_code;
__vmread(IDT_VECTORING_ERROR_CODE, &error_code);
__vmwrite(VM_ENTRY_EXCEPTION_ERROR_CODE, error_code);
}
- if ( has_ext_irq )
+ if (unlikely(has_ext_irq))
enable_irq_window(v);
HVM_DBG_LOG(DBG_LEVEL_1, "idtv_info_field=%x", idtv_info_field);
@@ -187,8 +193,9 @@ asmlinkage void vmx_intr_assist(void)
return;
}
- if ( !has_ext_irq ) return;
- if ( is_interruptibility_state() ) { /* pre-cleared for emulated
instruction */
+ if (likely(!has_ext_irq)) return;
+
+ if (unlikely(is_interruptibility_state())) { /* pre-cleared for
emulated instruction */
enable_irq_window(v);
HVM_DBG_LOG(DBG_LEVEL_1, "interruptibility");
return;
diff -r d61fc1f33954 -r 0afdf20b3efa xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c Fri May 05 18:36:12 2006 +0100
+++ b/xen/arch/x86/hvm/vmx/vmx.c Fri May 05 18:36:26 2006 +0100
@@ -893,6 +893,20 @@ static void vmx_vmexit_do_cpuid(struct c
#define CASE_GET_REG_P(REG, reg) \
case REG_ ## REG: reg_p = (unsigned long *)&(regs->reg); break
+#ifdef __i386__
+#define CASE_EXTEND_GET_REG_P
+#else
+#define CASE_EXTEND_GET_REG_P \
+ CASE_GET_REG_P(R8, r8); \
+ CASE_GET_REG_P(R9, r9); \
+ CASE_GET_REG_P(R10, r10); \
+ CASE_GET_REG_P(R11, r11); \
+ CASE_GET_REG_P(R12, r12); \
+ CASE_GET_REG_P(R13, r13); \
+ CASE_GET_REG_P(R14, r14); \
+ CASE_GET_REG_P(R15, r15)
+#endif
+
static void vmx_dr_access (unsigned long exit_qualification, struct
cpu_user_regs *regs)
{
unsigned int reg;
@@ -908,14 +922,15 @@ static void vmx_dr_access (unsigned long
"vmx_dr_access : eip=%lx, reg=%d, exit_qualification = %lx",
eip, reg, exit_qualification);
- switch(exit_qualification & DEBUG_REG_ACCESS_REG) {
- CASE_GET_REG_P(EAX, eax);
- CASE_GET_REG_P(ECX, ecx);
- CASE_GET_REG_P(EDX, edx);
- CASE_GET_REG_P(EBX, ebx);
- CASE_GET_REG_P(EBP, ebp);
- CASE_GET_REG_P(ESI, esi);
- CASE_GET_REG_P(EDI, edi);
+ switch ( exit_qualification & DEBUG_REG_ACCESS_REG ) {
+ CASE_GET_REG_P(EAX, eax);
+ CASE_GET_REG_P(ECX, ecx);
+ CASE_GET_REG_P(EDX, edx);
+ CASE_GET_REG_P(EBX, ebx);
+ CASE_GET_REG_P(EBP, ebp);
+ CASE_GET_REG_P(ESI, esi);
+ CASE_GET_REG_P(EDI, edi);
+ CASE_EXTEND_GET_REG_P;
case REG_ESP:
break;
default:
@@ -1525,28 +1540,29 @@ static int vmx_set_cr0(unsigned long val
return 1;
}
-#define CASE_GET_REG(REG, reg) \
+#define CASE_SET_REG(REG, reg) \
+ case REG_ ## REG: regs->reg = value; break
+#define CASE_GET_REG(REG, reg) \
case REG_ ## REG: value = regs->reg; break
-#define CASE_EXTEND_SET_REG \
- CASE_EXTEND_REG(S)
-#define CASE_EXTEND_GET_REG \
- CASE_EXTEND_REG(G)
+#define CASE_EXTEND_SET_REG \
+ CASE_EXTEND_REG(S)
+#define CASE_EXTEND_GET_REG \
+ CASE_EXTEND_REG(G)
#ifdef __i386__
#define CASE_EXTEND_REG(T)
#else
-#define CASE_EXTEND_REG(T) \
- CASE_ ## T ## ET_REG(R8, r8); \
- CASE_ ## T ## ET_REG(R9, r9); \
+#define CASE_EXTEND_REG(T) \
+ CASE_ ## T ## ET_REG(R8, r8); \
+ CASE_ ## T ## ET_REG(R9, r9); \
CASE_ ## T ## ET_REG(R10, r10); \
CASE_ ## T ## ET_REG(R11, r11); \
CASE_ ## T ## ET_REG(R12, r12); \
CASE_ ## T ## ET_REG(R13, r13); \
CASE_ ## T ## ET_REG(R14, r14); \
- CASE_ ## T ## ET_REG(R15, r15);
+ CASE_ ## T ## ET_REG(R15, r15)
#endif
-
/*
* Write to control registers
@@ -1557,31 +1573,28 @@ static int mov_to_cr(int gp, int cr, str
unsigned long old_cr;
struct vcpu *v = current;
- switch (gp) {
- CASE_GET_REG(EAX, eax);
- CASE_GET_REG(ECX, ecx);
- CASE_GET_REG(EDX, edx);
- CASE_GET_REG(EBX, ebx);
- CASE_GET_REG(EBP, ebp);
- CASE_GET_REG(ESI, esi);
- CASE_GET_REG(EDI, edi);
- CASE_EXTEND_GET_REG
- case REG_ESP:
- __vmread(GUEST_RSP, &value);
+ switch ( gp ) {
+ CASE_GET_REG(EAX, eax);
+ CASE_GET_REG(ECX, ecx);
+ CASE_GET_REG(EDX, edx);
+ CASE_GET_REG(EBX, ebx);
+ CASE_GET_REG(EBP, ebp);
+ CASE_GET_REG(ESI, esi);
+ CASE_GET_REG(EDI, edi);
+ CASE_EXTEND_GET_REG;
+ case REG_ESP:
+ __vmread(GUEST_RSP, &value);
break;
default:
printk("invalid gp: %d\n", gp);
__hvm_bug(regs);
}
- HVM_DBG_LOG(DBG_LEVEL_1, "mov_to_cr: CR%d, value = %lx,", cr, value);
- HVM_DBG_LOG(DBG_LEVEL_1, "current = %lx,", (unsigned long) current);
-
- switch(cr) {
+ HVM_DBG_LOG(DBG_LEVEL_1, "CR%d, value = %lx", cr, value);
+
+ switch ( cr ) {
case 0:
- {
return vmx_set_cr0(value);
- }
case 3:
{
unsigned long old_base_mfn, mfn;
@@ -1753,11 +1766,6 @@ static int mov_to_cr(int gp, int cr, str
return 1;
}
-#define CASE_SET_REG(REG, reg) \
- case REG_ ## REG: \
- regs->reg = value; \
- break
-
/*
* Read from control registers. CR0 and CR4 are read from the shadow.
*/
@@ -1766,22 +1774,22 @@ static void mov_from_cr(int cr, int gp,
unsigned long value;
struct vcpu *v = current;
- if (cr != 3)
+ if ( cr != 3 )
__hvm_bug(regs);
value = (unsigned long) v->arch.hvm_vmx.cpu_cr3;
- switch (gp) {
- CASE_SET_REG(EAX, eax);
- CASE_SET_REG(ECX, ecx);
- CASE_SET_REG(EDX, edx);
- CASE_SET_REG(EBX, ebx);
- CASE_SET_REG(EBP, ebp);
- CASE_SET_REG(ESI, esi);
- CASE_SET_REG(EDI, edi);
- CASE_EXTEND_SET_REG
- case REG_ESP:
- __vmwrite(GUEST_RSP, value);
+ switch ( gp ) {
+ CASE_SET_REG(EAX, eax);
+ CASE_SET_REG(ECX, ecx);
+ CASE_SET_REG(EDX, edx);
+ CASE_SET_REG(EBX, ebx);
+ CASE_SET_REG(EBP, ebp);
+ CASE_SET_REG(ESI, esi);
+ CASE_SET_REG(EDI, edi);
+ CASE_EXTEND_SET_REG;
+ case REG_ESP:
+ __vmwrite(GUEST_RSP, value);
regs->esp = value;
break;
default:
@@ -1789,7 +1797,7 @@ static void mov_from_cr(int cr, int gp,
__hvm_bug(regs);
}
- HVM_DBG_LOG(DBG_LEVEL_VMMU, "mov_from_cr: CR%d, value = %lx,", cr, value);
+ HVM_DBG_LOG(DBG_LEVEL_VMMU, "CR%d, value = %lx", cr, value);
}
static int vmx_cr_access(unsigned long exit_qualification, struct
cpu_user_regs *regs)
@@ -2284,11 +2292,7 @@ asmlinkage void vmx_load_cr2(void)
struct vcpu *v = current;
local_irq_disable();
-#ifdef __i386__
- asm volatile("movl %0,%%cr2": :"r" (v->arch.hvm_vmx.cpu_cr2));
-#else
- asm volatile("movq %0,%%cr2": :"r" (v->arch.hvm_vmx.cpu_cr2));
-#endif
+ asm volatile("mov %0,%%cr2": :"r" (v->arch.hvm_vmx.cpu_cr2));
}
asmlinkage void vmx_trace_vmentry (void)
diff -r d61fc1f33954 -r 0afdf20b3efa xen/arch/x86/irq.c
--- a/xen/arch/x86/irq.c Fri May 05 18:36:12 2006 +0100
+++ b/xen/arch/x86/irq.c Fri May 05 18:36:26 2006 +0100
@@ -318,6 +318,7 @@ static void __pirq_guest_eoi(struct doma
{
ASSERT(cpus_empty(action->cpu_eoi_map));
desc->handler->end(irq_to_vector(irq));
+ spin_unlock_irq(&desc->lock);
return;
}
diff -r d61fc1f33954 -r 0afdf20b3efa xen/arch/x86/smp.c
--- a/xen/arch/x86/smp.c Fri May 05 18:36:12 2006 +0100
+++ b/xen/arch/x86/smp.c Fri May 05 18:36:26 2006 +0100
@@ -169,6 +169,7 @@ fastcall void smp_invalidate_interrupt(v
{
ack_APIC_irq();
perfc_incrc(ipis);
+ irq_enter();
if ( !__sync_lazy_execstate() )
{
if ( flush_va == FLUSHVA_ALL )
@@ -177,6 +178,7 @@ fastcall void smp_invalidate_interrupt(v
local_flush_tlb_one(flush_va);
}
cpu_clear(smp_processor_id(), flush_cpumask);
+ irq_exit();
}
void __flush_tlb_mask(cpumask_t mask, unsigned long va)
@@ -335,6 +337,8 @@ fastcall void smp_call_function_interrup
if ( !cpu_isset(smp_processor_id(), call_data->selected) )
return;
+ irq_enter();
+
if ( call_data->wait )
{
(*func)(info);
@@ -347,4 +351,6 @@ fastcall void smp_call_function_interrup
atomic_inc(&call_data->started);
(*func)(info);
}
-}
+
+ irq_exit();
+}
diff -r d61fc1f33954 -r 0afdf20b3efa xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c Fri May 05 18:36:12 2006 +0100
+++ b/xen/arch/x86/traps.c Fri May 05 18:36:26 2006 +0100
@@ -674,6 +674,8 @@ asmlinkage int do_page_fault(struct cpu_
unsigned long addr, fixup;
int rc;
+ ASSERT(!in_irq());
+
__asm__ __volatile__ ("mov %%cr2,%0" : "=r" (addr) : );
DEBUGGER_trap_entry(TRAP_page_fault, regs);
diff -r d61fc1f33954 -r 0afdf20b3efa xen/include/asm-x86/hvm/vmx/vmcs.h
--- a/xen/include/asm-x86/hvm/vmx/vmcs.h Fri May 05 18:36:12 2006 +0100
+++ b/xen/include/asm-x86/hvm/vmx/vmcs.h Fri May 05 18:36:26 2006 +0100
@@ -68,6 +68,7 @@ struct arch_vmx_struct {
struct vmcs_struct *vmcs; /* VMCS pointer in virtual. */
unsigned int launch_cpu; /* VMCS is valid on this CPU. */
u32 exec_control; /* cache of cpu execution control */
+ u32 vector_injected; /* if there is vector installed
in the INTR_INFO_FIELD */
unsigned long flags; /* VMCS flags */
unsigned long cpu_cr0; /* copy of guest CR0 */
unsigned long cpu_shadow_cr0; /* copy of guest read shadow CR0 */
diff -r d61fc1f33954 -r 0afdf20b3efa xen/include/asm-x86/hvm/vmx/vmx.h
--- a/xen/include/asm-x86/hvm/vmx/vmx.h Fri May 05 18:36:12 2006 +0100
+++ b/xen/include/asm-x86/hvm/vmx/vmx.h Fri May 05 18:36:26 2006 +0100
@@ -444,6 +444,7 @@ static inline int __vmx_inject_exception
static inline int vmx_inject_exception(struct vcpu *v, int trap, int
error_code)
{
+ v->arch.hvm_vmx.vector_injected = 1;
return __vmx_inject_exception(v, trap, INTR_TYPE_EXCEPTION, error_code);
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|