[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] (no subject)
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |