[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Merge with http://xenbits.xensource.com/ext/xen-unstable-docs.hg
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 476d02c1346ca131c21fa33608f6b310a17643f1 # Parent f1c07363956b06078b33b245dc51811c9a8c5b05 # Parent 6a593de2f8ba95f3d3eb1c8eaa3970300dc4896f Merge with http://xenbits.xensource.com/ext/xen-unstable-docs.hg diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/arch/xen/i386/kernel/entry.S --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/entry.S Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/entry.S Thu Nov 10 17:25:27 2005 @@ -81,7 +81,7 @@ #define evtchn_upcall_pending /* 0 */ #define evtchn_upcall_mask 1 -#define sizeof_vcpu_shift 3 +#define sizeof_vcpu_shift 4 #ifdef CONFIG_SMP #define preempt_disable(reg) incl TI_preempt_count(reg) @@ -813,35 +813,9 @@ pushl $do_alignment_check jmp error_code -# This handler is special, because it gets an extra value on its stack, -# which is the linear faulting address. -# fastcall register usage: %eax = pt_regs, %edx = error code, -# %ecx = fault address ENTRY(page_fault) - pushl %ds - pushl %eax - xorl %eax, %eax - pushl %ebp - pushl %edi - pushl %esi - pushl %edx - decl %eax /* eax = -1 */ - pushl %ecx - pushl %ebx - cld - pushl %es -# UNWIND_ESPFIX_STACK - popl %edi - movl ES(%esp), %ecx /* get the faulting address */ - movl ORIG_EAX(%esp), %edx /* get the error code */ - movl %eax, ORIG_EAX(%esp) - movl %edi, ES(%esp) - movl $(__KERNEL_DS),%eax - movl %eax, %ds - movl %eax, %es - movl %esp,%eax /* pt_regs pointer */ - call do_page_fault - jmp ret_from_exception + pushl $do_page_fault + jmp error_code #ifdef CONFIG_X86_MCE ENTRY(machine_check) diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/traps.c Thu Nov 10 17:25:27 2005 @@ -650,7 +650,7 @@ static inline void conditional_sti(struct pt_regs *regs) { - if ((uint8_t)(regs->xcs >> 16) == 0) + if (regs->eflags & (X86_EFLAGS_IF|VM_MASK)) local_irq_enable(); } @@ -972,7 +972,7 @@ /* - * NB. All these are "trap gates" (i.e. events_mask isn't cleared) except + * NB. All these are "trap gates" (i.e. events_mask isn't set) except * for those that specify <dpl>|4 in the second field. */ static trap_info_t trap_table[] = { @@ -988,7 +988,7 @@ { 11, 0, __KERNEL_CS, (unsigned long)segment_not_present }, { 12, 0, __KERNEL_CS, (unsigned long)stack_segment }, { 13, 0, __KERNEL_CS, (unsigned long)general_protection }, - { 14, 0, __KERNEL_CS, (unsigned long)page_fault }, + { 14, 0|4, __KERNEL_CS, (unsigned long)page_fault }, { 15, 0, __KERNEL_CS, (unsigned long)fixup_4gb_segment }, { 16, 0, __KERNEL_CS, (unsigned long)coprocessor_error }, { 17, 0, __KERNEL_CS, (unsigned long)alignment_check }, diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/fault.c Thu Nov 10 17:25:27 2005 @@ -279,14 +279,17 @@ * bit 1 == 0 means read, 1 means write * bit 2 == 0 means kernel, 1 means user-mode */ -fastcall void do_page_fault(struct pt_regs *regs, unsigned long error_code, - unsigned long address) +fastcall void do_page_fault(struct pt_regs *regs, unsigned long error_code) { struct task_struct *tsk; struct mm_struct *mm; struct vm_area_struct * vma; + unsigned long address; int write; siginfo_t info; + + address = HYPERVISOR_shared_info->vcpu_data[ + smp_processor_id()].arch.cr2; /* Set the "privileged fault" bit to something sane. */ error_code &= ~4; @@ -297,11 +300,9 @@ if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, SIGSEGV) == NOTIFY_STOP) return; -#if 0 /* It's safe to allow irq's after cr2 has been saved */ if (regs->eflags & (X86_EFLAGS_IF|VM_MASK)) local_irq_enable(); -#endif tsk = current; diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c --- a/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/arch/xen/i386/mm/hypervisor.c Thu Nov 10 17:25:27 2005 @@ -342,8 +342,8 @@ mfn = pte_mfn(*pte); BUG_ON(HYPERVISOR_update_va_mapping( vstart + (i*PAGE_SIZE), __pte_ma(0), 0)); - phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = - INVALID_P2M_ENTRY; + set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, + INVALID_P2M_ENTRY); BUG_ON(HYPERVISOR_memory_op( XENMEM_decrease_reservation, &reservation) != 1); } @@ -361,7 +361,7 @@ vstart + (i*PAGE_SIZE), pfn_pte_ma(mfn+i, PAGE_KERNEL), 0)); xen_machphys_update(mfn+i, (__pa(vstart)>>PAGE_SHIFT)+i); - phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = mfn+i; + set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, mfn+i); } flush_tlb_all(); @@ -383,7 +383,7 @@ vstart + (i*PAGE_SIZE), pfn_pte_ma(mfn, PAGE_KERNEL), 0)); xen_machphys_update(mfn, (__pa(vstart)>>PAGE_SHIFT)+i); - phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = mfn; + set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, mfn); } flush_tlb_all(); @@ -422,8 +422,8 @@ mfn = pte_mfn(*pte); BUG_ON(HYPERVISOR_update_va_mapping( vstart + (i*PAGE_SIZE), __pte_ma(0), 0)); - phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = - INVALID_P2M_ENTRY; + set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, + INVALID_P2M_ENTRY); BUG_ON(HYPERVISOR_memory_op( XENMEM_decrease_reservation, &reservation) != 1); } @@ -436,7 +436,7 @@ vstart + (i*PAGE_SIZE), pfn_pte_ma(mfn, PAGE_KERNEL), 0)); xen_machphys_update(mfn, (__pa(vstart)>>PAGE_SHIFT)+i); - phys_to_machine_mapping[(__pa(vstart)>>PAGE_SHIFT)+i] = mfn; + set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, mfn); } flush_tlb_all(); diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/entry.S Thu Nov 10 17:25:27 2005 @@ -874,42 +874,8 @@ ret CFI_ENDPROC - - /* - * Copy error_entry because of the different stack frame - */ ENTRY(page_fault) - movq (%rsp),%rcx - movq 8(%rsp),%r11 - addq $0x10,%rsp # now %rsp points to %cr2 - pushq %rax - leaq do_page_fault(%rip),%rax - cld - subq $13*8,%rsp - movq %rdx,12*8(%rsp) # save %rdx - movq 13*8(%rsp),%rdx # load rax - movq %rcx,11*8(%rsp) - movq %rdx,10*8(%rsp) # store rax - movq %rsi,13*8(%rsp) # now save %rsi - movq 14*8(%rsp),%rdx # load %cr2, 3rd argument - movq %r8, 9*8(%rsp) - movq %r9, 8*8(%rsp) - movq %r10,7*8(%rsp) - movq %r11,6*8(%rsp) - movq %rbx,5*8(%rsp) - movq %rbp,4*8(%rsp) - movq %r12,3*8(%rsp) - movq %r13,2*8(%rsp) - movq %r14,1*8(%rsp) - movq %r15,(%rsp) -#if 0 - cmpl $__KERNEL_CS,CS(%rsp) - je error_kernelspace -#endif - /* - * 1st and 2nd arguments are set by error_call_handler - */ - jmp error_call_handler + errorentry do_page_fault ENTRY(coprocessor_error) zeroentry do_coprocessor_error @@ -948,24 +914,15 @@ paranoid_exit: testl %ebx,%ebx /* swapgs needed? */ jnz paranoid_restore + testl $3,CS(%rsp) + jnz paranoid_userspace paranoid_swapgs: -/* swapgs */ + swapgs paranoid_restore: RESTORE_ALL 8 -/* iretq */ + iretq paranoid_userspace: GET_THREAD_INFO(%rcx) -# movl threadinfo_flags(%rcx),%edx -# testl $_TIF_NEED_RESCHED,%edx -# jnz paranoid_resched -# testl $(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SINGLESTEP),%edx -# jnz paranoid_signal -# jmp paranoid_swapgs -#paranoid_resched: -#/* sti */ -# call schedule -# jmp paranoid_exit -#paranoid_signal: movl threadinfo_flags(%rcx),%ebx andl $_TIF_WORK_MASK,%ebx jz paranoid_swapgs @@ -975,13 +932,10 @@ testl $_TIF_NEED_RESCHED,%ebx jnz paranoid_schedule movl %ebx,%edx /* arg3: thread flags */ -/* sti */ -# xorl %esi,%esi /* oldset */ -# movq %rsp,%rdi /* &pt_regs */ + sti xorl %esi,%esi /* arg2: oldset */ movq %rsp,%rdi /* arg1: &pt_regs */ call do_notify_resume -# jmp paranoid_exit cli jmp paranoid_userspace paranoid_schedule: @@ -1057,4 +1011,3 @@ ENTRY(call_debug) zeroentry do_call_debug - diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/traps.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/traps.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/traps.c Thu Nov 10 17:25:27 2005 @@ -905,30 +905,33 @@ } +/* + * NB. All these are "interrupt gates" (i.e. events_mask is set) because we + * specify <dpl>|4 in the second field. + */ static trap_info_t trap_table[] = { - { 0, 0, (__KERNEL_CS|0x3), (unsigned long)divide_error }, - { 1, 0, (__KERNEL_CS|0x3), (unsigned long)debug }, - { 3, 3, (__KERNEL_CS|0x3), (unsigned long)int3 }, - { 4, 3, (__KERNEL_CS|0x3), (unsigned long)overflow }, - { 5, 3, (__KERNEL_CS|0x3), (unsigned long)bounds }, - { 6, 0, (__KERNEL_CS|0x3), (unsigned long)invalid_op }, - { 7, 0, (__KERNEL_CS|0x3), (unsigned long)device_not_available }, - { 9, 0, (__KERNEL_CS|0x3), (unsigned long)coprocessor_segment_overrun}, - { 10, 0, (__KERNEL_CS|0x3), (unsigned long)invalid_TSS }, - { 11, 0, (__KERNEL_CS|0x3), (unsigned long)segment_not_present }, - { 12, 0, (__KERNEL_CS|0x3), (unsigned long)stack_segment }, - { 13, 0, (__KERNEL_CS|0x3), (unsigned long)general_protection }, - { 14, 0, (__KERNEL_CS|0x3), (unsigned long)page_fault }, - { 15, 0, (__KERNEL_CS|0x3), (unsigned long)spurious_interrupt_bug }, - { 16, 0, (__KERNEL_CS|0x3), (unsigned long)coprocessor_error }, - { 17, 0, (__KERNEL_CS|0x3), (unsigned long)alignment_check }, + { 0, 0|4, (__KERNEL_CS|0x3), (unsigned long)divide_error }, + { 1, 0|4, (__KERNEL_CS|0x3), (unsigned long)debug }, + { 3, 3|4, (__KERNEL_CS|0x3), (unsigned long)int3 }, + { 4, 3|4, (__KERNEL_CS|0x3), (unsigned long)overflow }, + { 5, 3|4, (__KERNEL_CS|0x3), (unsigned long)bounds }, + { 6, 0|4, (__KERNEL_CS|0x3), (unsigned long)invalid_op }, + { 7, 0|4, (__KERNEL_CS|0x3), (unsigned long)device_not_available }, + { 9, 0|4, (__KERNEL_CS|0x3), (unsigned long)coprocessor_segment_overrun}, + { 10, 0|4, (__KERNEL_CS|0x3), (unsigned long)invalid_TSS }, + { 11, 0|4, (__KERNEL_CS|0x3), (unsigned long)segment_not_present }, + { 12, 0|4, (__KERNEL_CS|0x3), (unsigned long)stack_segment }, + { 13, 0|4, (__KERNEL_CS|0x3), (unsigned long)general_protection }, + { 14, 0|4, (__KERNEL_CS|0x3), (unsigned long)page_fault }, + { 15, 0|4, (__KERNEL_CS|0x3), (unsigned long)spurious_interrupt_bug }, + { 16, 0|4, (__KERNEL_CS|0x3), (unsigned long)coprocessor_error }, + { 17, 0|4, (__KERNEL_CS|0x3), (unsigned long)alignment_check }, #ifdef CONFIG_X86_MCE - { 18, 0, (__KERNEL_CS|0x3), (unsigned long)machine_check }, -#endif - { 19, 0, (__KERNEL_CS|0x3), (unsigned long)simd_coprocessor_error }, - { SYSCALL_VECTOR, 3, (__KERNEL_CS|0x3), (unsigned long)system_call }, + { 18, 0|4, (__KERNEL_CS|0x3), (unsigned long)machine_check }, +#endif + { 19, 0|4, (__KERNEL_CS|0x3), (unsigned long)simd_coprocessor_error }, #ifdef CONFIG_IA32_EMULATION - { IA32_SYSCALL_VECTOR, 3, (__KERNEL_CS|0x3), (unsigned long)ia32_syscall}, + { IA32_SYSCALL_VECTOR, 3|4, (__KERNEL_CS|0x3), (unsigned long)ia32_syscall}, #endif { 0, 0, 0, 0 } }; diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/x8664_ksyms.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/x8664_ksyms.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/x8664_ksyms.c Thu Nov 10 17:25:27 2005 @@ -128,8 +128,10 @@ EXPORT_SYMBOL(rtc_lock); -/* EXPORT_SYMBOL_GPL(set_nmi_callback); - EXPORT_SYMBOL_GPL(unset_nmi_callback); */ +#ifdef CONFIG_X86_LOCAL_APIC +EXPORT_SYMBOL_GPL(set_nmi_callback); +EXPORT_SYMBOL_GPL(unset_nmi_callback); +#endif /* Export string functions. We normally rely on gcc builtin for most of these, but gcc sometimes decides not to inline them. */ diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/arch/xen/x86_64/kernel/xen_entry.S --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/xen_entry.S Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/xen_entry.S Thu Nov 10 17:25:27 2005 @@ -5,7 +5,7 @@ #define evtchn_upcall_pending 0 #define evtchn_upcall_mask 1 -#define sizeof_vcpu_shift 4 +#define sizeof_vcpu_shift 5 #ifdef CONFIG_SMP //#define preempt_disable(reg) incl threadinfo_preempt_count(reg) diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c --- a/linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/mm/fault.c Thu Nov 10 17:25:27 2005 @@ -318,12 +318,12 @@ * bit 2 == 0 means kernel, 1 means user-mode * bit 3 == 1 means fault was an instruction fetch */ -asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code, - unsigned long address) +asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long error_code) { struct task_struct *tsk; struct mm_struct *mm; struct vm_area_struct * vma; + unsigned long address; const struct exception_table_entry *fixup; int write; siginfo_t info; @@ -342,6 +342,11 @@ } } #endif + + /* get the address */ + address = HYPERVISOR_shared_info->vcpu_data[ + smp_processor_id()].arch.cr2; + if (notify_die(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, SIGSEGV) == NOTIFY_STOP) return; diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c --- a/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/balloon/balloon.c Thu Nov 10 17:25:27 2005 @@ -210,7 +210,7 @@ BUG_ON(phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY); /* Update P->M and M->P tables. */ - phys_to_machine_mapping[pfn] = mfn_list[i]; + set_phys_to_machine(pfn, mfn_list[i]); xen_machphys_update(mfn_list[i], pfn); /* Link back into the page tables if not highmem. */ @@ -295,7 +295,7 @@ /* No more mappings: invalidate P2M and add to balloon. */ for (i = 0; i < nr_pages; i++) { pfn = mfn_to_pfn(mfn_list[i]); - phys_to_machine_mapping[pfn] = INVALID_P2M_ENTRY; + set_phys_to_machine(pfn, INVALID_P2M_ENTRY); balloon_append(pfn_to_page(pfn)); } @@ -515,8 +515,7 @@ .domid = DOMID_SELF }; set_pte_at(&init_mm, addr, pte, __pte_ma(0)); - phys_to_machine_mapping[__pa(addr) >> PAGE_SHIFT] = - INVALID_P2M_ENTRY; + set_phys_to_machine(__pa(addr) >> PAGE_SHIFT, INVALID_P2M_ENTRY); ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); BUG_ON(ret != 1); return 0; diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c --- a/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blkback/blkback.c Thu Nov 10 17:25:27 2005 @@ -386,9 +386,9 @@ #ifdef __ia64__ MMAP_VADDR(pending_idx,i) = gnttab_map_vaddr(map[i]); #else - phys_to_machine_mapping[__pa(MMAP_VADDR( - pending_idx, i)) >> PAGE_SHIFT] = - FOREIGN_FRAME(map[i].dev_bus_addr>>PAGE_SHIFT); + set_phys_to_machine(__pa(MMAP_VADDR( + pending_idx, i)) >> PAGE_SHIFT, + FOREIGN_FRAME(map[i].dev_bus_addr>>PAGE_SHIFT)); #endif fas = req->frame_and_sects[i]; seg[i].buf = map[i].dev_bus_addr | diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c --- a/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/blktap/blktap.c Thu Nov 10 17:25:27 2005 @@ -777,8 +777,8 @@ /* Set the necessary mappings in p2m and in the VM_FOREIGN * vm_area_struct to allow user vaddr -> struct page lookups * to work. This is needed for direct IO to foreign pages. */ - phys_to_machine_mapping[__pa(kvaddr) >> PAGE_SHIFT] = - FOREIGN_FRAME(map[i].dev_bus_addr >> PAGE_SHIFT); + set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT, + FOREIGN_FRAME(map[i].dev_bus_addr >> PAGE_SHIFT)); offset = (uvaddr - blktap_vma->vm_start) >> PAGE_SHIFT; ((struct page **)blktap_vma->vm_private_data)[offset] = diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/drivers/xen/netback/netback.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Thu Nov 10 17:25:27 2005 @@ -248,8 +248,7 @@ * Set the new P2M table entry before reassigning the old data * page. Heed the comment in pgtable-2level.h:pte_page(). :-) */ - phys_to_machine_mapping[__pa(skb->data) >> PAGE_SHIFT] = - new_mfn; + set_phys_to_machine(__pa(skb->data) >> PAGE_SHIFT, new_mfn); MULTI_update_va_mapping(mcl, vdata, pfn_pte_ma(new_mfn, PAGE_KERNEL), 0); @@ -631,9 +630,9 @@ pending_idx; continue; } - phys_to_machine_mapping[ - __pa(MMAP_VADDR(pending_idx)) >> PAGE_SHIFT] = - FOREIGN_FRAME(mop->dev_bus_addr >> PAGE_SHIFT); + set_phys_to_machine( + __pa(MMAP_VADDR(pending_idx)) >> PAGE_SHIFT, + FOREIGN_FRAME(mop->dev_bus_addr >> PAGE_SHIFT)); grant_tx_ref[pending_idx] = mop->handle; data_len = (txreq.size > PKT_PROT_LEN) ? diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Thu Nov 10 17:25:27 2005 @@ -342,8 +342,7 @@ rx_pfn_array[i] = virt_to_mfn(skb->head); /* Remove this page from map before passing back to Xen. */ - phys_to_machine_mapping[__pa(skb->head) >> PAGE_SHIFT] - = INVALID_P2M_ENTRY; + set_phys_to_machine(__pa(skb->head) >> PAGE_SHIFT, INVALID_P2M_ENTRY); MULTI_update_va_mapping(rx_mcl+i, (unsigned long)skb->head, __pte(0), 0); @@ -570,7 +569,7 @@ pfn_pte_ma(mfn, PAGE_KERNEL), 0); mcl++; - phys_to_machine_mapping[__pa(skb->head) >> PAGE_SHIFT] = mfn; + set_phys_to_machine(__pa(skb->head) >> PAGE_SHIFT, mfn); __skb_queue_tail(&rxq, skb); } diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c Thu Nov 10 17:25:27 2005 @@ -296,9 +296,8 @@ DPRINTK(" Grant table operation failure !\n"); return 0; } - phys_to_machine_mapping[__pa(MMAP_VADDR(tpmif,i)) >> - PAGE_SHIFT] = - FOREIGN_FRAME(map_op.dev_bus_addr >> PAGE_SHIFT); + set_phys_to_machine(__pa(MMAP_VADDR(tpmif,i)) >> PAGE_SHIFT, + FOREIGN_FRAME(map_op.dev_bus_addr >> PAGE_SHIFT)); tocopy = MIN(size - offset, PAGE_SIZE); diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-i386/page.h Thu Nov 10 17:25:27 2005 @@ -84,6 +84,11 @@ : "=r" (pfn) : "m" (machine_to_phys_mapping[mfn]) ); return pfn; +} + +static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn) +{ + phys_to_machine_mapping[pfn] = mfn; } /* Definitions for machine and pseudophysical addresses. */ diff -r f1c07363956b -r 476d02c1346c linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h --- a/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h Thu Nov 10 16:43:24 2005 +++ b/linux-2.6-xen-sparse/include/asm-xen/asm-x86_64/page.h Thu Nov 10 17:25:27 2005 @@ -88,6 +88,11 @@ return pfn; } +static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn) +{ + phys_to_machine_mapping[pfn] = mfn; +} + /* Definitions for machine and pseudophysical addresses. */ typedef unsigned long paddr_t; typedef unsigned long maddr_t; diff -r f1c07363956b -r 476d02c1346c tools/examples/network-bridge --- a/tools/examples/network-bridge Thu Nov 10 16:43:24 2005 +++ b/tools/examples/network-bridge Thu Nov 10 17:25:27 2005 @@ -16,7 +16,7 @@ # # Usage: # -# network (start|stop|status) {VAR=VAL}* +# network-bridge (start|stop|status) {VAR=VAL}* # # Vars: # @@ -27,18 +27,27 @@ # netdev The interface to add to the bridge (default eth${vifnum}). # antispoof Whether to use iptables to prevent spoofing (default no). # +# Internal Vars: +# pdev="p${netdev}" +# vdev="veth${vifnum}" +# vif0="vif0.${vifnum}" +# # start: -# Creates the bridge and enslaves netdev to it. -# Copies the IP addresses from netdev to the bridge. -# Deletes the routes to netdev and adds them on bridge. +# Creates the bridge +# Copies the IP and MAC addresses from netdev to vdev +# Renames netdev to be pdev +# Renames vdev to be netdev +# Enslaves pdev, vdev to bridge # # stop: -# Removes netdev from the bridge. -# Deletes the routes to bridge and adds them to netdev. +# Removes netdev from the bridge +# Transfers addresses, routes from netdev to pdev +# Renames netdev to vdev +# Renames pdev to netdev +# Deletes bridge # # status: -# Print ifconfig for netdev and bridge. -# Print routes. +# Print addresses, interfaces, routes # #============================================================================ @@ -97,23 +106,12 @@ s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/[0-9]\+\)@\1@ s/${src}/dev ${dst}/ " | sh -e - # Remove automatic routes on destionation device + # Remove automatic routes on destination device ip route list | sed -ne " /dev ${dst}\( \|$\)/ { s/^/ip route del / p }" | sh -e -} - -# Usage: del_addrs src -del_addrs () { - local src=$1 - ip addr show dev ${src} | egrep '^ *inet ' | sed -e " -s/inet/ip addr del/ -s@\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\)/[0-9]\+@\1@ -s/${src}/dev ${src}/ -" | sh -e - ip link set dev ${dst} up } # Usage: transfer_routes src dst diff -r f1c07363956b -r 476d02c1346c tools/examples/xmexample.vmx --- a/tools/examples/xmexample.vmx Thu Nov 10 16:43:24 2005 +++ b/tools/examples/xmexample.vmx Thu Nov 10 17:25:27 2005 @@ -35,7 +35,11 @@ # Optionally define mac and/or bridge for the network interfaces. # Random MACs are assigned if not given. -#vif = [ 'mac=aa:00:00:00:00:11, bridge=xenbr0' ] +# nics default is 1 +#vif = [ 'type=ioemu, mac=aa:00:00:00:00:11, bridge=xenbr0' ] +nics=1 +# type=ioemu specify the NIC is an ioemu device not netfront +vif = [ 'type=ioemu, bridge=xenbr0' ] #---------------------------------------------------------------------------- # Define the disk devices you want the domain to have access to, and @@ -117,6 +121,11 @@ #nographic=0 +#----------------------------------------------------------------------------- +# serial port re-direct to pty deivce, /dev/pts/n +# then xm console or minicom can connect +#serial='pty' + #---------------------------------------------------------------------------- # enable ne2000, default = 0(use pcnet) ne2000=0 diff -r f1c07363956b -r 476d02c1346c tools/ioemu/target-i386-dm/Makefile --- a/tools/ioemu/target-i386-dm/Makefile Thu Nov 10 16:43:24 2005 +++ b/tools/ioemu/target-i386-dm/Makefile Thu Nov 10 17:25:27 2005 @@ -7,7 +7,7 @@ TARGET_PATH=$(SRC_PATH)/target-$(TARGET_ARCH) VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw:$(SRC_PATH)/audio DEFINES=-I. -I$(TARGET_PATH) -I$(SRC_PATH) -DEFINES+= -I$(XEN_ROOT)/tools/libxc +DEFINES+= -I$(XEN_ROOT)/tools/libxc -I$(XEN_ROOT)/tools/xenstore ifdef CONFIG_USER_ONLY VPATH+=:$(SRC_PATH)/linux-user DEFINES+=-I$(SRC_PATH)/linux-user -I$(SRC_PATH)/linux-user/$(TARGET_ARCH) @@ -188,7 +188,7 @@ ######################################################### DEFINES+=-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -LIBS+=-lm -L../../libxc -lxenctrl -lxenguest +LIBS+=-lm -L../../libxc -lxenctrl -lxenguest -L../../xenstore -lxenstore ifndef CONFIG_USER_ONLY LIBS+=-lz endif diff -r f1c07363956b -r 476d02c1346c tools/ioemu/target-i386-dm/qemu-ifup --- a/tools/ioemu/target-i386-dm/qemu-ifup Thu Nov 10 16:43:24 2005 +++ b/tools/ioemu/target-i386-dm/qemu-ifup Thu Nov 10 17:25:27 2005 @@ -7,4 +7,4 @@ echo $* ifconfig $1 0.0.0.0 up -brctl addif xenbr0 $1 +brctl addif $2 $1 diff -r f1c07363956b -r 476d02c1346c tools/ioemu/vl.c --- a/tools/ioemu/vl.c Thu Nov 10 16:43:24 2005 +++ b/tools/ioemu/vl.c Thu Nov 10 17:25:27 2005 @@ -76,6 +76,7 @@ #endif /* CONFIG_SDL */ #include "xenctrl.h" +#include "xs.h" #include "exec-all.h" //#define DO_TB_FLUSH @@ -123,6 +124,7 @@ static char network_script[1024]; int pit_min_timer_count = 0; int nb_nics; +char bridge[16]; NetDriverState nd_table[MAX_NICS]; QEMUTimer *gui_timer; QEMUTimer *polling_timer; @@ -1171,6 +1173,48 @@ return chr; } +int store_console_dev(int domid, char *pts) +{ + int xc_handle; + unsigned int len = 0; + struct xs_handle *xs; + char *path; + + xs = xs_daemon_open(); + if (xs == NULL) { + fprintf(logfile, "Could not contact XenStore\n"); + return -1; + } + + xc_handle = xc_interface_open(); + if (xc_handle == -1) { + fprintf(logfile, "xc_interface_open() error\n"); + return -1; + } + + path = xs_get_domain_path(xs, domid); + if (path == NULL) { + fprintf(logfile, "xs_get_domain_path() error\n"); + return -1; + } + path = realloc(path, strlen(path) + strlen("/console/tty") + 1); + if (path == NULL) { + fprintf(logfile, "realloc error\n"); + return -1; + } + strcat(path, "/console/tty"); + if (!xs_write(xs, NULL, path, pts, strlen(pts))) { + fprintf(logfile, "xs_write for console fail"); + return -1; + } + + free(path); + xs_daemon_close(xs); + close(xc_handle); + + return 0; +} + #if defined(__linux__) CharDriverState *qemu_chr_open_pty(void) { @@ -1182,6 +1226,7 @@ return NULL; } fprintf(stderr, "char device redirected to %s\n", slave_name); + store_console_dev(domid, slave_name); return qemu_chr_open_fd(master_fd, master_fd); } #else @@ -1542,7 +1587,7 @@ static int net_tun_init(NetDriverState *nd) { int pid, status; - char *args[3]; + char *args[4]; char **parg; extern int highest_fds; @@ -1558,6 +1603,7 @@ parg = args; *parg++ = network_script; *parg++ = nd->ifname; + *parg++ = bridge; *parg++ = NULL; execv(network_script, args); exit(1); @@ -2163,6 +2209,7 @@ "Network options:\n" "-nics n simulate 'n' network cards [default=1]\n" "-macaddr addr set the mac address of the first interface\n" + "-bridge br set the bridge interface for nic\n" "-n script set tap/tun network init script [default=%s]\n" "-tun-fd fd use this fd as already opened tap/tun interface\n" #ifdef CONFIG_SLIRP @@ -2253,6 +2300,7 @@ QEMU_OPTION_nics, QEMU_OPTION_macaddr, + QEMU_OPTION_bridge, QEMU_OPTION_n, QEMU_OPTION_tun_fd, QEMU_OPTION_user_net, @@ -2323,6 +2371,7 @@ { "nics", HAS_ARG, QEMU_OPTION_nics}, { "macaddr", HAS_ARG, QEMU_OPTION_macaddr}, + { "bridge", HAS_ARG, QEMU_OPTION_bridge}, { "n", HAS_ARG, QEMU_OPTION_n }, { "tun-fd", HAS_ARG, QEMU_OPTION_tun_fd }, #ifdef CONFIG_SLIRP @@ -2701,7 +2750,9 @@ break; case QEMU_OPTION_nographic: pstrcpy(monitor_device, sizeof(monitor_device), "stdio"); - pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "stdio"); + if(!strcmp(serial_devices[0], "vc")) + pstrcpy(serial_devices[0], sizeof(serial_devices[0]), + "stdio"); nographic = 1; break; #ifdef CONFIG_VNC @@ -2778,6 +2829,9 @@ fprintf(stderr, "qemu: invalid number of network interfaces\n"); exit(1); } + break; + case QEMU_OPTION_bridge: + pstrcpy(bridge, sizeof(bridge), optarg); break; case QEMU_OPTION_macaddr: { diff -r f1c07363956b -r 476d02c1346c tools/libxc/xc_vmx_build.c --- a/tools/libxc/xc_vmx_build.c Thu Nov 10 16:43:24 2005 +++ b/tools/libxc/xc_vmx_build.c Thu Nov 10 17:25:27 2005 @@ -565,8 +565,10 @@ return 0; error_out: - free(mmu); - free(page_array); + if ( mmu != NULL ) + free(mmu); + if ( page_array != NULL ) + free(page_array); return -1; } @@ -627,7 +629,7 @@ if ( mlock(&st_ctxt, sizeof(st_ctxt) ) ) { - PERROR("xc_vmx_build: ctxt mlock failed"); + PERROR("%s: ctxt mlock failed", __func__); return 1; } @@ -661,7 +663,8 @@ goto error_out; } - free(image); + if ( image != NULL ) + free(image); ctxt->flags = VGCF_VMX_GUEST; /* FPU is set up to default initial state. */ @@ -707,7 +710,8 @@ return rc; error_out: - free(image); + if ( image != NULL ) + free(image); return -1; } diff -r f1c07363956b -r 476d02c1346c tools/pygrub/setup.py --- a/tools/pygrub/setup.py Thu Nov 10 16:43:24 2005 +++ b/tools/pygrub/setup.py Thu Nov 10 17:25:27 2005 @@ -34,6 +34,8 @@ fsys_mods.append(reiser) fsys_pkgs.append("grub.fsys.reiser") +pkgs = ['grub', 'grub.fsys'] +pkgs.extend(fsys_pkgs) setup(name='pygrub', version='0.3', description='Boot loader that looks a lot like grub for Xen', @@ -42,8 +44,7 @@ license='GPL', package_dir={'grub': 'src'}, scripts = ["src/pygrub"], - packages=['grub', - 'grub.fsys'].extend(fsys_pkgs), + packages=pkgs, ext_modules = fsys_mods ) diff -r f1c07363956b -r 476d02c1346c tools/pygrub/src/pygrub --- a/tools/pygrub/src/pygrub Thu Nov 10 16:43:24 2005 +++ b/tools/pygrub/src/pygrub Thu Nov 10 17:25:27 2005 @@ -89,8 +89,8 @@ buf = os.read(fd, 512) for poff in (446, 462, 478, 494): # partition offsets # active partition has 0x80 as the first byte - if struct.unpack("<c", buf[p:p+1]) == ('\x80',): - return struct.unpack("<", buf[p+8:p+12])[0] * SECTOR_SIZE + if struct.unpack("<c", buf[poff:poff+1]) == ('\x80',): + return struct.unpack("<L", buf[poff+8:poff+12])[0] * SECTOR_SIZE return -1 def get_config(fn): @@ -113,11 +113,13 @@ break if fs is not None: - if fs.file_exist("/boot/grub/menu.lst"): - grubfile = "/boot/grub/menu.lst" - elif fs.file_exist("/boot/grub/grub.conf"): - grubfile = "/boot/grub/grub.conf" - else: + grubfile = None + for f in ("/boot/grub/menu.lst", "/boot/grub/grub.conf", + "/grub/menu.lst", "/grub/grub.conf"): + if fs.file_exist(f): + grubfile = f + break + if grubfile is None: raise RuntimeError, "we couldn't find /boot/grub{menu.lst,grub.conf} " + \ "in the image provided. halt!" f = fs.open_file(grubfile) @@ -169,7 +171,7 @@ # if c == ord('q'): # selected = -1 # break - elif c == ord('c'): + if c == ord('c'): # FIXME: needs to go to command line mode continue elif c == ord('a'): @@ -261,7 +263,7 @@ offset = 0 if is_disk_image(file): - offset = get_active_offset(fn) + offset = get_active_offset(file) if offset == -1: raise RuntimeError, "Unable to find active partition on disk" diff -r f1c07363956b -r 476d02c1346c tools/python/xen/xend/image.py --- a/tools/python/xen/xend/image.py Thu Nov 10 16:43:24 2005 +++ b/tools/python/xen/xend/image.py Thu Nov 10 17:25:27 2005 @@ -258,6 +258,7 @@ log.debug("args: %s, val: %s" % (a,v)) # Handle disk/network related options + mac = None for (name, info) in deviceConfig: if name == 'vbd': uname = sxp.child_value(info, 'uname') @@ -276,11 +277,21 @@ ret.append("-%s" % vbddev) ret.append("%s" % vbdparam) if name == 'vif': + type = sxp.child_value(info, 'type') + if type != 'ioemu': + continue + if mac != None: + continue mac = sxp.child_value(info, 'mac') + bridge = sxp.child_value(info, 'bridge') if mac == None: mac = randomMAC() + if bridge == None: + bridge = 'xenbr0' ret.append("-macaddr") ret.append("%s" % mac) + ret.append("-bridge") + ret.append("%s" % bridge) if name == 'vtpm': instance = sxp.child_value(info, 'instance') ret.append("-instance") diff -r f1c07363956b -r 476d02c1346c tools/python/xen/xend/server/netif.py --- a/tools/python/xen/xend/server/netif.py Thu Nov 10 16:43:24 2005 +++ b/tools/python/xen/xend/server/netif.py Thu Nov 10 17:25:27 2005 @@ -71,6 +71,9 @@ script = os.path.join(xroot.network_script_dir, sxp.child_value(config, 'script', xroot.get_vif_script())) + type = sxp.child_value(config, 'type') + if type == 'ioemu': + return (None,{},{}) bridge = sxp.child_value(config, 'bridge') mac = sxp.child_value(config, 'mac') ipaddr = _get_config_ipaddr(config) diff -r f1c07363956b -r 476d02c1346c tools/python/xen/xm/create.py --- a/tools/python/xen/xm/create.py Thu Nov 10 16:43:24 2005 +++ b/tools/python/xen/xm/create.py Thu Nov 10 17:25:27 2005 @@ -255,10 +255,11 @@ fn=append_value, default=[], use="Add an IP address to the domain.") -gopts.var('vif', val="mac=MAC,be_mac=MAC,bridge=BRIDGE,script=SCRIPT,backend=DOM,vifname=NAME", +gopts.var('vif', val="type=TYPE,mac=MAC,be_mac=MAC,bridge=BRIDGE,script=SCRIPT,backend=DOM,vifname=NAME", fn=append_value, default=[], use="""Add a network interface with the given MAC address and bridge. The vif is configured by calling the given configuration script. + If type is not specified, default is netfront not ioemu device. If mac is not specified a random MAC address is used. The MAC address of the backend interface can be selected with be_mac. If not specified then the network backend chooses it's own MAC address. @@ -355,10 +356,6 @@ gopts.var('cdrom', val='FILE', fn=set_value, default='', use="Path to cdrom") - -gopts.var('macaddr', val='MACADDR', - fn=set_value, default='', - use="Macaddress of the first network interface") gopts.var('boot', val="a|b|c|d", fn=set_value, default='c', @@ -512,6 +509,7 @@ backend = d.get('backend') ip = d.get('ip') vifname = d.get('vifname') + type = d.get('type') else: mac = None be_mac = None @@ -520,6 +518,7 @@ backend = None ip = None vifname = None + type = None config_vif = ['vif'] if mac: config_vif.append(['mac', mac]) @@ -535,6 +534,8 @@ config_vif.append(['backend', backend]) if ip: config_vif.append(['ip', ip]) + if type: + config_vif.append(['type', type]) config_devs.append(['device', config_vif]) def configure_vfr(config, vals): @@ -549,7 +550,7 @@ """Create the config for VMX devices. """ args = [ 'device_model', 'vcpus', 'cdrom', 'boot', 'fda', 'fdb', - 'localtime', 'serial', 'macaddr', 'stdvga', 'isa', 'nographic', + 'localtime', 'serial', 'stdvga', 'isa', 'nographic', 'vnc', 'vncviewer', 'sdl', 'display', 'ne2000', 'lapic'] for a in args: if (vals.__dict__[a]): @@ -662,7 +663,7 @@ (k, v) = b.strip().split('=', 1) k = k.strip() v = v.strip() - if k not in ['mac', 'be_mac', 'bridge', 'script', 'backend', 'ip', 'vifname']: + if k not in ['type', 'mac', 'be_mac', 'bridge', 'script', 'backend', 'ip', 'vifname']: err('Invalid vif specifier: ' + vif) d[k] = v vifs.append(d) diff -r f1c07363956b -r 476d02c1346c tools/xenstore/xenstored_core.c --- a/tools/xenstore/xenstored_core.c Thu Nov 10 16:43:24 2005 +++ b/tools/xenstore/xenstored_core.c Thu Nov 10 17:25:27 2005 @@ -56,6 +56,7 @@ static bool verbose; LIST_HEAD(connections); static int tracefd = -1; +static int reopen_log_pipe[2]; static char *tracefile = NULL; static TDB_CONTEXT *tdb_ctx; @@ -243,20 +244,34 @@ talloc_free(str); } -void reopen_log() -{ - if (!tracefile) - return; - - if (tracefd > 0) - close(tracefd); - tracefd = open(tracefile, O_WRONLY|O_CREAT|O_APPEND, 0600); - if (tracefd < 0) { - perror("Could not open tracefile"); - return; - } - write(tracefd, "\n***\n", strlen("\n***\n")); -} + +/** + * Signal handler for SIGHUP, which requests that the trace log is reopened + * (in the main loop). A single byte is written to reopen_log_pipe, to awaken + * the select() in the main loop. + */ +static void trigger_reopen_log(int signal __attribute__((unused))) +{ + char c = 'A'; + write(reopen_log_pipe[1], &c, 1); +} + + +static void reopen_log() +{ + if (tracefile) { + if (tracefd > 0) + close(tracefd); + + tracefd = open(tracefile, O_WRONLY|O_CREAT|O_APPEND, 0600); + + if (tracefd < 0) + perror("Could not open tracefile"); + else + write(tracefd, "\n***\n", strlen("\n***\n")); + } +} + static bool write_messages(struct connection *conn) { @@ -331,29 +346,33 @@ return 0; } + +static void set_fd(int fd, fd_set *set, int *max) +{ + FD_SET(fd, set); + if (fd > *max) + *max = fd; +} + + static int initialize_set(fd_set *inset, fd_set *outset, int sock, int ro_sock) { struct connection *i; - int max; + int max = -1; FD_ZERO(inset); FD_ZERO(outset); - FD_SET(sock, inset); - max = sock; - FD_SET(ro_sock, inset); - if (ro_sock > max) - max = ro_sock; - FD_SET(eventchn_fd, inset); - if (eventchn_fd > max) - max = eventchn_fd; + + set_fd(sock, inset, &max); + set_fd(ro_sock, inset, &max); + set_fd(eventchn_fd, inset, &max); + set_fd(reopen_log_pipe[0], inset, &max); list_for_each_entry(i, &connections, list) { if (i->domain) continue; - FD_SET(i->fd, inset); + set_fd(i->fd, inset, &max); if (!list_empty(&i->out_list)) FD_SET(i->fd, outset); - if (i->fd > max) - max = i->fd; } return max; } @@ -1570,6 +1589,10 @@ || listen(*ro_sock, 1) != 0) barf_perror("Could not listen on sockets"); + if (pipe(reopen_log_pipe)) { + barf_perror("pipe"); + } + /* Setup the database */ setup_structure(); @@ -1592,7 +1615,7 @@ close(STDERR_FILENO); } - signal(SIGHUP, reopen_log); + signal(SIGHUP, trigger_reopen_log); #ifdef TESTING signal(SIGUSR1, stop_failtest); @@ -1610,6 +1633,12 @@ if (errno == EINTR) continue; barf_perror("Select failed"); + } + + if (FD_ISSET(reopen_log_pipe[0], &inset)) { + char c; + read(reopen_log_pipe[0], &c, 1); + reopen_log(); } if (FD_ISSET(*sock, &inset)) diff -r f1c07363956b -r 476d02c1346c tools/xm-test/lib/XmTestLib/Console.py --- a/tools/xm-test/lib/XmTestLib/Console.py Thu Nov 10 16:43:24 2005 +++ b/tools/xm-test/lib/XmTestLib/Console.py Thu Nov 10 17:25:27 2005 @@ -23,13 +23,13 @@ a _very_ specific value, set in the PROMPT variable of this script """ -import sys; -import os; -import pty; -import tty; -import termios; -import fcntl; -import select; +import sys +import os +import pty +import tty +import termios +import fcntl +import select from Test import * @@ -52,15 +52,15 @@ are included in the history buffer """ - self.TIMEOUT = 30; - self.PROMPT = "@%@%> "; - self.domain = domain; - self.historyBuffer = []; - self.historyLines = 0; - self.historyLimit = historyLimit; - self.historySaveAll = historySaveAll; - self.historySaveCmds = historySaveCmds; - self.debugMe = False; + self.TIMEOUT = 30 + self.PROMPT = "@%@%> " + self.domain = domain + self.historyBuffer = [] + self.historyLines = 0 + self.historyLimit = historyLimit + self.historySaveAll = historySaveAll + self.historySaveCmds = historySaveCmds + self.debugMe = False self.limit = None consoleCmd = ["/usr/sbin/xm", "xm", "console", domain] @@ -68,62 +68,62 @@ if verbose: print "Console executing: " + str(consoleCmd) - pid, fd = pty.fork(); + pid, fd = pty.fork() if pid == 0: - os.execvp("/usr/sbin/xm", consoleCmd[1:]); - - self.consolePid = pid; - self.consoleFd = fd; - - tty.setraw(self.consoleFd, termios.TCSANOW); + os.execvp("/usr/sbin/xm", consoleCmd[1:]) + + self.consolePid = pid + self.consoleFd = fd + + tty.setraw(self.consoleFd, termios.TCSANOW) bytes = self.__chewall(self.consoleFd) if bytes < 0: raise ConsoleError("Console didn't respond") def __addToHistory(self, line): - self.historyBuffer.append(line); - self.historyLines += 1; + self.historyBuffer.append(line) + self.historyLines += 1 if self.historyLines > self.historyLimit: - self.historyBuffer = self.historyBuffer[1:]; - self.historyLines -= 1; + self.historyBuffer = self.historyBuffer[1:] + self.historyLines -= 1 def clearHistory(self): """Clear the history buffer""" - self.historyBuffer = []; - self.historyLines = 0; + self.historyBuffer = [] + self.historyLines = 0 def getHistory(self): """Returns a string containing the entire history buffer""" - output = ""; + output = "" for line in self.historyBuffer: - output += line + "\n"; - - return output; + output += line + "\n" + + return output def setTimeout(self, timeout): """Sets the timeout used to determine if a remote command has blocked""" - self.TIMEOUT = timeout; + self.TIMEOUT = timeout def setPrompt(self, prompt): """Sets the string key used to delimit the end of command output""" - self.PROMPT = prompt; + self.PROMPT = prompt def __chewall(self, fd): - timeout = 0; - bytes = 0; + timeout = 0 + bytes = 0 while timeout < 3: - i, o, e = select.select([fd], [], [], 1); + i, o, e = select.select([fd], [], [], 1) if fd in i: try: foo = os.read(fd, 1) @@ -143,7 +143,7 @@ if self.debugMe: print "Ignored %i bytes of miscellaneous console output" % bytes - return bytes; + return bytes def __runCmd(self, command, saveHistory=True): @@ -152,15 +152,15 @@ lines = 0 bytes = 0 - self.__chewall(self.consoleFd); + self.__chewall(self.consoleFd) if verbose: print "[%s] Sending `%s'" % (self.domain, command) - os.write(self.consoleFd, "%s\n" % command); + os.write(self.consoleFd, "%s\n" % command) while 1==1: - i, o, e = select.select([self.consoleFd], [], [], self.TIMEOUT); + i, o, e = select.select([self.consoleFd], [], [], self.TIMEOUT) if self.consoleFd in i: try: @@ -182,59 +182,59 @@ if lines > 0: output += line + "\n" if saveHistory: - self.__addToHistory(line); + self.__addToHistory(line) elif self.historySaveCmds and saveHistory: - self.__addToHistory("*" + line); - lines += 1; - line = ""; + self.__addToHistory("*" + line) + lines += 1 + line = "" elif str == "\r": pass # ignore \r's else: - line += str; + line += str if line == self.PROMPT: - break; - - return output; + break + + return output def runCmd(self, command): """Runs a command on the remote terminal and returns the output as well as the return code. For example: - ret = c.runCmd("ls"); - print ret["output"]; - sys.exit(run["return"]); + ret = c.runCmd("ls") + print ret["output"] + sys.exit(run["return"]) """ # Allow exceptions to bubble up - realOutput = self.__runCmd(command); - retOutput = self.__runCmd("echo $?", saveHistory=False); + realOutput = self.__runCmd(command) + retOutput = self.__runCmd("echo $?", saveHistory=False) try: - retCode = int(retOutput); + retCode = int(retOutput) except: - retCode = 255; + retCode = 255 return { "output": realOutput, "return": retCode, - }; + } def sendInput(self, input): """Sends input to the remote terminal, but doesn't check for a return code""" - realOutput = self.__runCmd(input); + realOutput = self.__runCmd(input) return { "output": realOutput, "return": 0, - }; + } def closeConsole(self): """Closes the console connection and ensures that the console process is killed""" - os.close(self.consoleFd); - os.kill(self.consolePid, 2); + os.close(self.consoleFd) + os.kill(self.consolePid, 2) def setLimit(self, limit): @@ -254,23 +254,23 @@ code as the domU command. """ - verbose = True; + verbose = True try: - t = XmConsole(sys.argv[1]); + t = XmConsole(sys.argv[1]) except ConsoleError, e: print "Failed to attach to console (%s)" % str(e) sys.exit(255) try: - run = t.runCmd(sys.argv[2]); + run = t.runCmd(sys.argv[2]) except ConsoleError, e: print "Console failed (%)" % str(e) sys.exit(255) - t.closeConsole(); + t.closeConsole() - print run["output"],; - sys.exit(run["return"]); + print run["output"], + sys.exit(run["return"]) diff -r f1c07363956b -r 476d02c1346c tools/xm-test/runtest.sh --- a/tools/xm-test/runtest.sh Thu Nov 10 16:43:24 2005 +++ b/tools/xm-test/runtest.sh Thu Nov 10 17:25:27 2005 @@ -1,215 +1,259 @@ #!/bin/sh -usage() { - echo "Usage: $0 [opts] <logfile>" - echo " Where opts are:" - echo " -d : do not submit a report for this run" - echo " -b : do not ask any questions (batch mode)" - echo " -e <email> : set email address for report" -} ## ## Test driver script ## -# -# Defaults -# -MAXFAIL=10 -report=yes -batch=no - -# -# Resolve options -# -while [ $# -gt 0 ] -do - case "$1" in - -d) - echo "(Skipping report submission)" - report=no - ;; - -b) - echo "(Batch mode)" - batch=yes - ;; - -e) - shift - echo $1 > contact_info - echo "(Email set to $1)" - ;; - *) - LOGFILE=$1 - break - ;; - esac - shift -done - -# -# Usage -# -if [ -z $LOGFILE ]; then - usage - exit 1 -fi - -# -# Output files -# -OSREPORTTEMP=${LOGFILE}.os.xml -PROGREPORTTEMP=${LOGFILE}.prog.xml -RESULTREPORTTEMP=${LOGFILE}.result.xml -OUTPUT=${LOGFILE}.output -SUMMARY=${LOGFILE}.summary -PASSFAIL=${LOGFILE}.passfail -REPORT=${LOGFILE}.report -FAILURES=${LOGFILE}.failures - -# -# Make sure we're root -# -uid=$(id -u) -if [ $uid != 0 ]; then - echo "ERROR: I must be run as root!" - exit 1 -fi - -# -# See if the ramdisk has been built -# -rdsize=$(stat -c %s ramdisk/initrd.img 2>/dev/null) -if [ -z "$rdsize" ] || [ $rdsize -le 16384 ]; then - echo "Cannot find a valid ramdisk. You need to run \"make\" or" - echo "copy in a previously-built ramdisk to the ramdisk/ directory" - exit 1 -fi - -# -# See if xend is running -# -if ! xm list >/dev/null 2>&1; then - echo "'xm list' failed: is xend running?" - exit 1 -fi - -# -# Make sure permissions are correct -# -chmod a+x lib/XmTestReport/* -chmod a+x mkreport mergereport - -# +usage() { + echo "Usage: $0 [opts] <report>" + echo " Where report is a name that will be used for report files" + echo "" + echo " Where opts are:" + echo " -d : do not submit a report for this run" + echo " -b : do not ask any questions (batch mode)" + echo " -q : run a quick test set" + echo " -e <email> : set email address for report" + echo " -s <report> : just submit report <report>" +} + +# Just submit the report +submit_report() { + + reportfile=$1 + + ./lib/XmTestReport/Report.py $reportfile +} + +# Generate XML result report from output file +make_result_report() { + output=$1 + reportfile=$2 + if ! ./lib/XmTestReport/ResultReport.py $output > $reportfile; then + echo "Unable to generate clean ResultReport" + echo "Take a look at $report" + exit 1 + fi +} + +# Collect environment information for XML report +make_environment_report() { + os=$1 + prog=$2 + if ! ./lib/XmTestReport/OSReport.py > $os; then + echo "Unable to generate clean OSReport" + echo "Take a look at $os" + exit 1 + fi + if ! ./lib/XmTestReport/ProgReport.py > $prog; then + echo "Unable to generate clean ProgReport" + echo "Take a look at $prog" + exit 1 + fi +} + +# Check conditions needed to actually run the tests +runnable_tests() { + # Make sure we're root + uid=$(id -u) + if [ $uid != 0 ]; then + echo "ERROR: I must be run as root!" + exit 1 + fi + + # See if the ramdisk has been built + rdsize=$(stat -c %s ramdisk/initrd.img 2>/dev/null) + if [ -z "$rdsize" ] || [ $rdsize -le 16384 ]; then + echo "Cannot find a valid ramdisk. You need to run \"make\" or" + echo "copy in a previously-built ramdisk to the ramdisk/ directory" + exit 1 + fi + + # See if xend is running + if ! xm list >/dev/null 2>&1; then + echo "'xm list' failed: is xend running?" + exit 1 + fi + +} + # Get contact info if needed -# -if [ ! -f contact_info ]; then - if [ "$batch" = "yes" ]; then - echo "Unable to read contact_info!" - echo "Please run me once interactively before using batch mode!" - exit 1 - else - echo "Please provide your email address so that we can " - echo "contact you if we need further information concerning" - echo "your results. Any information provided will be" - echo "kept private. If you wish to remain anonymous, please" - echo "hit [ENTER] now." - - while ! echo "$EMAIL" | grep -q '@'; do - echo - echo -n "Your email address: " - read EMAIL - if [ -z $EMAIL ]; then - EMAIL="anonymous@xxxxxxxxxxxxx" - fi - done - echo $EMAIL > contact_info - fi -fi - -# -# Collect environment information for XML report -# -if ! ./lib/XmTestReport/OSReport.py > $OSREPORTTEMP; then - echo "Unable to generate clean OSReport" - echo "Take a look at $OSREPORTTEMP" - exit 1 -fi -if ! ./lib/XmTestReport/ProgReport.py > $PROGREPORTTEMP; then - echo "Unable to generate clean ProgReport" - echo "Take a look at $PROGREPORTTEMP" - exit 1 -fi - -# +get_contact_info() { + + if [ ! -f contact_info ]; then + if [ "$batch" = "yes" ]; then + echo "Unable to read contact_info!" + echo "Please run me once interactively before using batch mode!" + exit 1 + else + echo "Please provide your email address so that we can " + echo "contact you if we need further information concerning" + echo "your results. Any information provided will be" + echo "kept private. If you wish to remain anonymous, please" + echo "hit [ENTER] now." + + while ! echo "$EMAIL" | grep -q '@'; do + echo + echo -n "Your email address: " + read EMAIL + if [ -z $EMAIL ]; then + EMAIL="anonymous@xxxxxxxxxxxxx" + fi + done + echo $EMAIL > contact_info + fi + fi +} + # Run the tests -# -export TEST_VERBOSE=1 -echo Running tests... -make -k check > $OUTPUT 2>&1 - -# +run_tests() { + output=$1 + echo Running tests... + TEST_VERBOSE=1 make -k check > $output 2>&1 +} + +run_tests_quick() { + + output=$1 + + create_tests="01_create_basic_pos.test 07_create_mem64_pos.test 10_create_fastdestroy.test 14_create_blockroot_pos.test" + unpause_tests="01_unpause_basic_pos.test" + memset_tests="01_memset_basic_pos.test 03_memset_random_pos.test" + help_tests="06_help_allcmds.test" + testgroups="create unpause memset help" + + echo "*** Quick test" > $output + for group in $testgroups; do + eval $(echo list=\$${group}_tests) + echo "*** Running tests [$list] from $group" + (cd tests/$group && TEST_VERBOSE=1 make -k check TESTS="$list") >> $output 2>&1 + done + +} + # Generate some plain-text reports -# -echo "Making PASS/FAIL report ($PASSFAIL)..." -cat $OUTPUT | egrep '(REASON|PASS|FAIL|XPASS|XFAIL|SKIP)' | perl -pe 's/^(PASS|FAIL|XPASS|XFAIL)(.+)$/$1$2\n/' > $PASSFAIL - -echo "Making FAIL report ($FAILURES)..." -cat $PASSFAIL | egrep '(REASON|FAIL)' > $FAILURES - -NUMPASS=`grep -c PASS $OUTPUT` -NUMFAIL=`grep -c FAIL $OUTPUT` -NUMXPASS=`grep -c XPASS $OUTPUT` -NUMXFAIL=`grep -c XFAIL $OUTPUT` -cat > $SUMMARY << EOF +make_text_reports() { + passfail=$1 + failures=$2 + output=$3 + reportfile=$4 + summary=summary.tmp + echo "Making PASS/FAIL report ($passfail)..." + cat $OUTPUT | egrep '(REASON|PASS|FAIL|XPASS|XFAIL|SKIP)' | perl -pe 's/^(PASS|FAIL|XPASS|XFAIL)(.+)$/$1$2\n/' > $passfail + + echo "Making FAIL report ($failures)..." + cat $passfail | egrep '(REASON|FAIL)' > $failures + + NUMPASS=`grep -c PASS $output` + NUMFAIL=`grep -c FAIL $output` + NUMXPASS=`grep -c XPASS $output` + NUMXFAIL=`grep -c XFAIL $output` + cat > $summary << EOF Xm-test execution summary: PASS: $NUMPASS FAIL: $NUMFAIL XPASS: $NUMXPASS XFAIL: $NUMXFAIL EOF - -cat $SUMMARY > $REPORT - -echo -e '\n\nDetails:\n' >> $REPORT - -./mkreport $PASSFAIL >> $REPORT - -# -# Check to see if it's worth reporting these results -# -#if [ "$batch" = "no" ] && -# [ "$report" = "yes" ] && -# [ $NUMFAIL -gt $MAXFAIL ]; then -# echo "NOTE: $NUMFAIL tests failed, which may be erroneous. It may" -# echo "be a good idea to review the report before sending. If you" -# echo "choose not to submit the report, it will be saved for your review" -# echo "and later submission." -# echo -# echo -n "Submit anyway? [y/n] " -# read ANSWER -# if [ "$ANSWER" = "n" ]; then -# report=no -# fi -#fi - -# -# Generate the XML result report -# -if ! ./lib/XmTestReport/ResultReport.py $OUTPUT > $RESULTREPORTTEMP; then - echo "Unable to generate clean ResultReport" - echo "Take a look at $RESULTREPORTTEMP" - exit 1 -fi - -# -# Maybe submit report and save the combined XML file -# -if [ "$report" = "yes" ]; then - echo "Sending report..." - ./lib/XmTestReport/Report.py -D $OSREPORTTEMP $PROGREPORTTEMP \ - $RESULTREPORTTEMP > $1.xml - echo "Report also saved in $1.xml" -else - echo "Saving report to $1.xml..." - ./lib/XmTestReport/Report.py -d $OSREPORTTEMP $PROGREPORTTEMP \ - $RESULTREPORTTEMP > $1.xml -fi + + cat $summary > $reportfile + + echo -e '\n\nDetails:\n' >> $reportfile + + ./mkreport $passfail >> $reportfile + + rm $summary +} + +############ +### Main ### +############ + +# Defaults +MAXFAIL=10 +report=yes +batch=no +run=yes + +# Resolve options +while [ $# -gt 0 ] + do + case "$1" in + -d) + echo "(Skipping report submission)" + report=no + ;; + -b) + echo "(Batch mode)" + batch=yes + ;; + -e) + shift + echo $1 > contact_info + echo "(Email set to $1)" + ;; + -q) + run=quick + ;; + -s) + run=no + ;; + *) + REPORT=$1 + break + ;; + esac + shift +done + +# Usage +if [ -z $REPORT ]; then + usage + exit 1 +fi + +# Output files +OSREPORTTEMP=${REPORT}.os.xml +PROGREPORTTEMP=${REPORT}.prog.xml +RESULTREPORTTEMP=${REPORT}.result.xml +XMLREPORT=${REPORT}.xml +OUTPUT=${REPORT}.output +SUMMARY=${REPORT}.summary +PASSFAIL=${REPORT}.passfail +TXTREPORT=${REPORT}.report +FAILURES=${REPORT}.failures + +# Make sure permissions are correct +chmod a+x lib/XmTestReport/* +chmod a+x mkreport mergereport + +if [ ! -f contact_info ]; then + if [ "$batch" = "yes" ]; then + echo "Unable to read contact_info" + echo "You must run me interactively once!" + exit 1 + else + get_contact_info + fi +fi + +if [ "$run" != "no" ]; then + runnable_tests + make_environment_report $OSREPORTTEMP $PROGREPORTTEMP + if [ "$run" = "yes" ]; then + run_tests $OUTPUT + else + run_tests_quick $OUTPUT + fi + make_text_reports $PASSFAIL $FAILURES $OUTPUT $TXTREPORT + make_result_report $OUTPUT $RESULTREPORTTEMP + cat $OSREPORTTEMP $PROGREPORTTEMP $RESULTREPORTTEMP > $XMLREPORT + rm $OSREPORTTEMP $PROGREPORTTEMP $RESULTREPORTTEMP +fi + +if [ "$report" = "yes" ] && [ "$run" = "yes" ]; then + if [ ! -f "$XMLREPORT" ]; then + echo "No such file: $XMLREPORT" + exit 1 + fi + submit_report $XMLREPORT +fi diff -r f1c07363956b -r 476d02c1346c tools/xm-test/tests/block-create/09_block_attach_and_dettach_device_check_data_pos.py --- a/tools/xm-test/tests/block-create/09_block_attach_and_dettach_device_check_data_pos.py Thu Nov 10 16:43:24 2005 +++ b/tools/xm-test/tests/block-create/09_block_attach_and_dettach_device_check_data_pos.py Thu Nov 10 17:25:27 2005 @@ -36,7 +36,9 @@ saveLog(console.getHistory()) FAIL(str(e)) -os.system("mkfs.ext2 -F /dev/ram1") +s, o = traceCommand("mke2fs -q -F /dev/ram1") +if s != 0: + FAIL("mke2fs returned %i != 0" % s) for i in range(10): status, output = traceCommand("xm block-attach %s phy:ram1 hda1 w" % domain.getName()) diff -r f1c07363956b -r 476d02c1346c tools/xm-test/tests/restore/04_restore_withdevices_pos.py --- a/tools/xm-test/tests/restore/04_restore_withdevices_pos.py Thu Nov 10 16:43:24 2005 +++ b/tools/xm-test/tests/restore/04_restore_withdevices_pos.py Thu Nov 10 17:25:27 2005 @@ -5,13 +5,20 @@ from XmTestLib import * -domain = XmTestDomain() +import re + +domain = XmTestDomain(extraOpts={"nics":2}) domain.configAddDisk("phy:/dev/ram0", "hda1", "w") +domain.configAddDisk("phy:/dev/ram1", "hdb2", "w") -s, o = traceCommand("mkfs /dev/ram0") +s, o = traceCommand("mke2fs -q /dev/ram0") if s != 0: - FAIL("Unable to mkfs /dev/ram0 in dom0") + FAIL("Unable to mke2fs /dev/ram0 in dom0") + +s, o = traceCommand("mke2fs -q /dev/ram1") +if s != 0: + FAIL("Unable to mke2fs /dev/ram1 in dom0") try: domain.start() @@ -22,13 +29,38 @@ console = XmConsole(domain.getName()) console.sendInput("foo") - run = console.runCmd("mount /dev/hda1 /mnt") + run = console.runCmd("mkdir /mnt/a /mnt/b") + if run["return"] != 0: + FAIL("Unable to mkdir /mnt/a /mnt/b") + + run = console.runCmd("mount /dev/hda1 /mnt/a") if run["return"] != 0: FAIL("Unable to mount /dev/hda1") - run = console.runCmd("echo bar > /mnt/foo") + run = console.runCmd("mount /dev/hdb2 /mnt/b") if run["return"] != 0: - FAIL("Unable to write to block device!") + FAIL("Unable to mount /dev/hdb2") + + run = console.runCmd("echo hda1 > /mnt/a/foo") + if run["return"] != 0: + FAIL("Unable to write to block device hda1!") + + run = console.runCmd("echo hdb2 > /mnt/b/foo") + if run["return"] != 0: + FAIL("Unable to write to block device hdb2!") + + run = console.runCmd("ifconfig eth0 169.254.0.1 netmask 255.255.255.0") + if run["return"] != 0: + FAIL("Unable to configure DomU's eth0") + + run = console.runCmd("ifconfig eth1 169.254.1.1 netmask 255.255.255.0") + if run["return"] != 0: + FAIL("Unable to configure DomU's eth1") + + run = console.runCmd("ifconfig lo 127.0.0.1") + if run["return"] != 0: + FAIL("Unable to configure DomU's lo") + except ConsoleError, e: FAIL(str(e)) @@ -63,9 +95,31 @@ if run["return"] != 0: FAIL("ls failed on restored domain") - run = console.runCmd("cat /mnt/foo | grep bar") + run = console.runCmd("cat /mnt/a/foo") if run["return"] != 0: - FAIL("Unable to read from block device") + FAIL("Unable to read from block device hda1") + if not re.search("hda1", run["output"]): + FAIL("Failed to read correct data from hda1") + + run = console.runCmd("cat /mnt/b/foo") + if run["return"] != 0: + FAIL("Unable to read from block device hdb2") + if not re.search("hdb2", run["output"]): + FAIL("Failed to read correct data from hdb2") + + run = console.runCmd("ifconfig") + if not re.search("eth0", run["output"]): + FAIL("DomU's eth0 disappeared") + if not re.search("169.254.0.1", run["output"]): + FAIL("DomU's eth0 lost its IP") + if not re.search("eth1", run["output"]): + FAIL("DomU's eth1 disappeared") + if not re.search("169.254.1.1", run["output"]): + FAIL("DomU's eth1 lost its IP") + if not re.search("Loopback", run["output"]): + FAIL("DomU's lo disappeared") + if not re.search("127.0.0.1", run["output"]): + FAIL("DomU's lo lost its IP") except ConsoleError, e: FAIL(str(e)) diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/dm/vmx_vioapic.c --- a/xen/arch/x86/dm/vmx_vioapic.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/dm/vmx_vioapic.c Thu Nov 10 17:25:27 2005 @@ -158,6 +158,14 @@ return result; } +static void vmx_vioapic_update_imr(struct vmx_vioapic *s, int index) +{ + if (s->redirtbl[index].RedirForm.mask) + set_bit(index, &s->imr); + else + clear_bit(index, &s->imr); +} + static void vmx_vioapic_write_indirect(struct vmx_vioapic *s, unsigned long addr, unsigned long length, @@ -200,6 +208,7 @@ redir_content = ((redir_content >> 32) << 32) | (val & 0xffffffff); s->redirtbl[redir_index].value = redir_content; + vmx_vioapic_update_imr(s, redir_index); } else { printk("vmx_vioapic_write_indirect " "error register %x\n", s->ioregsel); @@ -264,8 +273,10 @@ memset(s, 0, sizeof(vmx_vioapic_t)); - for (i = 0; i < IOAPIC_NUM_PINS; i++) + for (i = 0; i < IOAPIC_NUM_PINS; i++) { s->redirtbl[i].RedirForm.mask = 0x1; + vmx_vioapic_update_imr(s, i); + } } static void ioapic_update_config(vmx_vioapic_t *s, @@ -422,7 +433,13 @@ target = apic_round_robin( s->domain, dest_mode, vector, deliver_bitmask); - ioapic_inj_irq(s, target, vector, trig_mode, delivery_mode); + if (target) + ioapic_inj_irq(s, target, vector, trig_mode, delivery_mode); + else{ + VMX_DBG_LOG(DBG_LEVEL_IOAPIC, "ioapic deliver " + "null round robin mask %x vector %x delivery_mode %x\n", + deliver_bitmask, vector, deliver_bitmask); + } break; } @@ -457,7 +474,7 @@ ASSERT(s); - irqs = s->irr & ~s->isr; + irqs = s->irr & ~s->isr & ~s->imr; return __fls(irqs); } @@ -471,7 +488,7 @@ VMX_DBG_LOG(DBG_LEVEL_IOAPIC, "service_ioapic " "highest irqno %x\n", irqno); - if (!s->redirtbl[irqno].RedirForm.mask) { + if (!test_bit(irqno, &s->imr)) { ioapic_deliver(s, irqno); } @@ -490,7 +507,7 @@ if (!vmx_apic_support(d)) return; - s->irr |= irqs; + s->irr |= irqs & ~s->imr; service_ioapic(s); } @@ -584,7 +601,9 @@ domain_crash_synchronous(); } - s->lapic_info[s->lapic_count ++] = vlapic; + /* update count later for race condition on interrupt */ + s->lapic_info[s->lapic_count] = vlapic; + s->lapic_count ++; return s->lapic_count; } diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/domain.c --- a/xen/arch/x86/domain.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/domain.c Thu Nov 10 17:25:27 2005 @@ -407,6 +407,7 @@ /* VMX uses the initially provided page tables as the P2M map. */ if ( !pagetable_get_paddr(d->arch.phys_table) ) d->arch.phys_table = v->arch.guest_table; + v->arch.guest_table = mk_pagetable(0); /* Initialize monitor page table */ v->arch.monitor_table = mk_pagetable(0); @@ -646,7 +647,7 @@ regs->rip = stu.rip; regs->cs = stu.cs | 3; /* force guest privilege */ - regs->rflags = stu.rflags; + regs->rflags = (stu.rflags & ~(EF_IOPL|EF_VM)) | EF_IE; regs->rsp = stu.rsp; regs->ss = stu.ss | 3; /* force guest privilege */ diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/setup.c --- a/xen/arch/x86/setup.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/setup.c Thu Nov 10 17:25:27 2005 @@ -430,6 +430,10 @@ /* Sanity check for unwanted bloat of dom0_op_t structure. */ BUG_ON(sizeof(((dom0_op_t *)0)->u) != sizeof(((dom0_op_t *)0)->u.pad)); + BUG_ON(sizeof(start_info_t) > PAGE_SIZE); + BUG_ON(sizeof(shared_info_t) > PAGE_SIZE); + BUG_ON(sizeof(vcpu_info_t) != (sizeof(unsigned long) * 4)); + init_frametable(); end_boot_allocator(); diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/shadow32.c --- a/xen/arch/x86/shadow32.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/shadow32.c Thu Nov 10 17:25:27 2005 @@ -997,7 +997,8 @@ if ( new_modes & SHM_log_dirty ) { ASSERT( !d->arch.shadow_dirty_bitmap ); - d->arch.shadow_dirty_bitmap_size = (d->max_pages + 63) & ~63; + d->arch.shadow_dirty_bitmap_size = + (d->shared_info->arch.max_pfn + 63) & ~63; d->arch.shadow_dirty_bitmap = xmalloc_array(unsigned long, d->arch.shadow_dirty_bitmap_size / (8 * sizeof(unsigned long))); @@ -1287,34 +1288,28 @@ d->arch.shadow_dirty_net_count = 0; d->arch.shadow_dirty_block_count = 0; - if ( (d->max_pages > sc->pages) || - (sc->dirty_bitmap == NULL) || + if ( (sc->dirty_bitmap == NULL) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; break; } - - sc->pages = d->max_pages; + + if(sc->pages > d->arch.shadow_dirty_bitmap_size) + sc->pages = d->arch.shadow_dirty_bitmap_size; #define chunk (8*1024) /* Transfer and clear in 1kB chunks for L1 cache. */ - for ( i = 0; i < d->max_pages; i += chunk ) - { - int bytes = ((((d->max_pages - i) > chunk) ? - chunk : (d->max_pages - i)) + 7) / 8; + for ( i = 0; i < sc->pages; i += chunk ) + { + int bytes = ((((sc->pages - i) > chunk) ? + chunk : (sc->pages - i)) + 7) / 8; if (copy_to_user( sc->dirty_bitmap + (i/(8*sizeof(unsigned long))), d->arch.shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))), bytes)) { - // copy_to_user can fail when copying to guest app memory. - // app should zero buffer after mallocing, and pin it rc = -EINVAL; - memset( - d->arch.shadow_dirty_bitmap + - (i/(8*sizeof(unsigned long))), - 0, (d->max_pages/8) - (i/(8*sizeof(unsigned long)))); break; } @@ -1331,17 +1326,19 @@ sc->stats.dirty_net_count = d->arch.shadow_dirty_net_count; sc->stats.dirty_block_count = d->arch.shadow_dirty_block_count; - if ( (d->max_pages > sc->pages) || - (sc->dirty_bitmap == NULL) || + + if ( (sc->dirty_bitmap == NULL) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; break; } - sc->pages = d->max_pages; - if (copy_to_user( - sc->dirty_bitmap, d->arch.shadow_dirty_bitmap, (d->max_pages+7)/8)) + if(sc->pages > d->arch.shadow_dirty_bitmap_size) + sc->pages = d->arch.shadow_dirty_bitmap_size; + + if (copy_to_user(sc->dirty_bitmap, + d->arch.shadow_dirty_bitmap, (sc->pages+7)/8)) { rc = -EINVAL; break; diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/shadow_public.c --- a/xen/arch/x86/shadow_public.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/shadow_public.c Thu Nov 10 17:25:27 2005 @@ -1009,7 +1009,8 @@ if ( new_modes & SHM_log_dirty ) { ASSERT( !d->arch.shadow_dirty_bitmap ); - d->arch.shadow_dirty_bitmap_size = (d->max_pages + 63) & ~63; + d->arch.shadow_dirty_bitmap_size = + (d->shared_info->arch.max_pfn + 63) & ~63; d->arch.shadow_dirty_bitmap = xmalloc_array(unsigned long, d->arch.shadow_dirty_bitmap_size / (8 * sizeof(unsigned long))); @@ -1163,34 +1164,29 @@ d->arch.shadow_dirty_net_count = 0; d->arch.shadow_dirty_block_count = 0; - if ( (d->max_pages > sc->pages) || - (sc->dirty_bitmap == NULL) || + + if ( (sc->dirty_bitmap == NULL) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; break; } - - sc->pages = d->max_pages; + + if(sc->pages > d->arch.shadow_dirty_bitmap_size) + sc->pages = d->arch.shadow_dirty_bitmap_size; #define chunk (8*1024) /* Transfer and clear in 1kB chunks for L1 cache. */ - for ( i = 0; i < d->max_pages; i += chunk ) - { - int bytes = ((((d->max_pages - i) > chunk) ? - chunk : (d->max_pages - i)) + 7) / 8; + for ( i = 0; i < sc->pages; i += chunk ) + { + int bytes = ((((sc->pages - i) > chunk) ? + chunk : (sc->pages - i)) + 7) / 8; if (copy_to_user( sc->dirty_bitmap + (i/(8*sizeof(unsigned long))), d->arch.shadow_dirty_bitmap +(i/(8*sizeof(unsigned long))), bytes)) { - // copy_to_user can fail when copying to guest app memory. - // app should zero buffer after mallocing, and pin it rc = -EINVAL; - memset( - d->arch.shadow_dirty_bitmap + - (i/(8*sizeof(unsigned long))), - 0, (d->max_pages/8) - (i/(8*sizeof(unsigned long)))); break; } memset( @@ -1206,17 +1202,18 @@ sc->stats.dirty_net_count = d->arch.shadow_dirty_net_count; sc->stats.dirty_block_count = d->arch.shadow_dirty_block_count; - if ( (d->max_pages > sc->pages) || - (sc->dirty_bitmap == NULL) || + if ( (sc->dirty_bitmap == NULL) || (d->arch.shadow_dirty_bitmap == NULL) ) { rc = -EINVAL; break; } - sc->pages = d->max_pages; - if (copy_to_user( - sc->dirty_bitmap, d->arch.shadow_dirty_bitmap, (d->max_pages+7)/8)) + if(sc->pages > d->arch.shadow_dirty_bitmap_size) + sc->pages = d->arch.shadow_dirty_bitmap_size; + + if (copy_to_user(sc->dirty_bitmap, + d->arch.shadow_dirty_bitmap, (sc->pages+7)/8)) { rc = -EINVAL; break; diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/traps.c --- a/xen/arch/x86/traps.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/traps.c Thu Nov 10 17:25:27 2005 @@ -412,16 +412,16 @@ struct vcpu *v = current; struct trap_bounce *tb = &v->arch.trap_bounce; + v->arch.guest_context.ctrlreg[2] = addr; + v->vcpu_info->arch.cr2 = addr; + ti = &v->arch.guest_context.trap_ctxt[TRAP_page_fault]; - tb->flags = TBF_EXCEPTION | TBF_EXCEPTION_ERRCODE | TBF_EXCEPTION_CR2; - tb->cr2 = addr; + tb->flags = TBF_EXCEPTION | TBF_EXCEPTION_ERRCODE; tb->error_code = error_code; tb->cs = ti->cs; tb->eip = ti->address; if ( TI_GET_IF(ti) ) tb->flags |= TBF_INTERRUPT; - - v->arch.guest_context.ctrlreg[2] = addr; } static int handle_perdomain_mapping_fault( @@ -931,6 +931,7 @@ case 2: /* Write CR2 */ v->arch.guest_context.ctrlreg[2] = *reg; + v->vcpu_info->arch.cr2 = *reg; break; case 3: /* Write CR3 */ diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/vmx_vlapic.c --- a/xen/arch/x86/vmx_vlapic.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/vmx_vlapic.c Thu Nov 10 17:25:27 2005 @@ -119,22 +119,35 @@ } /* This only for fixed delivery mode */ -int vlapic_match_dest(struct vlapic *target, struct vlapic *source, - int short_hand, int dest, int dest_mode, - int delivery_mode) +static int vlapic_match_dest(struct vcpu *v, struct vlapic *source, + int short_hand, int dest, int dest_mode, + int delivery_mode) { int result = 0; + struct vlapic *target = VLAPIC(v); VMX_DBG_LOG(DBG_LEVEL_VLAPIC, "vlapic_match_dest: " "target %p source %p dest %x dest_mode %x short_hand %x " "delivery_mode %x", target, source, dest, dest_mode, short_hand, delivery_mode); + if ( unlikely(!target) && + ( (delivery_mode != VLAPIC_DELIV_MODE_INIT) && + (delivery_mode != VLAPIC_DELIV_MODE_STARTUP) && + (delivery_mode != VLAPIC_DELIV_MODE_NMI) )) { + VMX_DBG_LOG(DBG_LEVEL_VLAPIC, "vlapic_match_dest " + "uninitialized target v %p delivery_mode %x dest %x\n", + v, delivery_mode, dest); + return result; + } + switch (short_hand) { case VLAPIC_NO_SHORTHAND: if (!dest_mode) { /* Physical */ - result = (target->id == dest); + result = ((target ? target->id : v->vcpu_id ) == dest); } else { /* Logical */ + if (!target) + break; if (((target->dest_format >> 28) & 0xf) == 0xf) { /* Flat mode */ result = (target->logical_dest >> 24) & dest; } else { @@ -176,17 +189,18 @@ * Add a pending IRQ into lapic. * Return 1 if successfully added and 0 if discarded. */ -int vlapic_accept_irq(struct vlapic *vlapic, int delivery_mode, - int vector, int level, int trig_mode) -{ - int result = 1; +static int vlapic_accept_irq(struct vcpu *v, int delivery_mode, + int vector, int level, int trig_mode) +{ + int result = 0; + struct vlapic *vlapic = VLAPIC(v); switch (delivery_mode) { case VLAPIC_DELIV_MODE_FIXED: case VLAPIC_DELIV_MODE_LPRI: /* FIXME add logic for vcpu on reset */ - if (!vlapic->vcpu || !vlapic_enabled(vlapic)) - return 0; + if (unlikely(!vlapic || !vlapic_enabled(vlapic))) + return result; if (test_and_set_bit(vector, &vlapic->irr[0])) { printk("<vlapic_accept_irq>" @@ -199,6 +213,7 @@ } } evtchn_set_pending(vlapic->vcpu, iopacket_port(vlapic->domain)); + result = 1; break; case VLAPIC_DELIV_MODE_RESERVED: @@ -269,15 +284,12 @@ old = next = d->arch.vmx_platform.round_info[vector]; - next++; - if (next == MAX_VIRT_CPUS || !d->vcpu[next]) - next = 0; - do { /* the vcpu array is arranged according to vcpu_id */ if (test_bit(next, &bitmap)) { target = d->vcpu[next]->arch.arch_vmx.vlapic; - if (!vlapic_enabled(target)) { + + if (!target || !vlapic_enabled(target)) { printk("warning: targe round robin local apic disabled\n"); /* XXX should we domain crash?? Or should we return NULL */ } @@ -285,7 +297,9 @@ } next ++; - if (next == MAX_VIRT_CPUS || !d->vcpu[next]) + if (!d->vcpu[next] || + !test_bit(_VCPUF_initialised, &d->vcpu[next]->vcpu_flags) || + next == MAX_VIRT_CPUS) next = 0; }while(next != old); @@ -319,7 +333,7 @@ { if ((dm == VLAPIC_DELIV_MODE_FIXED) && (vector < 16)) { vlapic->err_status |= 0x40; - vlapic_accept_irq(vlapic, VLAPIC_DELIV_MODE_FIXED, + vlapic_accept_irq(vlapic->vcpu, VLAPIC_DELIV_MODE_FIXED, vlapic_lvt_vector(vlapic, VLAPIC_LVT_ERROR), 0, 0); printk("<vlapic_check_vector>: check fail\n"); return 0; @@ -340,7 +354,6 @@ struct vlapic *target; struct vcpu *v = NULL; - int result = 0; uint32_t lpr_map; VMX_DBG_LOG(DBG_LEVEL_VLAPIC, "vlapic_ipi: " @@ -352,32 +365,27 @@ delivery_mode, vector); for_each_vcpu ( vlapic->domain, v ) { - target = VLAPIC(v); - if (vlapic_match_dest(target, vlapic, short_hand, + if (vlapic_match_dest(v, vlapic, short_hand, dest, dest_mode, delivery_mode)) { if (delivery_mode == VLAPIC_DELIV_MODE_LPRI) { set_bit(v->vcpu_id, &lpr_map); - }else - result = vlapic_accept_irq(target, delivery_mode, - vector, level, trig_mode); + } else + vlapic_accept_irq(v, delivery_mode, + vector, level, trig_mode); } } if (delivery_mode == VLAPIC_DELIV_MODE_LPRI) { - extern struct vlapic* - apic_round_robin(struct domain *d, - uint8_t dest_mode, uint8_t vector, uint32_t bitmap); - v = vlapic->vcpu; target = apic_round_robin(v->domain, dest_mode, vector, lpr_map); if (target) - vlapic_accept_irq(target, delivery_mode, - vector, level, trig_mode); - } -} - -void vlapic_begin_timer(struct vlapic *vlapic) + vlapic_accept_irq(target->vcpu, delivery_mode, + vector, level, trig_mode); + } +} + +static void vlapic_begin_timer(struct vlapic *vlapic) { s_time_t cur = NOW(), offset; @@ -737,12 +745,13 @@ vlapic->timer_current = val; vlapic->timer_current_update = NOW(); + vlapic_begin_timer(vlapic); + VMX_DBG_LOG(DBG_LEVEL_VLAPIC, "timer_init %x timer_current %x" "timer_current_update %08x%08x", vlapic->timer_initial, vlapic->timer_current, (uint32_t)(vlapic->timer_current_update >> 32), (uint32_t)vlapic->timer_current_update); - vlapic_begin_timer(vlapic); break; case APIC_TDCR: @@ -827,6 +836,7 @@ } else vlapic->intr_pending_count[vlapic_lvt_vector(vlapic, VLAPIC_LVT_TIMER)]++; + evtchn_set_pending(vlapic->vcpu, iopacket_port(vlapic->domain)); } vlapic->timer_current_update = NOW(); diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/vmx_vmcs.c --- a/xen/arch/x86/vmx_vmcs.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/vmx_vmcs.c Thu Nov 10 17:25:27 2005 @@ -332,7 +332,7 @@ error |= __vmwrite(GUEST_TR_BASE, 0); error |= __vmwrite(GUEST_TR_LIMIT, 0xff); - __vmwrite(GUEST_CR3, pagetable_get_paddr(v->arch.guest_table)); + __vmwrite(GUEST_CR3, pagetable_get_paddr(v->domain->arch.phys_table)); __vmwrite(HOST_CR3, pagetable_get_paddr(v->arch.monitor_table)); __vmwrite(HOST_RSP, (unsigned long)get_stack_bottom()); diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/x86_32/asm-offsets.c --- a/xen/arch/x86/x86_32/asm-offsets.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/x86_32/asm-offsets.c Thu Nov 10 17:25:27 2005 @@ -75,7 +75,6 @@ BLANK(); OFFSET(TRAPBOUNCE_error_code, struct trap_bounce, error_code); - OFFSET(TRAPBOUNCE_cr2, struct trap_bounce, cr2); OFFSET(TRAPBOUNCE_flags, struct trap_bounce, flags); OFFSET(TRAPBOUNCE_cs, struct trap_bounce, cs); OFFSET(TRAPBOUNCE_eip, struct trap_bounce, eip); diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/x86_32/entry.S --- a/xen/arch/x86/x86_32/entry.S Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/x86_32/entry.S Thu Nov 10 17:25:27 2005 @@ -156,7 +156,7 @@ * By this time, all the setups in the VMCS must be complete. */ .if \launch - /* VMLUANCH */ + /* VMLAUNCH */ .byte 0x0f,0x01,0xc2 pushf call vm_launch_fail @@ -394,37 +394,37 @@ shll $16,%eax # Bits 16-23: saved_upcall_mask movw UREGS_cs+4(%esp),%ax # Bits 0-15: CS FLT15: movl %eax,%gs:4(%esi) + test $0x00FF0000,%eax # Bits 16-23: saved_upcall_mask + setz %ch # %ch == !saved_upcall_mask movl UREGS_eflags+4(%esp),%eax + andl $~X86_EFLAGS_IF,%eax + shlb $1,%ch # Bit 9 (EFLAGS.IF) + orb %ch,%ah # Fold EFLAGS.IF into %eax FLT16: movl %eax,%gs:8(%esi) test $TBF_EXCEPTION_ERRCODE,%cl jz 1f subl $4,%esi # push error_code onto guest frame movl TRAPBOUNCE_error_code(%edx),%eax FLT17: movl %eax,%gs:(%esi) - testb $TBF_EXCEPTION_CR2,%cl - jz 2f - subl $4,%esi # push %cr2 onto guest frame - movl TRAPBOUNCE_cr2(%edx),%eax -FLT18: movl %eax,%gs:(%esi) 1: testb $TBF_FAILSAFE,%cl jz 2f subl $16,%esi # add DS/ES/FS/GS to failsafe stack frame testl $X86_EFLAGS_VM,UREGS_eflags+4(%esp) jz nvm86_2 xorl %eax,%eax # VM86: we write zero selector values -FLT19: movl %eax,%gs:(%esi) -FLT20: movl %eax,%gs:4(%esi) -FLT21: movl %eax,%gs:8(%esi) -FLT22: movl %eax,%gs:12(%esi) +FLT18: movl %eax,%gs:(%esi) +FLT19: movl %eax,%gs:4(%esi) +FLT20: movl %eax,%gs:8(%esi) +FLT21: movl %eax,%gs:12(%esi) jmp 2f nvm86_2:movl UREGS_ds+4(%esp),%eax # non-VM86: write real selector values -FLT23: movl %eax,%gs:(%esi) +FLT22: movl %eax,%gs:(%esi) movl UREGS_es+4(%esp),%eax -FLT24: movl %eax,%gs:4(%esi) +FLT23: movl %eax,%gs:4(%esi) movl UREGS_fs+4(%esp),%eax -FLT25: movl %eax,%gs:8(%esi) +FLT24: movl %eax,%gs:8(%esi) movl UREGS_gs+4(%esp),%eax -FLT26: movl %eax,%gs:12(%esi) +FLT25: movl %eax,%gs:12(%esi) 2: testl $X86_EFLAGS_VM,UREGS_eflags+4(%esp) jz nvm86_3 xorl %eax,%eax /* zero DS-GS, just as a real CPU would */ @@ -456,7 +456,6 @@ .long FLT20,domain_crash_synchronous , FLT21,domain_crash_synchronous .long FLT22,domain_crash_synchronous , FLT23,domain_crash_synchronous .long FLT24,domain_crash_synchronous , FLT25,domain_crash_synchronous - .long FLT26,domain_crash_synchronous .previous ALIGN diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/x86_64/asm-offsets.c --- a/xen/arch/x86/x86_64/asm-offsets.c Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/x86_64/asm-offsets.c Thu Nov 10 17:25:27 2005 @@ -75,7 +75,6 @@ BLANK(); OFFSET(TRAPBOUNCE_error_code, struct trap_bounce, error_code); - OFFSET(TRAPBOUNCE_cr2, struct trap_bounce, cr2); OFFSET(TRAPBOUNCE_flags, struct trap_bounce, flags); OFFSET(TRAPBOUNCE_cs, struct trap_bounce, cs); OFFSET(TRAPBOUNCE_eip, struct trap_bounce, eip); diff -r f1c07363956b -r 476d02c1346c xen/arch/x86/x86_64/entry.S --- a/xen/arch/x86/x86_64/entry.S Thu Nov 10 16:43:24 2005 +++ b/xen/arch/x86/x86_64/entry.S Thu Nov 10 17:25:27 2005 @@ -352,8 +352,6 @@ FLT2: movq %rax,32(%rsi) # SS movq UREGS_rsp+8(%rsp),%rax FLT3: movq %rax,24(%rsi) # RSP - movq UREGS_eflags+8(%rsp),%rax -FLT4: movq %rax,16(%rsi) # RFLAGS movq VCPU_vcpu_info(%rbx),%rax pushq VCPUINFO_upcall_mask(%rax) testb $TBF_INTERRUPT,%cl @@ -362,7 +360,15 @@ popq %rax shlq $32,%rax # Bits 32-39: saved_upcall_mask movw UREGS_cs+8(%rsp),%ax # Bits 0-15: CS -FLT5: movq %rax,8(%rsi) # CS/saved_upcall_mask +FLT4: movq %rax,8(%rsi) # CS / saved_upcall_mask + shrq $32,%rax + testb $0xFF,%al # Bits 0-7: saved_upcall_mask + setz %ch # %ch == !saved_upcall_mask + movq UREGS_eflags+8(%rsp),%rax + andq $~X86_EFLAGS_IF,%rax + shlb $1,%ch # Bit 9 (EFLAGS.IF) + orb %ch,%ah # Fold EFLAGS.IF into %eax +FLT5: movq %rax,16(%rsi) # RFLAGS movq UREGS_rip+8(%rsp),%rax FLT6: movq %rax,(%rsi) # RIP testb $TBF_EXCEPTION_ERRCODE,%cl @@ -370,27 +376,22 @@ subq $8,%rsi movl TRAPBOUNCE_error_code(%rdx),%eax FLT7: movq %rax,(%rsi) # ERROR CODE - testb $TBF_EXCEPTION_CR2,%cl - jz 2f - subq $8,%rsi - movq TRAPBOUNCE_cr2(%rdx),%rax -FLT8: movq %rax,(%rsi) # CR2 1: testb $TBF_FAILSAFE,%cl jz 2f subq $32,%rsi movl %gs,%eax -FLT9: movq %rax,24(%rsi) # GS +FLT8: movq %rax,24(%rsi) # GS movl %fs,%eax -FLT10: movq %rax,16(%rsi) # FS +FLT9: movq %rax,16(%rsi) # FS movl %es,%eax -FLT11: movq %rax,8(%rsi) # ES +FLT10: movq %rax,8(%rsi) # ES movl %ds,%eax -FLT12: movq %rax,(%rsi) # DS +FLT11: movq %rax,(%rsi) # DS 2: subq $16,%rsi movq UREGS_r11+8(%rsp),%rax -FLT13: movq %rax,8(%rsi) # R11 +FLT12: movq %rax,8(%rsi) # R11 movq UREGS_rcx+8(%rsp),%rax -FLT14: movq %rax,(%rsi) # RCX +FLT13: movq %rax,(%rsi) # RCX /* Rewrite our stack frame and return to guest-OS mode. */ /* IA32 Ref. Vol. 3: TF, VM, RF and NT flags are cleared on trap. */ movl $TRAP_syscall,UREGS_entry_vector+8(%rsp) @@ -411,7 +412,6 @@ .quad FLT8,domain_crash_synchronous , FLT9,domain_crash_synchronous .quad FLT10,domain_crash_synchronous , FLT11,domain_crash_synchronous .quad FLT12,domain_crash_synchronous , FLT13,domain_crash_synchronous - .quad FLT14,domain_crash_synchronous .previous ALIGN diff -r f1c07363956b -r 476d02c1346c xen/include/asm-x86/domain.h --- a/xen/include/asm-x86/domain.h Thu Nov 10 16:43:24 2005 +++ b/xen/include/asm-x86/domain.h Thu Nov 10 17:25:27 2005 @@ -8,7 +8,6 @@ struct trap_bounce { unsigned long error_code; - unsigned long cr2; unsigned short flags; /* TBF_ */ unsigned short cs; unsigned long eip; diff -r f1c07363956b -r 476d02c1346c xen/include/asm-x86/processor.h --- a/xen/include/asm-x86/processor.h Thu Nov 10 16:43:24 2005 +++ b/xen/include/asm-x86/processor.h Thu Nov 10 17:25:27 2005 @@ -121,7 +121,6 @@ /* 'trap_bounce' flags values */ #define TBF_EXCEPTION 1 #define TBF_EXCEPTION_ERRCODE 2 -#define TBF_EXCEPTION_CR2 4 #define TBF_INTERRUPT 8 #define TBF_FAILSAFE 16 diff -r f1c07363956b -r 476d02c1346c xen/include/asm-x86/vmx_vioapic.h --- a/xen/include/asm-x86/vmx_vioapic.h Thu Nov 10 16:43:24 2005 +++ b/xen/include/asm-x86/vmx_vioapic.h Thu Nov 10 17:25:27 2005 @@ -92,9 +92,10 @@ #define MAX_LAPIC_NUM 32 typedef struct vmx_vioapic { - uint32_t ioregsel; uint32_t irr; uint32_t isr; /* This is used for level trigger */ + uint32_t imr; + uint32_t ioregsel; uint32_t flags; uint32_t lapic_count; uint32_t id; diff -r f1c07363956b -r 476d02c1346c xen/include/public/arch-ia64.h --- a/xen/include/public/arch-ia64.h Thu Nov 10 16:43:24 2005 +++ b/xen/include/public/arch-ia64.h Thu Nov 10 17:25:27 2005 @@ -271,12 +271,10 @@ typedef mapped_regs_t vpd_t; -#define __ARCH_HAS_VCPU_INFO - typedef struct { unsigned int flags; unsigned long start_info_pfn; -} arch_shared_info_t; // DON'T PACK +} arch_shared_info_t; typedef struct vcpu_guest_context { #define VGCF_FPU_VALID (1<<0) diff -r f1c07363956b -r 476d02c1346c xen/include/public/arch-x86_32.h --- a/xen/include/public/arch-x86_32.h Thu Nov 10 16:43:24 2005 +++ b/xen/include/public/arch-x86_32.h Thu Nov 10 17:25:27 2005 @@ -90,7 +90,7 @@ uint16_t cs; uint8_t saved_upcall_mask; uint8_t _pad0; - uint32_t eflags; + uint32_t eflags; /* eflags.IF == !saved_upcall_mask */ uint32_t esp; uint16_t ss, _pad1; uint16_t es, _pad2; @@ -132,6 +132,11 @@ unsigned long pfn_to_mfn_frame_list_list; } arch_shared_info_t; +typedef struct { + unsigned long cr2; + unsigned long pad; /* sizeof(vcpu_info_t) == 16 */ +} arch_vcpu_info_t; + #endif #endif diff -r f1c07363956b -r 476d02c1346c xen/include/public/arch-x86_64.h --- a/xen/include/public/arch-x86_64.h Thu Nov 10 16:43:24 2005 +++ b/xen/include/public/arch-x86_64.h Thu Nov 10 17:25:27 2005 @@ -154,7 +154,7 @@ uint16_t cs, _pad0[1]; uint8_t saved_upcall_mask; uint8_t _pad1[3]; - __DECL_REG(flags); + __DECL_REG(flags); /* rflags.IF == !saved_upcall_mask */ __DECL_REG(sp); uint16_t ss, _pad2[3]; uint16_t es, _pad3[3]; @@ -201,6 +201,11 @@ unsigned long pfn_to_mfn_frame_list_list; } arch_shared_info_t; +typedef struct { + unsigned long cr2; + unsigned long pad; /* sizeof(vcpu_info_t) == 32 */ +} arch_vcpu_info_t; + #endif /* !__ASSEMBLY__ */ #endif diff -r f1c07363956b -r 476d02c1346c xen/include/public/dom0_ops.h --- a/xen/include/public/dom0_ops.h Thu Nov 10 16:43:24 2005 +++ b/xen/include/public/dom0_ops.h Thu Nov 10 17:25:27 2005 @@ -19,7 +19,7 @@ * This makes sure that old versions of dom0 tools will stop working in a * well-defined way (rather than crashing the machine, for instance). */ -#define DOM0_INTERFACE_VERSION 0xAAAA1011 +#define DOM0_INTERFACE_VERSION 0xAAAA1012 /************************************************************************/ diff -r f1c07363956b -r 476d02c1346c xen/include/public/xen.h --- a/xen/include/public/xen.h Thu Nov 10 16:43:24 2005 +++ b/xen/include/public/xen.h Thu Nov 10 17:25:27 2005 @@ -299,9 +299,7 @@ uint8_t evtchn_upcall_pending; uint8_t evtchn_upcall_mask; unsigned long evtchn_pending_sel; -#ifdef __ARCH_HAS_VCPU_INFO arch_vcpu_info_t arch; -#endif } vcpu_info_t; typedef struct vcpu_time_info { diff -r f1c07363956b -r 476d02c1346c tools/python/xen/xm/tests/__init__.py --- /dev/null Thu Nov 10 16:43:24 2005 +++ b/tools/python/xen/xm/tests/__init__.py Thu Nov 10 17:25:27 2005 @@ -0,0 +1,2 @@ + + diff -r f1c07363956b -r 476d02c1346c tools/xm-test/mergereport --- /dev/null Thu Nov 10 16:43:24 2005 +++ b/tools/xm-test/mergereport Thu Nov 10 17:25:27 2005 @@ -0,0 +1,25 @@ +#!/bin/sh + +# Dan Smith <danms@xxxxxxxxxx> - 16-Sep-2005 +# +# This script takes all the .report files in the current +# directory and generates a summary table, showing the +# number of PASS, FAIL, XPASS, and XFAIL tests in each +# report + + +echo " Platform | PASS | FAIL | XPASS | XFAIL |" +echo "---------------------+------+------+-------+-------+" + +for r in *.report; do + + mach=$(basename $r .report) + pass=$(cat $r | grep ' PASS' | cut -d : -f 2 | sed 's/ *//') + fail=$(cat $r | grep ' FAIL' | cut -d : -f 2 | sed 's/ *//') + xpas=$(cat $r | grep ' XPASS' | cut -d : -f 2 | sed 's/ *//') + xfal=$(cat $r | grep ' XFAIL' | cut -d : -f 2 | sed 's/ *//') + + printf "%20s | %4s | %4s | %5s | %5s |\n" "$mach" "$pass" \ + "$fail" "$xpas" "$xfal" + +done diff -r f1c07363956b -r 476d02c1346c tools/xm-test/lib/XmTestReport/xmtest.py --- a/tools/xm-test/lib/XmTestReport/xmtest.py Thu Nov 10 16:43:24 2005 +++ /dev/null Thu Nov 10 17:25:27 2005 @@ -1,3 +0,0 @@ -#!/usr/bin/python - -XM_TEST_VERSION = "0.4.0" diff -r f1c07363956b -r 476d02c1346c tools/xm-test/tests/create/log --- a/tools/xm-test/tests/create/log Thu Nov 10 16:43:24 2005 +++ /dev/null Thu Nov 10 17:25:27 2005 @@ -1,14 +0,0 @@ --- BEGIN XmTest Log @Fri Oct 28 13:00:55 PDT 2005 -*input - - -BusyBox v1.01 (2005.10.27-17:34+0000) Built-in shell (ash) -Enter 'help' for a list of built-in commands. - --sh: can't access tty; job control turned off -*ls -CVS etc linuxrc opt sbin var -bin home lost+found proc tmp -dev lib mnt root usr - --- END XmTest Log _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |