[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XenPPC] [xenppc-unstable] [POWERPC] merge with http://xenbits.xensource.com/xen-unstable.hg
# HG changeset patch # User Jimi Xenidis <jimix@xxxxxxxxxxxxxx> # Node ID 10f1113fd48939fefa3daaabdb0e9890f77a97b0 # Parent 39c113fb84aca68b902d96aba8a57b36c9f6d42a # Parent 04e5e80be909c06737b84ce776028b5d60118406 [POWERPC] merge with http://xenbits.xensource.com/xen-unstable.hg --- linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c | 2 linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c | 2 linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c | 18 linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c | 2 linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c | 8 linux-2.6-xen-sparse/arch/i386/mm/init-xen.c | 2 linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c | 6 linux-2.6-xen-sparse/arch/ia64/kernel/setup.c | 7 linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c | 2 linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S | 12 linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c | 17 linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c | 2 linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c | 3 linux-2.6-xen-sparse/drivers/xen/console/console.c | 10 linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c | 2 linux-2.6-xen-sparse/drivers/xen/core/evtchn.c | 3 linux-2.6-xen-sparse/drivers/xen/core/skbuff.c | 3 linux-2.6-xen-sparse/drivers/xen/core/smpboot.c | 20 linux-2.6-xen-sparse/drivers/xen/netback/loopback.c | 2 linux-2.6-xen-sparse/drivers/xen/netback/netback.c | 138 +- linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c | 2 linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c | 2 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c | 15 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h | 2 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c | 2 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c | 24 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h | 7 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h | 1 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h | 160 ++ linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h | 129 -- linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h | 1 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h | 12 linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h | 2 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h | 7 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h | 139 ++ linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h | 122 -- linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h | 1 linux-2.6-xen-sparse/include/xen/hvm.h | 17 linux-2.6-xen-sparse/mm/memory.c | 5 linux-2.6-xen-sparse/net/core/dev.c | 10 patches/linux-2.6.16.13/net-gso-4-kill-warnon.patch | 28 tools/firmware/hvmloader/Makefile | 8 tools/firmware/hvmloader/hvmloader.c | 13 tools/firmware/hvmloader/hypercall.h | 2 tools/firmware/hvmloader/smbios.c | 606 ++++++++++ tools/firmware/hvmloader/smbios.h | 38 tools/firmware/hvmloader/smbios_types.h | 182 +++ tools/firmware/hvmloader/util.c | 80 + tools/firmware/hvmloader/util.h | 12 tools/firmware/rombios/rombios.c | 45 tools/firmware/vmxassist/vmxassist.ld | 12 tools/libxc/xc_evtchn.c | 11 tools/libxc/xc_hvm_build.c | 6 tools/libxc/xenctrl.h | 7 tools/python/xen/lowlevel/xc/xc.c | 69 - xen/arch/ia64/vmx/mmio.c | 2 xen/arch/ia64/vmx/vlsapic.c | 2 xen/arch/ia64/vmx/vmx_init.c | 5 xen/arch/ia64/vmx/vmx_vcpu.c | 2 xen/arch/ia64/xen/domain.c | 3 xen/arch/ia64/xen/hyperprivop.S | 2 xen/arch/ia64/xen/vcpu.c | 2 xen/arch/ia64/xen/xenasm.S | 2 xen/arch/x86/hvm/platform.c | 3 xen/common/grant_table.c | 7 xen/include/asm-ia64/domain.h | 2 xen/include/asm-ia64/event.h | 2 xen/include/asm-ia64/linux-xen/asm/ptrace.h | 3 xen/include/asm-ia64/privop_stat.h | 3 xen/include/asm-ia64/vcpu.h | 3 xen/include/asm-ia64/vmx_platform.h | 1 xen/include/asm-ia64/vmx_vpd.h | 2 72 files changed, 1542 insertions(+), 544 deletions(-) diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/cpu/mtrr/main-xen.c Mon Aug 14 15:21:30 2006 -0400 @@ -178,7 +178,7 @@ static int __init mtrr_init(void) { struct cpuinfo_x86 *c = &boot_cpu_data; - if (!(xen_start_info->flags & SIF_PRIVILEGED)) + if (!is_initial_xendomain()) return -ENODEV; if ((!cpu_has(c, X86_FEATURE_MTRR)) && diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/io_apic-xen.c Mon Aug 14 15:21:30 2006 -0400 @@ -2480,7 +2480,7 @@ static int __init io_apic_bug_finalize(v { if(sis_apic_bug == -1) sis_apic_bug = 0; - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (is_initial_xendomain()) { dom0_op_t op = { .cmd = DOM0_PLATFORM_QUIRK }; op.u.platform_quirk.quirk_id = sis_apic_bug ? QUIRK_IOAPIC_BAD_REGSEL : QUIRK_IOAPIC_GOOD_REGSEL; diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c Mon Aug 14 15:21:30 2006 -0400 @@ -318,7 +318,7 @@ static void __init probe_roms(void) int i; /* Nothing to do if not running in dom0. */ - if (!(xen_start_info->flags & SIF_INITDOMAIN)) + if (!is_initial_xendomain()) return; /* video rom */ @@ -1458,7 +1458,7 @@ static void __init register_memory(void) int i; /* Nothing to do if not running in dom0. */ - if (!(xen_start_info->flags & SIF_INITDOMAIN)) { + if (!is_initial_xendomain()) { legacy_init_iomem_resources(e820.map, e820.nr_map, &code_resource, &data_resource); return; @@ -1618,7 +1618,7 @@ void __init setup_arch(char **cmdline_p) /* Force a quick death if the kernel panics (not domain 0). */ extern int panic_timeout; - if (!panic_timeout && !(xen_start_info->flags & SIF_INITDOMAIN)) + if (!panic_timeout && !is_initial_xendomain()) panic_timeout = 1; /* Register a call for panic conditions. */ @@ -1661,7 +1661,7 @@ void __init setup_arch(char **cmdline_p) } bootloader_type = LOADER_TYPE; - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (is_initial_xendomain()) { /* This is drawn from a dump from vgacon:startup in * standard Linux. */ screen_info.orig_video_mode = 3; @@ -1788,7 +1788,7 @@ void __init setup_arch(char **cmdline_p) } #endif - if (xen_start_info->flags & SIF_INITDOMAIN) + if (is_initial_xendomain()) dmi_scan_machine(); #ifdef CONFIG_X86_GENERICARCH @@ -1805,7 +1805,7 @@ void __init setup_arch(char **cmdline_p) #endif #ifdef CONFIG_ACPI - if (!(xen_start_info->flags & SIF_INITDOMAIN)) { + if (!is_initial_xendomain()) { printk(KERN_INFO "ACPI in unprivileged domain disabled\n"); acpi_disabled = 1; acpi_ht = 0; @@ -1831,11 +1831,7 @@ void __init setup_arch(char **cmdline_p) register_memory(); - if (xen_start_info->flags & SIF_INITDOMAIN) { - if (!(xen_start_info->flags & SIF_PRIVILEGED)) - panic("Xen granted us console access " - "but not privileged status"); - + if (is_initial_xendomain()) { #ifdef CONFIG_VT #if defined(CONFIG_VGA_CONSOLE) if (!efi_enabled || diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/swiotlb.c Mon Aug 14 15:21:30 2006 -0400 @@ -199,7 +199,7 @@ swiotlb_init(void) swiotlb = 1; } else if ((swiotlb_force != -1) && is_running_on_xen() && - (xen_start_info->flags & SIF_INITDOMAIN)) { + is_initial_xendomain()) { /* Domain 0 always has a swiotlb. */ ram_end = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL); if (ram_end <= 0x7ffff) diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c --- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Mon Aug 14 15:21:30 2006 -0400 @@ -470,8 +470,7 @@ int do_settimeofday(struct timespec *tv) sec = tv->tv_sec; __normalize_time(&sec, &nsec); - if ((xen_start_info->flags & SIF_INITDOMAIN) && - !independent_wallclock) { + if (is_initial_xendomain() && !independent_wallclock) { op.cmd = DOM0_SETTIME; op.u.settime.secs = sec; op.u.settime.nsecs = nsec; @@ -502,8 +501,7 @@ static void sync_xen_wallclock(unsigned s64 nsec; dom0_op_t op; - if (!ntp_synced() || independent_wallclock || - !(xen_start_info->flags & SIF_INITDOMAIN)) + if (!ntp_synced() || independent_wallclock || !is_initial_xendomain()) return; write_seqlock_irq(&xtime_lock); @@ -532,7 +530,7 @@ static int set_rtc_mmss(unsigned long no WARN_ON(irqs_disabled()); - if (independent_wallclock || !(xen_start_info->flags & SIF_INITDOMAIN)) + if (independent_wallclock || !is_initial_xendomain()) return 0; /* gets recalled with irq locally disabled */ diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/i386/mm/init-xen.c --- a/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/i386/mm/init-xen.c Mon Aug 14 15:21:30 2006 -0400 @@ -566,7 +566,7 @@ void __init paging_init(void) /* Setup mapping of lower 1st MB */ for (i = 0; i < NR_FIX_ISAMAPS; i++) - if (xen_start_info->flags & SIF_PRIVILEGED) + if (is_initial_xendomain()) set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE); else __set_fixmap(FIX_ISAMAP_BEGIN - i, diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c --- a/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/i386/mm/ioremap-xen.c Mon Aug 14 15:21:30 2006 -0400 @@ -121,7 +121,7 @@ int direct_remap_pfn_range(struct vm_are domid_t domid) { /* Same as remap_pfn_range(). */ - vma->vm_flags |= VM_IO | VM_RESERVED; + vma->vm_flags |= VM_IO | VM_RESERVED | VM_PFNMAP; if (domid == DOMID_SELF) return -EINVAL; @@ -245,7 +245,7 @@ void __iomem * __ioremap(unsigned long p /* * Don't remap the low PCI/ISA area, it's always mapped.. */ - if (xen_start_info->flags & SIF_PRIVILEGED && + if (is_initial_xendomain() && phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS) return (void __iomem *) isa_bus_to_virt(phys_addr); @@ -425,7 +425,7 @@ void __init *bt_ioremap(unsigned long ph /* * Don't remap the low PCI/ISA area, it's always mapped.. */ - if (xen_start_info->flags & SIF_PRIVILEGED && + if (is_initial_xendomain() && phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS) return isa_bus_to_virt(phys_addr); diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/ia64/kernel/setup.c --- a/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/setup.c Mon Aug 14 15:21:30 2006 -0400 @@ -545,12 +545,7 @@ setup_arch (char **cmdline_p) "flags=0x%x\n", s->arch.start_info_pfn, xen_start_info->nr_pages, xen_start_info->flags); - /* xen_start_info isn't setup yet, get the flags manually */ - if (xen_start_info->flags & SIF_INITDOMAIN) { - if (!(xen_start_info->flags & SIF_PRIVILEGED)) - panic("Xen granted us console access " - "but not privileged status"); - } else { + if (!is_initial_xendomain()) { extern int console_use_vt; conswitchp = NULL; console_use_vt = 0; diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c --- a/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/ia64/xen/hypervisor.c Mon Aug 14 15:21:30 2006 -0400 @@ -82,7 +82,7 @@ ia64_xenmem_reservation_op(unsigned long // of a non-privileged domain, if ((op == XENMEM_increase_reservation || op == XENMEM_populate_physmap) && - !(xen_start_info->flags & SIF_PRIVILEGED) && + !is_initial_xendomain() && reservation.extent_order > 0) return ret; } diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/entry-xen.S Mon Aug 14 15:21:30 2006 -0400 @@ -271,7 +271,7 @@ sysret_careful: CFI_RESTORE_STATE bt $TIF_NEED_RESCHED,%edx jnc sysret_signal - XEN_BLOCK_EVENTS(%rsi) + XEN_UNBLOCK_EVENTS(%rsi) pushq %rdi CFI_ADJUST_CFA_OFFSET 8 call schedule @@ -295,7 +295,7 @@ 1: movl $_TIF_NEED_RESCHED,%edi 1: movl $_TIF_NEED_RESCHED,%edi /* Use IRET because user could have changed frame. This works because ptregscall_common has called FIXUP_TOP_OF_STACK. */ - cli + XEN_BLOCK_EVENTS(%rsi) jmp int_with_check badsys: @@ -377,7 +377,7 @@ int_careful: call schedule popq %rdi CFI_ADJUST_CFA_OFFSET -8 - cli + XEN_BLOCK_EVENTS(%rsi) jmp int_with_check /* handle signals and tracing -- both require a full stack frame */ @@ -395,7 +395,7 @@ int_very_careful: popq %rdi CFI_ADJUST_CFA_OFFSET -8 andl $~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edi - cli + XEN_BLOCK_EVENTS(%rsi) jmp int_restore_rest int_signal: @@ -407,7 +407,7 @@ 1: movl $_TIF_NEED_RESCHED,%edi 1: movl $_TIF_NEED_RESCHED,%edi int_restore_rest: RESTORE_REST - cli + XEN_BLOCK_EVENTS(%rsi) jmp int_with_check CFI_ENDPROC @@ -535,8 +535,8 @@ retint_careful: call schedule popq %rdi CFI_ADJUST_CFA_OFFSET -8 + GET_THREAD_INFO(%rcx) XEN_BLOCK_EVENTS(%rsi) - GET_THREAD_INFO(%rcx) /* cli */ jmp retint_check diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c Mon Aug 14 15:21:30 2006 -0400 @@ -639,7 +639,7 @@ void __init setup_arch(char **cmdline_p) kernel_end = 0; /* dummy */ screen_info = SCREEN_INFO; - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (is_initial_xendomain()) { /* This is drawn from a dump from vgacon:startup in * standard Linux. */ screen_info.orig_video_mode = 3; @@ -860,8 +860,7 @@ void __init setup_arch(char **cmdline_p) } - if ( ! (xen_start_info->flags & SIF_INITDOMAIN)) - { + if (!is_initial_xendomain()) { acpi_disabled = 1; #ifdef CONFIG_ACPI acpi_ht = 0; @@ -910,7 +909,7 @@ void __init setup_arch(char **cmdline_p) */ #if defined(CONFIG_XEN_PRIVILEGED_GUEST) probe_roms(); - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (is_initial_xendomain()) { machine_e820 = alloc_bootmem_low_pages(PAGE_SIZE); memmap.nr_entries = E820MAX; @@ -919,7 +918,7 @@ void __init setup_arch(char **cmdline_p) BUG_ON(HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap)); e820_reserve_resources(machine_e820, memmap.nr_entries); - } else if (!(xen_start_info->flags & SIF_INITDOMAIN)) + } else e820_reserve_resources(e820.map, e820.nr_map); #elif defined(CONFIG_XEN) e820_reserve_resources(e820.map, e820.nr_map); @@ -938,7 +937,7 @@ void __init setup_arch(char **cmdline_p) } #if defined(CONFIG_XEN_PRIVILEGED_GUEST) - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (is_initial_xendomain()) { e820_setup_gap(machine_e820, memmap.nr_entries); free_bootmem(__pa(machine_e820), PAGE_SIZE); } @@ -957,11 +956,7 @@ void __init setup_arch(char **cmdline_p) set_iopl.iopl = 1; HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl); - if (xen_start_info->flags & SIF_INITDOMAIN) { - if (!(xen_start_info->flags & SIF_PRIVILEGED)) - panic("Xen granted us console access " - "but not privileged status"); - + if (is_initial_xendomain()) { #ifdef CONFIG_VT #if defined(CONFIG_VGA_CONSOLE) conswitchp = &vga_con; diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c --- a/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/arch/x86_64/mm/init-xen.c Mon Aug 14 15:21:30 2006 -0400 @@ -789,7 +789,7 @@ void __init paging_init(void) /* Setup mapping of lower 1st MB */ for (i = 0; i < NR_FIX_ISAMAPS; i++) - if (xen_start_info->flags & SIF_PRIVILEGED) + if (is_initial_xendomain()) set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE); else __set_fixmap(FIX_ISAMAP_BEGIN - i, diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c --- a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c Mon Aug 14 15:21:30 2006 -0400 @@ -718,9 +718,8 @@ static int __init tpmif_init(void) long rc = 0; struct tpm_private *tp; - if ((xen_start_info->flags & SIF_INITDOMAIN)) { + if (is_initial_xendomain()) return -EPERM; - } tp = tpm_private_get(); if (!tp) { diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/console/console.c --- a/linux-2.6-xen-sparse/drivers/xen/console/console.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/console/console.c Mon Aug 14 15:21:30 2006 -0400 @@ -188,7 +188,7 @@ static int __init xen_console_init(void) if (!is_running_on_xen()) return __RETCODE; - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (is_initial_xendomain()) { if (xc_mode == XC_DEFAULT) xc_mode = XC_SERIAL; kcons_info.write = kcons_write_dom0; @@ -247,7 +247,7 @@ void xencons_force_flush(void) int sz; /* Emergency console is synchronous, so there's nothing to flush. */ - if (xen_start_info->flags & SIF_INITDOMAIN) + if (is_initial_xendomain()) return; /* Spin until console data is flushed through to the daemon. */ @@ -318,7 +318,7 @@ static void __xencons_tx_flush(void) int sent, sz, work_done = 0; if (x_char) { - if (xen_start_info->flags & SIF_INITDOMAIN) + if (is_initial_xendomain()) kcons_write_dom0(NULL, &x_char, 1); else while (x_char) @@ -332,7 +332,7 @@ static void __xencons_tx_flush(void) sz = wp - wc; if (sz > (wbuf_size - WBUF_MASK(wc))) sz = wbuf_size - WBUF_MASK(wc); - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (is_initial_xendomain()) { kcons_write_dom0(NULL, &wbuf[WBUF_MASK(wc)], sz); wc += sz; } else { @@ -622,7 +622,7 @@ static int __init xencons_init(void) return rc; } - if (xen_start_info->flags & SIF_INITDOMAIN) { + if (is_initial_xendomain()) { xencons_priv_irq = bind_virq_to_irqhandler( VIRQ_CONSOLE, 0, diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c --- a/linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/core/cpu_hotplug.c Mon Aug 14 15:21:30 2006 -0400 @@ -92,7 +92,7 @@ static int setup_cpu_watcher(struct noti .flags = XBWF_new_thread }; (void)register_xenbus_watch(&cpu_watch); - if (!(xen_start_info->flags & SIF_INITDOMAIN)) { + if (!is_initial_xendomain()) { for_each_cpu(i) vcpu_hotplug(i); printk(KERN_INFO "Brought up %ld CPUs\n", diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/core/evtchn.c --- a/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/core/evtchn.c Mon Aug 14 15:21:30 2006 -0400 @@ -840,8 +840,7 @@ void __init xen_init_IRQ(void) #ifdef RTC_IRQ /* If not domain 0, force our RTC driver to fail its probe. */ - if ((i == RTC_IRQ) && - !(xen_start_info->flags & SIF_INITDOMAIN)) + if ((i == RTC_IRQ) && !is_initial_xendomain()) continue; #endif diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/core/skbuff.c --- a/linux-2.6-xen-sparse/drivers/xen/core/skbuff.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/core/skbuff.c Mon Aug 14 15:21:30 2006 -0400 @@ -121,8 +121,7 @@ static int __init skbuff_init(void) for (order = 0; order <= MAX_SKBUFF_ORDER; order++) { size = PAGE_SIZE << order; sprintf(name[order], "xen-skb-%lu", size); - if (is_running_on_xen() && - (xen_start_info->flags & SIF_PRIVILEGED)) + if (is_running_on_xen() && is_initial_xendomain()) skbuff_order_cachep[order] = kmem_cache_create( name[order], size, size, 0, skbuff_ctor, skbuff_dtor); diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/core/smpboot.c --- a/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/core/smpboot.c Mon Aug 14 15:21:30 2006 -0400 @@ -255,7 +255,14 @@ void __init smp_prepare_cpus(unsigned in xen_smp_intr_init(0); - for_each_cpu_mask (cpu, cpu_possible_map) { + /* Restrict the possible_map according to max_cpus. */ + while ((num_possible_cpus() > 1) && (num_possible_cpus() > max_cpus)) { + for (cpu = NR_CPUS-1; !cpu_isset(cpu, cpu_possible_map); cpu--) + continue; + cpu_clear(cpu, cpu_possible_map); + } + + for_each_cpu (cpu) { if (cpu == 0) continue; @@ -266,7 +273,8 @@ void __init smp_prepare_cpus(unsigned in #endif gdt_descr->address = get_zeroed_page(GFP_KERNEL); if (unlikely(!gdt_descr->address)) { - printk(KERN_CRIT "CPU%d failed to allocate GDT\n", cpu); + printk(KERN_CRIT "CPU%d failed to allocate GDT\n", + cpu); continue; } gdt_descr->size = GDT_SIZE; @@ -294,7 +302,7 @@ void __init smp_prepare_cpus(unsigned in irq_ctx_init(cpu); #ifdef CONFIG_HOTPLUG_CPU - if (xen_start_info->flags & SIF_INITDOMAIN) + if (is_initial_xendomain()) cpu_set(cpu, cpu_present_map); #else cpu_set(cpu, cpu_present_map); @@ -304,12 +312,6 @@ void __init smp_prepare_cpus(unsigned in } init_xenbus_allowed_cpumask(); - - /* Currently, Xen gives no dynamic NUMA/HT info. */ - for (cpu = 1; cpu < NR_CPUS; cpu++) { - cpu_sibling_map[cpu] = cpumask_of_cpu(cpu); - cpu_core_map[cpu] = cpumask_of_cpu(cpu); - } #ifdef CONFIG_X86_IO_APIC /* diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/netback/loopback.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/loopback.c Mon Aug 14 15:21:30 2006 -0400 @@ -218,7 +218,7 @@ static int __init make_loopback(int i) return err; } -static void __init clean_loopback(int i) +static void __exit clean_loopback(int i) { struct net_device *dev1, *dev2; char dev_name[IFNAMSIZ]; diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/netback/netback.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Mon Aug 14 15:21:30 2006 -0400 @@ -68,10 +68,6 @@ static struct timer_list net_timer; #define MAX_PENDING_REQS 256 static struct sk_buff_head rx_queue; -static multicall_entry_t rx_mcl[NET_RX_RING_SIZE+1]; -static mmu_update_t rx_mmu[NET_RX_RING_SIZE]; -static gnttab_transfer_t grant_rx_op[NET_RX_RING_SIZE]; -static unsigned char rx_notify[NR_IRQS]; static unsigned long mmap_vstart; #define MMAP_VADDR(_req) (mmap_vstart + ((_req) * PAGE_SIZE)) @@ -314,11 +310,23 @@ int xen_network_done(void) } #endif -static u16 netbk_gop_frag(netif_t *netif, struct page *page, int count, int i) -{ - multicall_entry_t *mcl = rx_mcl + count; - mmu_update_t *mmu = rx_mmu + count; - gnttab_transfer_t *gop = grant_rx_op + count; +struct netrx_pending_operations { + unsigned trans_prod, trans_cons; + unsigned mmu_prod, mmu_cons; + unsigned mcl_prod, mcl_cons; + unsigned meta_prod, meta_cons; + mmu_update_t *mmu; + gnttab_transfer_t *trans; + multicall_entry_t *mcl; + struct netbk_rx_meta *meta; +}; + +static u16 netbk_gop_frag(netif_t *netif, struct page *page, + int i, struct netrx_pending_operations *npo) +{ + mmu_update_t *mmu; + gnttab_transfer_t *gop; + multicall_entry_t *mcl; netif_rx_request_t *req; unsigned long old_mfn, new_mfn; @@ -334,46 +342,53 @@ static u16 netbk_gop_frag(netif_t *netif */ set_phys_to_machine(page_to_pfn(page), new_mfn); + mcl = npo->mcl + npo->mcl_prod++; MULTI_update_va_mapping(mcl, (unsigned long)page_address(page), pfn_pte_ma(new_mfn, PAGE_KERNEL), 0); + mmu = npo->mmu + npo->mmu_prod++; mmu->ptr = ((maddr_t)new_mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; mmu->val = page_to_pfn(page); } req = RING_GET_REQUEST(&netif->rx, netif->rx.req_cons + i); + gop = npo->trans + npo->trans_prod++; gop->mfn = old_mfn; gop->domid = netif->domid; gop->ref = req->gref; return req->id; } -static void netbk_gop_skb(struct sk_buff *skb, struct netbk_rx_meta *meta, - int count) +static void netbk_gop_skb(struct sk_buff *skb, + struct netrx_pending_operations *npo) { netif_t *netif = netdev_priv(skb->dev); int nr_frags = skb_shinfo(skb)->nr_frags; int i; int extra; - - meta[count].frag.page_offset = skb_shinfo(skb)->gso_type; - meta[count].frag.size = skb_shinfo(skb)->gso_size; - extra = !!meta[count].frag.size + 1; + struct netbk_rx_meta *head_meta, *meta; + + head_meta = npo->meta + npo->meta_prod++; + head_meta->frag.page_offset = skb_shinfo(skb)->gso_type; + head_meta->frag.size = skb_shinfo(skb)->gso_size; + extra = !!head_meta->frag.size + 1; for (i = 0; i < nr_frags; i++) { - meta[++count].frag = skb_shinfo(skb)->frags[i]; - meta[count].id = netbk_gop_frag(netif, meta[count].frag.page, - count, i + extra); + meta = npo->meta + npo->meta_prod++; + meta->frag = skb_shinfo(skb)->frags[i]; + meta->id = netbk_gop_frag(netif, meta->frag.page, + i + extra, npo); } /* * This must occur at the end to ensure that we don't trash * skb_shinfo until we're done. */ - meta[count - nr_frags].id = netbk_gop_frag(netif, - virt_to_page(skb->data), - count - nr_frags, 0); + head_meta->id = netbk_gop_frag(netif, + virt_to_page(skb->data), + 0, + npo); netif->rx.req_cons += nr_frags + extra; } @@ -385,22 +400,28 @@ static inline void netbk_free_pages(int put_page(meta[i].frag.page); } -static int netbk_check_gop(int nr_frags, domid_t domid, int count) -{ - multicall_entry_t *mcl = rx_mcl + count; - gnttab_transfer_t *gop = grant_rx_op + count; +/* This is a twin to netbk_gop_skb. Assume that netbk_gop_skb was + used to set up the operations on the top of + netrx_pending_operations, which have since been done. Check that + they didn't give any errors and advance over them. */ +static int netbk_check_gop(int nr_frags, domid_t domid, int count, + struct netrx_pending_operations *npo) +{ + multicall_entry_t *mcl; + gnttab_transfer_t *gop; int status = NETIF_RSP_OKAY; int i; for (i = 0; i <= nr_frags; i++) { if (!xen_feature(XENFEAT_auto_translated_physmap)) { + mcl = npo->mcl + npo->mcl_cons++; /* The update_va_mapping() must not fail. */ BUG_ON(mcl->result != 0); - mcl++; - } - + } + + gop = npo->trans + npo->trans_cons++; /* Check the reassignment error code. */ - if (gop->status != 0) { + if (gop->status != 0) { DPRINTK("Bad status %d from grant transfer to DOM%u\n", gop->status, domid); /* @@ -408,9 +429,8 @@ static int netbk_check_gop(int nr_frags, * but that should be a fatal error anyway. */ BUG_ON(gop->status == GNTST_bad_page); - status = NETIF_RSP_ERROR; - } - gop++; + status = NETIF_RSP_ERROR; + } } return status; @@ -449,8 +469,18 @@ static void net_rx_action(unsigned long * Putting hundreds of bytes on the stack is considered rude. * Static works because a tasklet can only be on one CPU at any time. */ + static multicall_entry_t rx_mcl[NET_RX_RING_SIZE+3]; + static mmu_update_t rx_mmu[NET_RX_RING_SIZE]; + static gnttab_transfer_t grant_rx_op[NET_RX_RING_SIZE]; + static unsigned char rx_notify[NR_IRQS]; static u16 notify_list[NET_RX_RING_SIZE]; static struct netbk_rx_meta meta[NET_RX_RING_SIZE]; + + struct netrx_pending_operations npo = { + mmu: rx_mmu, + trans: grant_rx_op, + mcl: rx_mcl, + meta: meta}; skb_queue_head_init(&rxq); @@ -471,7 +501,7 @@ static void net_rx_action(unsigned long break; } - netbk_gop_skb(skb, meta, count); + netbk_gop_skb(skb, &npo); count += nr_frags + 1; @@ -486,8 +516,11 @@ static void net_rx_action(unsigned long return; if (!xen_feature(XENFEAT_auto_translated_physmap)) { - mcl = rx_mcl + count; - + BUG_ON(npo.mcl_prod == 0); + + mcl = npo.mcl + npo.mcl_prod++; + + BUG_ON(mcl[-1].op != __HYPERVISOR_update_va_mapping); mcl[-1].args[MULTI_UVMFLAGS_INDEX] = UVMF_TLB_FLUSH|UVMF_ALL; mcl->op = __HYPERVISOR_mmu_update; @@ -495,13 +528,17 @@ static void net_rx_action(unsigned long mcl->args[1] = count; mcl->args[2] = 0; mcl->args[3] = DOMID_SELF; - - ret = HYPERVISOR_multicall(rx_mcl, count + 1); - BUG_ON(ret != 0); - } - - ret = HYPERVISOR_grant_table_op(GNTTABOP_transfer, grant_rx_op, count); + } + + mcl = npo.mcl + npo.mcl_prod++; + mcl->op = __HYPERVISOR_grant_table_op; + mcl->args[0] = GNTTABOP_transfer; + mcl->args[1] = (unsigned long)grant_rx_op; + mcl->args[2] = npo.trans_prod; + + ret = HYPERVISOR_multicall(npo.mcl, npo.mcl_prod); BUG_ON(ret != 0); + BUG_ON(mcl->result != 0); count = 0; while ((skb = __skb_dequeue(&rxq)) != NULL) { @@ -515,10 +552,11 @@ static void net_rx_action(unsigned long netif->stats.tx_bytes += skb->len; netif->stats.tx_packets++; - netbk_free_pages(nr_frags, meta + count + 1); - status = netbk_check_gop(nr_frags, netif->domid, count); - - id = meta[count].id; + netbk_free_pages(nr_frags, meta + npo.meta_cons + 1); + status = netbk_check_gop(nr_frags, netif->domid, count, + &npo); + + id = meta[npo.meta_cons].id; flags = nr_frags ? NETRXF_more_data : 0; if (skb->ip_summed == CHECKSUM_HW) /* local packet? */ @@ -532,7 +570,7 @@ static void net_rx_action(unsigned long extra = NULL; - if (meta[count].frag.size) { + if (meta[npo.meta_cons].frag.size) { struct netif_extra_info *gso = (struct netif_extra_info *) RING_GET_RESPONSE(&netif->rx, @@ -543,7 +581,7 @@ static void net_rx_action(unsigned long else resp->flags |= NETRXF_extra_info; - gso->u.gso.size = meta[count].frag.size; + gso->u.gso.size = meta[npo.meta_cons].frag.size; gso->u.gso.type = XEN_NETIF_GSO_TYPE_TCPV4; gso->u.gso.pad = 0; gso->u.gso.features = 0; @@ -553,7 +591,8 @@ static void net_rx_action(unsigned long extra = gso; } - netbk_add_frag_responses(netif, status, meta + count + 1, + netbk_add_frag_responses(netif, status, + meta + npo.meta_cons + 1, nr_frags); RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->rx, ret); @@ -569,7 +608,8 @@ static void net_rx_action(unsigned long netif_put(netif); dev_kfree_skb(skb); - count += nr_frags + 1; + + npo.meta_cons += nr_frags + 1; } while (notify_nr != 0) { diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Mon Aug 14 15:21:30 2006 -0400 @@ -1818,7 +1818,7 @@ static int __init netif_init(void) if (!is_running_on_xen()) return -ENODEV; - if (xen_start_info->flags & SIF_INITDOMAIN) + if (is_initial_xendomain()) return 0; IPRINTK("Initialising virtual ethernet driver.\n"); diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c --- a/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/privcmd/privcmd.c Mon Aug 14 15:21:30 2006 -0400 @@ -246,7 +246,7 @@ static int capabilities_read(char *page, int len = 0; *page = 0; - if (xen_start_info->flags & SIF_INITDOMAIN) + if (is_initial_xendomain()) len = sprintf( page, "control_d\n" ); *eof = 1; diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.c Mon Aug 14 15:21:30 2006 -0400 @@ -47,11 +47,6 @@ static DECLARE_WORK(probe_work, xenbus_p DECLARE_WAIT_QUEUE_HEAD(xb_waitq); -static inline struct xenstore_domain_interface *xenstore_domain_interface(void) -{ - return mfn_to_virt(xen_start_info->store_mfn); -} - static irqreturn_t wake_waiting(int irq, void *unused, struct pt_regs *regs) { if (unlikely(xenstored_ready == 0)) { @@ -90,7 +85,7 @@ static const void *get_input_chunk(XENST int xb_write(const void *data, unsigned len) { - struct xenstore_domain_interface *intf = xenstore_domain_interface(); + struct xenstore_domain_interface *intf = xen_store_interface; XENSTORE_RING_IDX cons, prod; int rc; @@ -129,7 +124,7 @@ int xb_write(const void *data, unsigned intf->req_prod += avail; /* This implies mb() before other side sees interrupt. */ - notify_remote_via_evtchn(xen_start_info->store_evtchn); + notify_remote_via_evtchn(xen_store_evtchn); } return 0; @@ -137,7 +132,7 @@ int xb_write(const void *data, unsigned int xb_read(void *data, unsigned len) { - struct xenstore_domain_interface *intf = xenstore_domain_interface(); + struct xenstore_domain_interface *intf = xen_store_interface; XENSTORE_RING_IDX cons, prod; int rc; @@ -180,7 +175,7 @@ int xb_read(void *data, unsigned len) pr_debug("Finished read of %i bytes (%i to go)\n", avail, len); /* Implies mb(): they will see new header. */ - notify_remote_via_evtchn(xen_start_info->store_evtchn); + notify_remote_via_evtchn(xen_store_evtchn); } return 0; @@ -195,7 +190,7 @@ int xb_init_comms(void) unbind_from_irqhandler(xenbus_irq, &xb_waitq); err = bind_evtchn_to_irqhandler( - xen_start_info->store_evtchn, wake_waiting, + xen_store_evtchn, wake_waiting, 0, "xenbus", &xb_waitq); if (err <= 0) { printk(KERN_ERR "XENBUS request irq failed %i\n", err); diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_comms.h Mon Aug 14 15:21:30 2006 -0400 @@ -39,5 +39,7 @@ int xb_read(void *data, unsigned len); int xb_read(void *data, unsigned len); int xs_input_avail(void); extern wait_queue_head_t xb_waitq; +extern struct xenstore_domain_interface *xen_store_interface; +extern int xen_store_evtchn; #endif /* _XENBUS_COMMS_H */ diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Mon Aug 14 15:21:30 2006 -0400 @@ -285,7 +285,7 @@ static int xenbus_dev_open(struct inode { struct xenbus_dev_data *u; - if (xen_start_info->store_evtchn == 0) + if (xen_store_evtchn == 0) return -ENOENT; nonseekable_open(inode, filp); diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_probe.c Mon Aug 14 15:21:30 2006 -0400 @@ -54,6 +54,10 @@ #include "xenbus_comms.h" +int xen_store_evtchn; +struct xenstore_domain_interface *xen_store_interface; +static unsigned long xen_store_mfn; + extern struct mutex xenwatch_mutex; static struct notifier_block *xenstore_chain; @@ -928,8 +932,7 @@ static int xsd_kva_mmap(struct file *fil if ((size > PAGE_SIZE) || (vma->vm_pgoff != 0)) return -EINVAL; - if (remap_pfn_range(vma, vma->vm_start, - mfn_to_pfn(xen_start_info->store_mfn), + if (remap_pfn_range(vma, vma->vm_start, mfn_to_pfn(xen_store_mfn), size, vma->vm_page_prot)) return -EAGAIN; @@ -941,7 +944,7 @@ static int xsd_kva_read(char *page, char { int len; - len = sprintf(page, "0x%p", mfn_to_virt(xen_start_info->store_mfn)); + len = sprintf(page, "0x%p", xen_store_interface); *eof = 1; return len; } @@ -951,12 +954,11 @@ static int xsd_port_read(char *page, cha { int len; - len = sprintf(page, "%d", xen_start_info->store_evtchn); + len = sprintf(page, "%d", xen_store_evtchn); *eof = 1; return len; } #endif - static int __init xenbus_probe_init(void) { @@ -985,7 +987,7 @@ static int __init xenbus_probe_init(void if (!page) return -ENOMEM; - xen_start_info->store_mfn = + xen_store_mfn = xen_start_info->store_mfn = pfn_to_mfn(virt_to_phys((void *)page) >> PAGE_SHIFT); @@ -998,7 +1000,8 @@ static int __init xenbus_probe_init(void if (err == -ENOSYS) goto err; BUG_ON(err); - xen_start_info->store_evtchn = alloc_unbound.port; + xen_store_evtchn = xen_start_info->store_evtchn = + alloc_unbound.port; #ifdef CONFIG_PROC_FS /* And finally publish the above info in /proc/xen */ @@ -1014,8 +1017,13 @@ static int __init xenbus_probe_init(void if (xsd_port_intf) xsd_port_intf->read_proc = xsd_port_read; #endif - } else + } else { xenstored_ready = 1; + xen_store_evtchn = xen_start_info->store_evtchn; + xen_store_mfn = xen_start_info->store_mfn; + } + + xen_store_interface = mfn_to_virt(xen_store_mfn); /* Initialize the interface to xenstore. */ err = xs_init(); diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypercall.h Mon Aug 14 15:21:30 2006 -0400 @@ -354,6 +354,13 @@ HYPERVISOR_nmi_op( return _hypercall2(int, nmi_op, op, arg); } +static inline unsigned long +HYPERVISOR_hvm_op( + int op, void *arg) +{ + return _hypercall2(unsigned long, hvm_op, op, arg); +} + static inline int HYPERVISOR_callback_op( int cmd, void *arg) diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/hypervisor.h Mon Aug 14 15:21:30 2006 -0400 @@ -58,6 +58,7 @@ extern shared_info_t *HYPERVISOR_shared_ /* arch/xen/i386/kernel/setup.c */ extern start_info_t *xen_start_info; +#define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN) /* arch/xen/kernel/evtchn.c */ /* Force a proper event-channel callback from Xen. */ diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/page.h Mon Aug 14 15:21:30 2006 -0400 @@ -60,123 +60,6 @@ #define clear_user_page(page, vaddr, pg) clear_page(page) #define copy_user_page(to, from, vaddr, pg) copy_page(to, from) -/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ -#define INVALID_P2M_ENTRY (~0UL) -#define FOREIGN_FRAME_BIT (1UL<<31) -#define FOREIGN_FRAME(m) ((m) | FOREIGN_FRAME_BIT) - -extern unsigned long *phys_to_machine_mapping; - -#undef machine_to_phys_mapping -extern unsigned long *machine_to_phys_mapping; -extern unsigned int machine_to_phys_order; - -static inline unsigned long pfn_to_mfn(unsigned long pfn) -{ - if (xen_feature(XENFEAT_auto_translated_physmap)) - return pfn; - return phys_to_machine_mapping[(unsigned int)(pfn)] & - ~FOREIGN_FRAME_BIT; -} - -static inline int phys_to_machine_mapping_valid(unsigned long pfn) -{ - if (xen_feature(XENFEAT_auto_translated_physmap)) - return 1; - return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY); -} - -static inline unsigned long mfn_to_pfn(unsigned long mfn) -{ - extern unsigned long max_mapnr; - unsigned long pfn; - - if (xen_feature(XENFEAT_auto_translated_physmap)) - return mfn; - - if (unlikely((mfn >> machine_to_phys_order) != 0)) - return max_mapnr; - - /* The array access can fail (e.g., device space beyond end of RAM). */ - asm ( - "1: movl %1,%0\n" - "2:\n" - ".section .fixup,\"ax\"\n" - "3: movl %2,%0\n" - " jmp 2b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 4\n" - " .long 1b,3b\n" - ".previous" - : "=r" (pfn) - : "m" (machine_to_phys_mapping[mfn]), "m" (max_mapnr) ); - - return pfn; -} - -/* - * We detect special mappings in one of two ways: - * 1. If the MFN is an I/O page then Xen will set the m2p entry - * to be outside our maximum possible pseudophys range. - * 2. If the MFN belongs to a different domain then we will certainly - * not have MFN in our p2m table. Conversely, if the page is ours, - * then we'll have p2m(m2p(MFN))==MFN. - * If we detect a special mapping then it doesn't have a 'struct page'. - * We force !pfn_valid() by returning an out-of-range pointer. - * - * NB. These checks require that, for any MFN that is not in our reservation, - * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if - * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN. - * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety. - * - * NB2. When deliberately mapping foreign pages into the p2m table, you *must* - * use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we - * require. In all the cases we care about, the FOREIGN_FRAME bit is - * masked (e.g., pfn_to_mfn()) so behaviour there is correct. - */ -static inline unsigned long mfn_to_local_pfn(unsigned long mfn) -{ - extern unsigned long max_mapnr; - unsigned long pfn = mfn_to_pfn(mfn); - if ((pfn < max_mapnr) - && !xen_feature(XENFEAT_auto_translated_physmap) - && (phys_to_machine_mapping[pfn] != mfn)) - return max_mapnr; /* force !pfn_valid() */ - return pfn; -} - -static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn) -{ - if (xen_feature(XENFEAT_auto_translated_physmap)) { - BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY); - return; - } - phys_to_machine_mapping[pfn] = mfn; -} - -/* Definitions for machine and pseudophysical addresses. */ -#ifdef CONFIG_X86_PAE -typedef unsigned long long paddr_t; -typedef unsigned long long maddr_t; -#else -typedef unsigned long paddr_t; -typedef unsigned long maddr_t; -#endif - -static inline maddr_t phys_to_machine(paddr_t phys) -{ - maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT); - machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK); - return machine; -} -static inline paddr_t machine_to_phys(maddr_t machine) -{ - paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT); - phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK); - return phys; -} - /* * These are used to make use of C type-checking.. */ @@ -187,6 +70,8 @@ typedef struct { unsigned long long pmd; typedef struct { unsigned long long pmd; } pmd_t; typedef struct { unsigned long long pgd; } pgd_t; typedef struct { unsigned long long pgprot; } pgprot_t; +#define pgprot_val(x) ((x).pgprot) +#include <asm/maddr.h> #define __pte(x) ({ unsigned long long _x = (x); \ if (_x & 1) _x = phys_to_machine(_x); \ ((pte_t) {(unsigned long)(_x), (unsigned long)(_x>>32)}); }) @@ -227,6 +112,8 @@ typedef struct { unsigned long pte_low; typedef struct { unsigned long pte_low; } pte_t; typedef struct { unsigned long pgd; } pgd_t; typedef struct { unsigned long pgprot; } pgprot_t; +#define pgprot_val(x) ((x).pgprot) +#include <asm/maddr.h> #define boot_pte_t pte_t /* or would you rather have a typedef */ #define pte_val(x) (((x).pte_low & 1) ? machine_to_phys((x).pte_low) : \ (x).pte_low) @@ -252,9 +139,6 @@ static inline unsigned long pgd_val(pgd_ #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA #endif -#define pgprot_val(x) ((x).pgprot) - -#define __pte_ma(x) ((pte_t) { (x) } ) #define __pgprot(x) ((pgprot_t) { (x) } ) #endif /* !__ASSEMBLY__ */ @@ -323,11 +207,6 @@ extern int page_is_ram(unsigned long pag ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) -/* VIRT <-> MACHINE conversion */ -#define virt_to_machine(v) (phys_to_machine(__pa(v))) -#define virt_to_mfn(v) (pfn_to_mfn(__pa(v) >> PAGE_SHIFT)) -#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) - #define __HAVE_ARCH_GATE_AREA 1 #endif /* __KERNEL__ */ diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-2level.h Mon Aug 14 15:21:30 2006 -0400 @@ -45,7 +45,6 @@ #define pte_none(x) (!(x).pte_low) #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) -#define pfn_pte_ma(pfn, prot) __pte_ma(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) #define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) /* diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h --- a/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/pgtable-3level.h Mon Aug 14 15:21:30 2006 -0400 @@ -151,18 +151,6 @@ static inline int pte_none(pte_t pte) extern unsigned long long __supported_pte_mask; -static inline pte_t pfn_pte_ma(unsigned long page_nr, pgprot_t pgprot) -{ - pte_t pte; - - pte.pte_high = (page_nr >> (32 - PAGE_SHIFT)) | \ - (pgprot_val(pgprot) >> 32); - pte.pte_high &= (__supported_pte_mask >> 32); - pte.pte_low = ((page_nr << PAGE_SHIFT) | pgprot_val(pgprot)) & \ - __supported_pte_mask; - return pte; -} - static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot) { return pfn_pte_ma(pfn_to_mfn(page_nr), pgprot); diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h --- a/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/include/asm-ia64/hypervisor.h Mon Aug 14 15:21:30 2006 -0400 @@ -58,6 +58,8 @@ extern int running_on_xen; extern shared_info_t *HYPERVISOR_shared_info; extern start_info_t *xen_start_info; + +#define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN) void force_evtchn_callback(void); diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h --- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/hypercall.h Mon Aug 14 15:21:30 2006 -0400 @@ -355,6 +355,13 @@ HYPERVISOR_nmi_op( return _hypercall2(int, nmi_op, op, arg); } +static inline unsigned long +HYPERVISOR_hvm_op( + int op, void *arg) +{ + return _hypercall2(unsigned long, hvm_op, op, arg); +} + static inline int HYPERVISOR_callback_op( int cmd, void *arg) diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h --- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/page.h Mon Aug 14 15:21:30 2006 -0400 @@ -7,7 +7,6 @@ #include <linux/kernel.h> #include <linux/types.h> #include <asm/bug.h> -#include <xen/features.h> #endif #include <xen/interface/xen.h> #include <xen/foreign_page.h> @@ -69,6 +68,8 @@ extern unsigned long end_pfn; +#include <asm/maddr.h> + void clear_page(void *); void copy_page(void *, void *); @@ -77,118 +78,6 @@ void copy_page(void *, void *); #define alloc_zeroed_user_highpage(vma, vaddr) alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO, vma, vaddr) #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE - -/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ -#define INVALID_P2M_ENTRY (~0UL) -#define FOREIGN_FRAME_BIT (1UL<<63) -#define FOREIGN_FRAME(m) ((m) | FOREIGN_FRAME_BIT) - -extern unsigned long *phys_to_machine_mapping; - -#undef machine_to_phys_mapping -extern unsigned long *machine_to_phys_mapping; -extern unsigned int machine_to_phys_order; - -static inline unsigned long pfn_to_mfn(unsigned long pfn) -{ - if (xen_feature(XENFEAT_auto_translated_physmap)) - return pfn; - return phys_to_machine_mapping[(unsigned int)(pfn)] & - ~FOREIGN_FRAME_BIT; -} - -static inline int phys_to_machine_mapping_valid(unsigned long pfn) -{ - if (xen_feature(XENFEAT_auto_translated_physmap)) - return 1; - return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY); -} - -static inline unsigned long mfn_to_pfn(unsigned long mfn) -{ - unsigned long pfn; - - if (xen_feature(XENFEAT_auto_translated_physmap)) - return mfn; - - if (unlikely((mfn >> machine_to_phys_order) != 0)) - return end_pfn; - - /* The array access can fail (e.g., device space beyond end of RAM). */ - asm ( - "1: movq %1,%0\n" - "2:\n" - ".section .fixup,\"ax\"\n" - "3: movq %2,%0\n" - " jmp 2b\n" - ".previous\n" - ".section __ex_table,\"a\"\n" - " .align 8\n" - " .quad 1b,3b\n" - ".previous" - : "=r" (pfn) - : "m" (machine_to_phys_mapping[mfn]), "m" (end_pfn) ); - - return pfn; -} - -/* - * We detect special mappings in one of two ways: - * 1. If the MFN is an I/O page then Xen will set the m2p entry - * to be outside our maximum possible pseudophys range. - * 2. If the MFN belongs to a different domain then we will certainly - * not have MFN in our p2m table. Conversely, if the page is ours, - * then we'll have p2m(m2p(MFN))==MFN. - * If we detect a special mapping then it doesn't have a 'struct page'. - * We force !pfn_valid() by returning an out-of-range pointer. - * - * NB. These checks require that, for any MFN that is not in our reservation, - * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if - * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN. - * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety. - * - * NB2. When deliberately mapping foreign pages into the p2m table, you *must* - * use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we - * require. In all the cases we care about, the FOREIGN_FRAME bit is - * masked (e.g., pfn_to_mfn()) so behaviour there is correct. - */ -static inline unsigned long mfn_to_local_pfn(unsigned long mfn) -{ - unsigned long pfn = mfn_to_pfn(mfn); - if ((pfn < end_pfn) - && !xen_feature(XENFEAT_auto_translated_physmap) - && (phys_to_machine_mapping[pfn] != mfn)) - return end_pfn; /* force !pfn_valid() */ - return pfn; -} - - -static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn) -{ - if (xen_feature(XENFEAT_auto_translated_physmap)) { - BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY); - return; - } - phys_to_machine_mapping[pfn] = mfn; -} - -/* Definitions for machine and pseudophysical addresses. */ -typedef unsigned long paddr_t; -typedef unsigned long maddr_t; - -static inline maddr_t phys_to_machine(paddr_t phys) -{ - maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT); - machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK); - return machine; -} - -static inline paddr_t machine_to_phys(maddr_t machine) -{ - paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT); - phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK); - return phys; -} /* * These are used to make use of C type-checking.. @@ -227,8 +116,6 @@ static inline unsigned long pgd_val(pgd_ } #define pgprot_val(x) ((x).pgprot) - -#define __pte_ma(x) ((pte_t) { (x) } ) static inline pte_t __pte(unsigned long x) { @@ -310,11 +197,6 @@ static inline pgd_t __pgd(unsigned long #define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) -/* VIRT <-> MACHINE conversion */ -#define virt_to_machine(v) (phys_to_machine(__pa(v))) -#define virt_to_mfn(v) (pfn_to_mfn(__pa(v) >> PAGE_SHIFT)) -#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) - #define VM_DATA_DEFAULT_FLAGS \ (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \ VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h --- a/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/pgtable.h Mon Aug 14 15:21:30 2006 -0400 @@ -312,7 +312,6 @@ static inline pte_t pfn_pte(unsigned lon return pte; } -#define pfn_pte_ma(pfn, prot) __pte_ma((((pfn) << PAGE_SHIFT) | pgprot_val(prot)) & __supported_pte_mask) /* * The following only work if pte_present() is true. * Undefined behaviour if not.. diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/mm/memory.c --- a/linux-2.6-xen-sparse/mm/memory.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/mm/memory.c Mon Aug 14 15:21:30 2006 -0400 @@ -390,7 +390,7 @@ struct page *vm_normal_page(struct vm_ar if (vma->vm_flags & VM_PFNMAP) { unsigned long off = (addr - vma->vm_start) >> PAGE_SHIFT; - if (pfn == vma->vm_pgoff + off) + if ((pfn == vma->vm_pgoff + off) || !pfn_valid(pfn)) return NULL; if (!is_cow_mapping(vma->vm_flags)) return NULL; @@ -405,8 +405,7 @@ struct page *vm_normal_page(struct vm_ar * Remove this test eventually! */ if (unlikely(!pfn_valid(pfn))) { - if (!(vma->vm_flags & VM_RESERVED)) - print_bad_pte(vma, pte, addr); + print_bad_pte(vma, pte, addr); return NULL; } diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/net/core/dev.c --- a/linux-2.6-xen-sparse/net/core/dev.c Mon Aug 14 10:03:58 2006 -0400 +++ b/linux-2.6-xen-sparse/net/core/dev.c Mon Aug 14 15:21:30 2006 -0400 @@ -1093,11 +1093,6 @@ int skb_checksum_help(struct sk_buff *sk goto out_set_summed; if (unlikely(skb_shinfo(skb)->gso_size)) { - static int warned; - - WARN_ON(!warned); - warned = 1; - /* Let GSO fix up the checksum. */ goto out_set_summed; } @@ -1147,11 +1142,6 @@ struct sk_buff *skb_gso_segment(struct s __skb_pull(skb, skb->mac_len); if (unlikely(skb->ip_summed != CHECKSUM_HW)) { - static int warned; - - WARN_ON(!warned); - warned = 1; - if (skb_header_cloned(skb) && (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) return ERR_PTR(err); diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/Makefile --- a/tools/firmware/hvmloader/Makefile Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/firmware/hvmloader/Makefile Mon Aug 14 15:21:30 2006 -0400 @@ -31,8 +31,6 @@ DEFINES =-DDEBUG DEFINES =-DDEBUG XENINC =-I$(XEN_ROOT)/tools/libxc -OBJECTS = hvmloader.o acpi_madt.o - # Disable PIE/SSP if GCC supports them. They can break us. CFLAGS += $(call test-gcc-flag,$(CC),-nopie) CFLAGS += $(call test-gcc-flag,$(CC),-fno-stack-protector) @@ -42,7 +40,7 @@ CFLAGS += $(DEFINES) -I. $(XENINC) -fno CFLAGS += $(DEFINES) -I. $(XENINC) -fno-builtin -O2 -msoft-float LDFLAGS = -m32 -nostdlib -Wl,-N -Wl,-Ttext -Wl,$(LOADADDR) -SRCS = hvmloader.c acpi_madt.c mp_tables.c util.c +SRCS = hvmloader.c acpi_madt.c mp_tables.c util.c smbios.c OBJS = $(patsubst %.c,%.o,$(SRCS)) .PHONY: all @@ -54,7 +52,7 @@ hvmloader: roms.h $(SRCS) $(OBJCOPY) hvmloader.tmp hvmloader rm -f hvmloader.tmp -roms.h: ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin +roms.h: ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin ../acpi/acpi.bin sh ./mkhex rombios ../rombios/BIOS-bochs-latest > roms.h sh ./mkhex vgabios_stdvga ../vgabios/VGABIOS-lgpl-latest.bin >> roms.h sh ./mkhex vgabios_cirrusvga ../vgabios/VGABIOS-lgpl-latest.cirrus.bin >> roms.h @@ -64,5 +62,5 @@ roms.h: ../rombios/BIOS-bochs-latest ../ .PHONY: clean clean: rm -f roms.h acpi.h - rm -f hvmloader hvmloader.tmp hvmloader.o $(OBJECTS) + rm -f hvmloader hvmloader.tmp hvmloader.o $(OBJS) diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/hvmloader.c --- a/tools/firmware/hvmloader/hvmloader.c Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/firmware/hvmloader/hvmloader.c Mon Aug 14 15:21:30 2006 -0400 @@ -25,6 +25,7 @@ #include "../acpi/acpi2_0.h" /* for ACPI_PHYSICAL_ADDRESS */ #include "hypercall.h" #include "util.h" +#include "smbios.h" #include <xen/version.h> #include <xen/hvm/params.h> @@ -116,15 +117,6 @@ check_amd(void) } static void -cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) -{ - __asm__ __volatile__( - "cpuid" - : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) - : "0" (idx) ); -} - -static void wrmsr(uint32_t idx, uint64_t v) { __asm__ __volatile__( @@ -209,6 +201,9 @@ main(void) } } + puts("Writing SMBIOS tables ...\n"); + hvm_write_smbios_tables(); + if (check_amd()) { /* AMD implies this is SVM */ puts("SVM go ...\n"); diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/hypercall.h --- a/tools/firmware/hvmloader/hypercall.h Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/firmware/hvmloader/hypercall.h Mon Aug 14 15:21:30 2006 -0400 @@ -30,6 +30,8 @@ #ifndef __HVMLOADER_HYPERCALL_H__ #define __HVMLOADER_HYPERCALL_H__ + +#include <xen/xen.h> /* * NB. Hypercall address needs to be relative to a linkage symbol for diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/util.c --- a/tools/firmware/hvmloader/util.c Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/firmware/hvmloader/util.c Mon Aug 14 15:21:30 2006 -0400 @@ -20,6 +20,7 @@ #include "../acpi/acpi2_0.h" /* for ACPI_PHYSICAL_ADDRESS */ #include "util.h" +#include <stdint.h> void outw(uint16_t addr, uint16_t val) { @@ -94,3 +95,82 @@ void puts(const char *s) while (*s) outb(0xE9, *s++); } + +char * +strcpy(char *dest, const char *src) +{ + char *p = dest; + while (*src) + *p++ = *src++; + *p = 0; + return dest; +} + +char * +strncpy(char *dest, const char *src, unsigned n) +{ + int i = 0; + char *p = dest; + + /* write non-NUL characters from src into dest until we run + out of room in dest or encounter a NUL in src */ + while (i < n && *src) { + *p++ = *src++; + ++i; + } + + /* pad remaining bytes of dest with NUL bytes */ + while (i < n) { + *p++ = 0; + ++i; + } + + return dest; +} + +unsigned +strlen(const char *s) +{ + int i = 0; + while (*s++) + ++i; + return i; +} + +void * +memset(void *s, int c, unsigned n) +{ + uint8_t b = (uint8_t) c; + uint8_t *p = (uint8_t *)s; + int i; + for (i = 0; i < n; ++i) + *p++ = b; + return s; +} + +int +memcmp(const void *s1, const void *s2, unsigned n) +{ + unsigned i; + uint8_t *p1 = (uint8_t *) s1; + uint8_t *p2 = (uint8_t *) s2; + + for (i = 0; i < n; ++i) { + if (p1[i] < p2[i]) + return -1; + else if (p1[i] > p2[i]) + return 1; + } + + return 0; +} + +void +cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx) +{ + __asm__ __volatile__( + "cpuid" + : "=a" (*eax), "=b" (*ebx), "=c" (*ecx), "=d" (*edx) + : "0" (idx) ); +} + diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/util.h --- a/tools/firmware/hvmloader/util.h Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/firmware/hvmloader/util.h Mon Aug 14 15:21:30 2006 -0400 @@ -8,9 +8,21 @@ void outb(uint16_t addr, uint8_t val); /* I/O input */ uint8_t inb(uint16_t addr); +/* Do cpuid instruction, with operation 'idx' */ +void cpuid(uint32_t idx, uint32_t *eax, uint32_t *ebx, + uint32_t *ecx, uint32_t *edx); + +/* Return number of vcpus. */ +int get_vcpu_nr(void); + /* String and memory functions */ int strcmp(const char *cs, const char *ct); +char *strcpy(char *dest, const char *src); +char *strncpy(char *dest, const char *src, unsigned n); +unsigned strlen(const char *s); +int memcmp(const void *s1, const void *s2, unsigned n); void *memcpy(void *dest, const void *src, unsigned n); +void *memset(void *s, int c, unsigned n); char *itoa(char *a, unsigned int i); /* Debug output */ diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/rombios/rombios.c --- a/tools/firmware/rombios/rombios.c Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/firmware/rombios/rombios.c Mon Aug 14 15:21:30 2006 -0400 @@ -9443,6 +9443,43 @@ rom_scan_increment: mov ds, ax ret +#ifdef HVMASSIST + +; Copy the SMBIOS entry point over from 0x9f000, where hvmloader left it. +; The entry point must be somewhere in 0xf0000-0xfffff on a 16-byte boundary, +; but the tables themeselves can be elsewhere. +smbios_init: + push ax + push cx + push es + push ds + push di + push si + + mov cx, #0x001f ; 0x1f bytes to copy + mov ax, #0xf000 + mov es, ax ; destination segment is 0xf0000 + mov di, smbios_entry_point ; destination offset + mov ax, #0x9f00 + mov ds, ax ; source segment is 0x9f000 + mov si, #0x0000 ; source offset is 0 + cld + rep + movsb + + pop si + pop di + pop ds + pop es + pop cx + pop ax + + ret + +#endif + + + ;; for 'C' strings and other data, insert them here with ;; a the following hack: ;; DATA_SEG_DEFS_HERE @@ -9724,6 +9761,7 @@ post_default_ints: #ifdef HVMASSIST call _copy_e820_table + call smbios_init #endif call rom_scan @@ -10538,6 +10576,13 @@ dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;; 768 bytes dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;; 832 bytes dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;; 896 bytes + +.align 16 +smbios_entry_point: +db 0,0,0,0,0,0,0,0 ; 8 bytes +db 0,0,0,0,0,0,0,0 ; 16 bytes +db 0,0,0,0,0,0,0,0 ; 24 bytes +db 0,0,0,0,0,0,0 ; 31 bytes ASM_END #else // !HVMASSIST diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/vmxassist/vmxassist.ld --- a/tools/firmware/vmxassist/vmxassist.ld Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/firmware/vmxassist/vmxassist.ld Mon Aug 14 15:21:30 2006 -0400 @@ -6,27 +6,27 @@ ENTRY(_start) SECTIONS { + _btext = .; .text TEXTADDR : { - _btext = .; *(.text) *(.rodata) *(.rodata.*) - _etext = .; } + _etext = .; + _bdata = .; .data : { - _bdata = .; *(.data) - _edata = .; } + _edata = .; + _bbss = .; .bss : { - _bbss = .; *(.bss) - _ebss = .; } + _ebss = .; } diff -r 39c113fb84ac -r 10f1113fd489 tools/libxc/xc_evtchn.c --- a/tools/libxc/xc_evtchn.c Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/libxc/xc_evtchn.c Mon Aug 14 15:21:30 2006 -0400 @@ -49,14 +49,3 @@ int xc_evtchn_alloc_unbound(int xc_handl return rc; } - - -int xc_evtchn_status(int xc_handle, - uint32_t dom, - evtchn_port_t port, - xc_evtchn_status_t *status) -{ - status->dom = (domid_t)dom; - status->port = port; - return do_evtchn_op(xc_handle, EVTCHNOP_status, status, sizeof(*status)); -} diff -r 39c113fb84ac -r 10f1113fd489 tools/libxc/xc_hvm_build.c --- a/tools/libxc/xc_hvm_build.c Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/libxc/xc_hvm_build.c Mon Aug 14 15:21:30 2006 -0400 @@ -58,12 +58,12 @@ static void build_e820map(void *e820_pag /* XXX: Doesn't work for > 4GB yet */ e820entry[nr_map].addr = 0x0; - e820entry[nr_map].size = 0x9F800; + e820entry[nr_map].size = 0x9F000; e820entry[nr_map].type = E820_RAM; nr_map++; - e820entry[nr_map].addr = 0x9F800; - e820entry[nr_map].size = 0x800; + e820entry[nr_map].addr = 0x9F000; + e820entry[nr_map].size = 0x1000; e820entry[nr_map].type = E820_RESERVED; nr_map++; diff -r 39c113fb84ac -r 10f1113fd489 tools/libxc/xenctrl.h --- a/tools/libxc/xenctrl.h Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/libxc/xenctrl.h Mon Aug 14 15:21:30 2006 -0400 @@ -367,8 +367,6 @@ int xc_sched_credit_domain_get(int xc_ha uint32_t domid, struct sched_credit_adjdom *sdom); -typedef evtchn_status_t xc_evtchn_status_t; - /* * EVENT CHANNEL FUNCTIONS */ @@ -386,11 +384,6 @@ int xc_evtchn_alloc_unbound(int xc_handl int xc_evtchn_alloc_unbound(int xc_handle, uint32_t dom, uint32_t remote_dom); - -int xc_evtchn_status(int xc_handle, - uint32_t dom, /* may be DOMID_SELF */ - evtchn_port_t port, - xc_evtchn_status_t *status); int xc_physdev_pci_access_modify(int xc_handle, uint32_t domid, diff -r 39c113fb84ac -r 10f1113fd489 tools/python/xen/lowlevel/xc/xc.c --- a/tools/python/xen/lowlevel/xc/xc.c Mon Aug 14 10:03:58 2006 -0400 +++ b/tools/python/xen/lowlevel/xc/xc.c Mon Aug 14 15:21:30 2006 -0400 @@ -484,60 +484,6 @@ static PyObject *pyxc_evtchn_alloc_unbou return PyInt_FromLong(port); } -static PyObject *pyxc_evtchn_status(XcObject *self, - PyObject *args, - PyObject *kwds) -{ - PyObject *dict; - - uint32_t dom = DOMID_SELF; - int port, ret; - xc_evtchn_status_t status; - - static char *kwd_list[] = { "port", "dom", NULL }; - - if ( !PyArg_ParseTupleAndKeywords(args, kwds, "i|i", kwd_list, - &port, &dom) ) - return NULL; - - ret = xc_evtchn_status(self->xc_handle, dom, port, &status); - if ( ret != 0 ) - return PyErr_SetFromErrno(xc_error); - - switch ( status.status ) - { - case EVTCHNSTAT_closed: - dict = Py_BuildValue("{s:s}", - "status", "closed"); - break; - case EVTCHNSTAT_unbound: - dict = Py_BuildValue("{s:s}", - "status", "unbound"); - break; - case EVTCHNSTAT_interdomain: - dict = Py_BuildValue("{s:s,s:i,s:i}", - "status", "interdomain", - "dom", status.u.interdomain.dom, - "port", status.u.interdomain.port); - break; - case EVTCHNSTAT_pirq: - dict = Py_BuildValue("{s:s,s:i}", - "status", "pirq", - "irq", status.u.pirq); - break; - case EVTCHNSTAT_virq: - dict = Py_BuildValue("{s:s,s:i}", - "status", "virq", - "irq", status.u.virq); - break; - default: - dict = Py_BuildValue("{}"); - break; - } - - return dict; -} - static PyObject *pyxc_physdev_pci_access_modify(XcObject *self, PyObject *args, PyObject *kwds) @@ -1140,21 +1086,6 @@ static PyMethodDef pyxc_methods[] = { " dom [int]: Domain whose port space to allocate from.\n" " remote_dom [int]: Remote domain to accept connections from.\n\n" "Returns: [int] Unbound event-channel port.\n" }, - - { "evtchn_status", - (PyCFunction)pyxc_evtchn_status, - METH_VARARGS | METH_KEYWORDS, "\n" - "Query the status of an event channel.\n" - " dom [int, SELF]: Dom-id of one endpoint of the channel.\n" - " port [int]: Port-id of one endpoint of the channel.\n\n" - "Returns: [dict] dictionary is empty on failure.\n" - " status [str]: 'closed', 'unbound', 'interdomain', 'pirq'," - " or 'virq'.\n" - "The following are returned if 'status' is 'interdomain':\n" - " dom [int]: Dom-id of remote endpoint.\n" - " port [int]: Port-id of remote endpoint.\n" - "The following are returned if 'status' is 'pirq' or 'virq':\n" - " irq [int]: IRQ number.\n" }, { "physdev_pci_access_modify", (PyCFunction)pyxc_physdev_pci_access_modify, diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/vmx/mmio.c --- a/xen/arch/ia64/vmx/mmio.c Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/arch/ia64/vmx/mmio.c Mon Aug 14 15:21:30 2006 -0400 @@ -33,7 +33,7 @@ #include <asm/mm.h> #include <asm/vmx.h> #include <public/event_channel.h> -#include <public/arch-ia64.h> +#include <public/xen.h> #include <linux/event.h> #include <xen/domain.h> /* diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/vmx/vlsapic.c --- a/xen/arch/ia64/vmx/vlsapic.c Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/arch/ia64/vmx/vlsapic.c Mon Aug 14 15:21:30 2006 -0400 @@ -21,7 +21,7 @@ */ #include <linux/sched.h> -#include <public/arch-ia64.h> +#include <public/xen.h> #include <asm/ia64_int.h> #include <asm/vcpu.h> #include <asm/regionreg.h> diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/vmx/vmx_init.c --- a/xen/arch/ia64/vmx/vmx_init.c Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/arch/ia64/vmx/vmx_init.c Mon Aug 14 15:21:30 2006 -0400 @@ -41,15 +41,14 @@ #include <asm/vmx_vcpu.h> #include <xen/lib.h> #include <asm/vmmu.h> -#include <public/arch-ia64.h> +#include <public/xen.h> #include <public/hvm/ioreq.h> +#include <public/event_channel.h> #include <asm/vmx_phy_mode.h> #include <asm/processor.h> #include <asm/vmx.h> #include <xen/mm.h> -#include <public/arch-ia64.h> #include <asm/hvm/vioapic.h> -#include <public/event_channel.h> #include <xen/event.h> #include <asm/vlsapic.h> diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/vmx/vmx_vcpu.c --- a/xen/arch/ia64/vmx/vmx_vcpu.c Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/arch/ia64/vmx/vmx_vcpu.c Mon Aug 14 15:21:30 2006 -0400 @@ -24,7 +24,7 @@ */ #include <xen/sched.h> -#include <public/arch-ia64.h> +#include <public/xen.h> #include <asm/ia64_int.h> #include <asm/vmx_vcpu.h> #include <asm/regionreg.h> diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/arch/ia64/xen/domain.c Mon Aug 14 15:21:30 2006 -0400 @@ -35,14 +35,13 @@ #include <asm/pgalloc.h> #include <asm/offsets.h> /* for IA64_THREAD_INFO_SIZE */ #include <asm/vcpu.h> /* for function declarations */ -#include <public/arch-ia64.h> +#include <public/xen.h> #include <xen/domain.h> #include <asm/vmx.h> #include <asm/vmx_vcpu.h> #include <asm/vmx_vpd.h> #include <asm/vmx_phy_mode.h> #include <asm/vhpt.h> -#include <public/arch-ia64.h> #include <asm/tlbflush.h> #include <asm/regionreg.h> #include <asm/dom_fw.h> diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/xen/hyperprivop.S --- a/xen/arch/ia64/xen/hyperprivop.S Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/arch/ia64/xen/hyperprivop.S Mon Aug 14 15:21:30 2006 -0400 @@ -14,7 +14,7 @@ #include <asm/system.h> #include <asm/debugger.h> #include <asm/asm-xsi-offsets.h> -#include <public/arch-ia64.h> +#include <public/xen.h> #define _PAGE_PPN_MASK 0x0003fffffffff000 //asm/pgtable.h doesn't do assembly diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/xen/vcpu.c --- a/xen/arch/ia64/xen/vcpu.c Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/arch/ia64/xen/vcpu.c Mon Aug 14 15:21:30 2006 -0400 @@ -7,7 +7,7 @@ */ #include <linux/sched.h> -#include <public/arch-ia64.h> +#include <public/xen.h> #include <asm/ia64_int.h> #include <asm/vcpu.h> #include <asm/regionreg.h> diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/ia64/xen/xenasm.S --- a/xen/arch/ia64/xen/xenasm.S Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/arch/ia64/xen/xenasm.S Mon Aug 14 15:21:30 2006 -0400 @@ -11,7 +11,7 @@ #include <asm/pgtable.h> #include <asm/vhpt.h> #include <asm/asm-xsi-offsets.h> -#include <public/arch-ia64.h> +#include <public/xen.h> // Change rr7 to the passed value while ensuring // Xen is mapped into the new region. diff -r 39c113fb84ac -r 10f1113fd489 xen/arch/x86/hvm/platform.c --- a/xen/arch/x86/hvm/platform.c Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/arch/x86/hvm/platform.c Mon Aug 14 15:21:30 2006 -0400 @@ -462,7 +462,8 @@ static int hvm_decode(int realmode, unsi return DECODE_success; default: - printf("%x, This opcode isn't handled yet!\n", *opcode); + printf("%x/%x, This opcode isn't handled yet!\n", + *opcode, ins_subtype); return DECODE_failure; } } diff -r 39c113fb84ac -r 10f1113fd489 xen/common/grant_table.c --- a/xen/common/grant_table.c Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/common/grant_table.c Mon Aug 14 15:21:30 2006 -0400 @@ -33,9 +33,10 @@ #include <xen/domain_page.h> #include <acm/acm_hooks.h> -/* The first to members of a grant entry are updated as a combined - * pair. The following union allows that to happen in an endian - * neutral fashion. */ +/* + * The first two members of a grant entry are updated as a combined pair. + * The following union allows that to happen in an endian-neutral fashion. + */ union grant_combo { uint32_t word; struct { diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/domain.h --- a/xen/include/asm-ia64/domain.h Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/include/asm-ia64/domain.h Mon Aug 14 15:21:30 2006 -0400 @@ -6,7 +6,7 @@ #include <asm/vmx_vpd.h> #include <asm/vmmu.h> #include <asm/regionreg.h> -#include <public/arch-ia64.h> +#include <public/xen.h> #include <asm/vmx_platform.h> #include <xen/list.h> #include <xen/cpumask.h> diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/event.h --- a/xen/include/asm-ia64/event.h Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/include/asm-ia64/event.h Mon Aug 14 15:21:30 2006 -0400 @@ -9,7 +9,7 @@ #ifndef __ASM_EVENT_H__ #define __ASM_EVENT_H__ -#include <public/arch-ia64.h> +#include <public/xen.h> #include <asm/vcpu.h> static inline void vcpu_kick(struct vcpu *v) diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/linux-xen/asm/ptrace.h --- a/xen/include/asm-ia64/linux-xen/asm/ptrace.h Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/include/asm-ia64/linux-xen/asm/ptrace.h Mon Aug 14 15:21:30 2006 -0400 @@ -96,7 +96,8 @@ * */ #ifdef XEN -#include <public/arch-ia64.h> +#include <xen/types.h> +#include <public/xen.h> #define pt_regs cpu_user_regs /* User regs at placed at the end of the vcpu area. diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/privop_stat.h --- a/xen/include/asm-ia64/privop_stat.h Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/include/asm-ia64/privop_stat.h Mon Aug 14 15:21:30 2006 -0400 @@ -1,6 +1,7 @@ #ifndef _XEN_UA64_PRIVOP_STAT_H #define _XEN_UA64_PRIVOP_STAT_H -#include <public/arch-ia64.h> +#include <xen/types.h> +#include <public/xen.h> extern int dump_privop_counts_to_user(char *, int); extern int zero_privop_counts_to_user(char *, int); diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/vcpu.h --- a/xen/include/asm-ia64/vcpu.h Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/include/asm-ia64/vcpu.h Mon Aug 14 15:21:30 2006 -0400 @@ -7,7 +7,8 @@ #include <asm/fpu.h> #include <asm/tlb.h> #include <asm/ia64_int.h> -#include <public/arch-ia64.h> +#include <xen/types.h> +#include <public/xen.h> typedef unsigned long UINT64; typedef unsigned int UINT; typedef int BOOLEAN; diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/vmx_platform.h --- a/xen/include/asm-ia64/vmx_platform.h Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/include/asm-ia64/vmx_platform.h Mon Aug 14 15:21:30 2006 -0400 @@ -21,7 +21,6 @@ #include <public/xen.h> #include <public/hvm/params.h> -#include <public/arch-ia64.h> #include <asm/hvm/vioapic.h> struct mmio_list; typedef struct virtual_platform_def { diff -r 39c113fb84ac -r 10f1113fd489 xen/include/asm-ia64/vmx_vpd.h --- a/xen/include/asm-ia64/vmx_vpd.h Mon Aug 14 10:03:58 2006 -0400 +++ b/xen/include/asm-ia64/vmx_vpd.h Mon Aug 14 15:21:30 2006 -0400 @@ -26,7 +26,7 @@ #include <asm/vtm.h> #include <asm/vmx_platform.h> -#include <public/arch-ia64.h> +#include <public/xen.h> #define VPD_SHIFT 17 /* 128K requirement */ #define VPD_SIZE (1 << VPD_SHIFT) diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linux-2.6-xen-sparse/include/asm-i386/mach-xen/asm/maddr.h Mon Aug 14 15:21:30 2006 -0400 @@ -0,0 +1,160 @@ +#ifndef _I386_MADDR_H +#define _I386_MADDR_H + +#include <xen/features.h> +#include <xen/interface/xen.h> + +/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ +#define INVALID_P2M_ENTRY (~0UL) +#define FOREIGN_FRAME_BIT (1UL<<31) +#define FOREIGN_FRAME(m) ((m) | FOREIGN_FRAME_BIT) + +#ifdef CONFIG_XEN + +extern unsigned long *phys_to_machine_mapping; + +#undef machine_to_phys_mapping +extern unsigned long *machine_to_phys_mapping; +extern unsigned int machine_to_phys_order; + +static inline unsigned long pfn_to_mfn(unsigned long pfn) +{ + if (xen_feature(XENFEAT_auto_translated_physmap)) + return pfn; + return phys_to_machine_mapping[(unsigned int)(pfn)] & + ~FOREIGN_FRAME_BIT; +} + +static inline int phys_to_machine_mapping_valid(unsigned long pfn) +{ + if (xen_feature(XENFEAT_auto_translated_physmap)) + return 1; + return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY); +} + +static inline unsigned long mfn_to_pfn(unsigned long mfn) +{ + extern unsigned long max_mapnr; + unsigned long pfn; + + if (xen_feature(XENFEAT_auto_translated_physmap)) + return mfn; + + if (unlikely((mfn >> machine_to_phys_order) != 0)) + return max_mapnr; + + /* The array access can fail (e.g., device space beyond end of RAM). */ + asm ( + "1: movl %1,%0\n" + "2:\n" + ".section .fixup,\"ax\"\n" + "3: movl %2,%0\n" + " jmp 2b\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + " .align 4\n" + " .long 1b,3b\n" + ".previous" + : "=r" (pfn) + : "m" (machine_to_phys_mapping[mfn]), "m" (max_mapnr) ); + + return pfn; +} + +/* + * We detect special mappings in one of two ways: + * 1. If the MFN is an I/O page then Xen will set the m2p entry + * to be outside our maximum possible pseudophys range. + * 2. If the MFN belongs to a different domain then we will certainly + * not have MFN in our p2m table. Conversely, if the page is ours, + * then we'll have p2m(m2p(MFN))==MFN. + * If we detect a special mapping then it doesn't have a 'struct page'. + * We force !pfn_valid() by returning an out-of-range pointer. + * + * NB. These checks require that, for any MFN that is not in our reservation, + * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if + * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN. + * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety. + * + * NB2. When deliberately mapping foreign pages into the p2m table, you *must* + * use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we + * require. In all the cases we care about, the FOREIGN_FRAME bit is + * masked (e.g., pfn_to_mfn()) so behaviour there is correct. + */ +static inline unsigned long mfn_to_local_pfn(unsigned long mfn) +{ + extern unsigned long max_mapnr; + unsigned long pfn = mfn_to_pfn(mfn); + if ((pfn < max_mapnr) + && !xen_feature(XENFEAT_auto_translated_physmap) + && (phys_to_machine_mapping[pfn] != mfn)) + return max_mapnr; /* force !pfn_valid() */ + return pfn; +} + +static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn) +{ + if (xen_feature(XENFEAT_auto_translated_physmap)) { + BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY); + return; + } + phys_to_machine_mapping[pfn] = mfn; +} + + +#else /* !CONFIG_XEN */ + +#define pfn_to_mfn(pfn) (pfn) +#define mfn_to_pfn(mfn) (mfn) +#define mfn_to_local_pfn(mfn) (mfn) +#define set_phys_to_machine(pfn, mfn) BUG_ON((pfn) != (mfn)) +#define phys_to_machine_mapping_valid(pfn) (1) + +#endif /* !CONFIG_XEN */ + +/* Definitions for machine and pseudophysical addresses. */ +#ifdef CONFIG_X86_PAE +typedef unsigned long long paddr_t; +typedef unsigned long long maddr_t; +#else +typedef unsigned long paddr_t; +typedef unsigned long maddr_t; +#endif + +static inline maddr_t phys_to_machine(paddr_t phys) +{ + maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT); + machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK); + return machine; +} +static inline paddr_t machine_to_phys(maddr_t machine) +{ + paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT); + phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK); + return phys; +} + +/* VIRT <-> MACHINE conversion */ +#define virt_to_machine(v) (phys_to_machine(__pa(v))) +#define virt_to_mfn(v) (pfn_to_mfn(__pa(v) >> PAGE_SHIFT)) +#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) + +#ifdef CONFIG_X86_PAE +static inline pte_t pfn_pte_ma(unsigned long page_nr, pgprot_t pgprot) +{ + pte_t pte; + + pte.pte_high = (page_nr >> (32 - PAGE_SHIFT)) | \ + (pgprot_val(pgprot) >> 32); + pte.pte_high &= (__supported_pte_mask >> 32); + pte.pte_low = ((page_nr << PAGE_SHIFT) | pgprot_val(pgprot)) & \ + __supported_pte_mask; + return pte; +} +#else +#define pfn_pte_ma(pfn, prot) __pte_ma(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) +#endif + +#define __pte_ma(x) ((pte_t) { (x) } ) + +#endif /* _I386_MADDR_H */ diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linux-2.6-xen-sparse/include/asm-x86_64/mach-xen/asm/maddr.h Mon Aug 14 15:21:30 2006 -0400 @@ -0,0 +1,139 @@ +#ifndef _X86_64_MADDR_H +#define _X86_64_MADDR_H + +#include <xen/features.h> +#include <xen/interface/xen.h> + +/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ +#define INVALID_P2M_ENTRY (~0UL) +#define FOREIGN_FRAME_BIT (1UL<<63) +#define FOREIGN_FRAME(m) ((m) | FOREIGN_FRAME_BIT) + +#ifdef CONFIG_XEN + +extern unsigned long *phys_to_machine_mapping; + +#undef machine_to_phys_mapping +extern unsigned long *machine_to_phys_mapping; +extern unsigned int machine_to_phys_order; + +static inline unsigned long pfn_to_mfn(unsigned long pfn) +{ + if (xen_feature(XENFEAT_auto_translated_physmap)) + return pfn; + return phys_to_machine_mapping[(unsigned int)(pfn)] & + ~FOREIGN_FRAME_BIT; +} + +static inline int phys_to_machine_mapping_valid(unsigned long pfn) +{ + if (xen_feature(XENFEAT_auto_translated_physmap)) + return 1; + return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY); +} + +static inline unsigned long mfn_to_pfn(unsigned long mfn) +{ + unsigned long pfn; + + if (xen_feature(XENFEAT_auto_translated_physmap)) + return mfn; + + if (unlikely((mfn >> machine_to_phys_order) != 0)) + return end_pfn; + + /* The array access can fail (e.g., device space beyond end of RAM). */ + asm ( + "1: movq %1,%0\n" + "2:\n" + ".section .fixup,\"ax\"\n" + "3: movq %2,%0\n" + " jmp 2b\n" + ".previous\n" + ".section __ex_table,\"a\"\n" + " .align 8\n" + " .quad 1b,3b\n" + ".previous" + : "=r" (pfn) + : "m" (machine_to_phys_mapping[mfn]), "m" (end_pfn) ); + + return pfn; +} + +/* + * We detect special mappings in one of two ways: + * 1. If the MFN is an I/O page then Xen will set the m2p entry + * to be outside our maximum possible pseudophys range. + * 2. If the MFN belongs to a different domain then we will certainly + * not have MFN in our p2m table. Conversely, if the page is ours, + * then we'll have p2m(m2p(MFN))==MFN. + * If we detect a special mapping then it doesn't have a 'struct page'. + * We force !pfn_valid() by returning an out-of-range pointer. + * + * NB. These checks require that, for any MFN that is not in our reservation, + * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if + * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN. + * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety. + * + * NB2. When deliberately mapping foreign pages into the p2m table, you *must* + * use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we + * require. In all the cases we care about, the FOREIGN_FRAME bit is + * masked (e.g., pfn_to_mfn()) so behaviour there is correct. + */ +static inline unsigned long mfn_to_local_pfn(unsigned long mfn) +{ + unsigned long pfn = mfn_to_pfn(mfn); + if ((pfn < end_pfn) + && !xen_feature(XENFEAT_auto_translated_physmap) + && (phys_to_machine_mapping[pfn] != mfn)) + return end_pfn; /* force !pfn_valid() */ + return pfn; +} + +static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn) +{ + if (xen_feature(XENFEAT_auto_translated_physmap)) { + BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY); + return; + } + phys_to_machine_mapping[pfn] = mfn; +} + +#else /* !CONFIG_XEN */ + +#define pfn_to_mfn(pfn) (pfn) +#define mfn_to_pfn(mfn) (mfn) +#define mfn_to_local_pfn(mfn) (mfn) +#define set_phys_to_machine(pfn, mfn) BUG_ON((pfn) != (mfn)) +#define phys_to_machine_mapping_valid(pfn) (1) + +#endif /* !CONFIG_XEN */ + +/* Definitions for machine and pseudophysical addresses. */ +typedef unsigned long paddr_t; +typedef unsigned long maddr_t; + +static inline maddr_t phys_to_machine(paddr_t phys) +{ + maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT); + machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK); + return machine; +} + +static inline paddr_t machine_to_phys(maddr_t machine) +{ + paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT); + phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK); + return phys; +} + +/* VIRT <-> MACHINE conversion */ +#define virt_to_machine(v) (phys_to_machine(__pa(v))) +#define virt_to_mfn(v) (pfn_to_mfn(__pa(v) >> PAGE_SHIFT)) +#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) + +#define __pte_ma(x) ((pte_t) { (x) } ) +#define pfn_pte_ma(pfn, prot) __pte_ma((((pfn) << PAGE_SHIFT) | pgprot_val(prot)) & __supported_pte_mask) + +#endif /* _X86_64_MADDR_H */ + diff -r 39c113fb84ac -r 10f1113fd489 linux-2.6-xen-sparse/include/xen/hvm.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/linux-2.6-xen-sparse/include/xen/hvm.h Mon Aug 14 15:21:30 2006 -0400 @@ -0,0 +1,17 @@ +/* Simple wrappers around HVM functions */ +#ifndef XEN_HVM_H__ +#define XEN_HVM_H__ + +#include <xen/interface/hvm/params.h> +#include <asm/hypercall.h> + +static inline unsigned long hvm_get_parameter(int idx) +{ + struct xen_hvm_param xhv; + + xhv.domid = DOMID_SELF; + xhv.index = idx; + return HYPERVISOR_hvm_op(HVMOP_get_param, &xhv); +} + +#endif /* XEN_HVM_H__ */ diff -r 39c113fb84ac -r 10f1113fd489 patches/linux-2.6.16.13/net-gso-4-kill-warnon.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/linux-2.6.16.13/net-gso-4-kill-warnon.patch Mon Aug 14 15:21:30 2006 -0400 @@ -0,0 +1,29 @@ +508c578140642a641bb9b888369719c510ae2a00 +diff --git a/net/core/dev.c b/net/core/dev.c +index e814a89..240773b 100644 +--- a/net/core/dev.c ++++ b/net/core/dev.c +@@ -1087,11 +1087,6 @@ int skb_checksum_help(struct sk_buff *sk + goto out_set_summed; + + if (unlikely(skb_shinfo(skb)->gso_size)) { +- static int warned; +- +- WARN_ON(!warned); +- warned = 1; +- + /* Let GSO fix up the checksum. */ + goto out_set_summed; + } +@@ -1141,11 +1136,6 @@ struct sk_buff *skb_gso_segment(struct s + __skb_pull(skb, skb->mac_len); + + if (unlikely(skb->ip_summed != CHECKSUM_HW)) { +- static int warned; +- +- WARN_ON(!warned); +- warned = 1; +- + if (skb_header_cloned(skb) && + (err = pskb_expand_head(skb, 0, 0, GFP_ATOMIC))) + return ERR_PTR(err); diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/smbios.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/firmware/hvmloader/smbios.c Mon Aug 14 15:21:30 2006 -0400 @@ -0,0 +1,606 @@ +/* + * smbios.c - Generate SMBIOS tables for Xen HVM domU's. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (C) IBM Corporation, 2006 + * + * Authors: Andrew D. Ball <aball@xxxxxxxxxx> + */ + +#include <stdint.h> +#include <xen/version.h> +#include <xen/hvm/e820.h> +#include "smbios.h" +#include "smbios_types.h" +#include "util.h" +#include "hypercall.h" + +/* write SMBIOS tables starting at 'start', without writing more + than 'max_size' bytes. + + Return the number of bytes written +*/ +static size_t +write_smbios_tables(void *start, size_t max_size, + uint32_t vcpus, uint64_t memsize, + uint8_t uuid[16], char *xen_version, + uint32_t xen_major_version, uint32_t xen_minor_version); + +static void +get_cpu_manufacturer(char *buf, int len); +static size_t +smbios_table_size(uint32_t vcpus, const char *xen_version, + const char *processor_manufacturer); +static void * +smbios_entry_point_init(void *start, + uint16_t max_structure_size, + uint16_t structure_table_length, + uint32_t structure_table_address, + uint16_t number_of_structures); +static void * +smbios_type_0_init(void *start, const char *xen_version, + uint32_t xen_major_version, uint32_t xen_minor_version); +static void * +smbios_type_1_init(void *start, const char *xen_version, + uint8_t uuid[16]); +static void * +smbios_type_3_init(void *start); +static void * +smbios_type_4_init(void *start, unsigned int cpu_number, + char *cpu_manufacturer); +static void * +smbios_type_16_init(void *start, uint32_t memory_size_mb); +static void * +smbios_type_17_init(void *start, uint32_t memory_size_mb); +static void * +smbios_type_19_init(void *start, uint32_t memory_size_mb); +static void * +smbios_type_20_init(void *start, uint32_t memory_size_mb); +static void * +smbios_type_32_init(void *start); +void * +smbios_type_127_init(void *start); + +static void +get_cpu_manufacturer(char *buf, int len) +{ + char id[12]; + uint32_t eax = 0; + + cpuid(0, &eax, (uint32_t *)&id[0], (uint32_t *)&id[8], (uint32_t *)&id[4]); + + if (memcmp(id, "GenuineIntel", 12) == 0) + strncpy(buf, "Intel", len); + else if (memcmp(id, "AuthenticAMD", 12) == 0) + strncpy(buf, "AMD", len); + else + strncpy(buf, "unknown", len); +} + + +/* Calculate the size of the SMBIOS structure table. +*/ +static size_t +smbios_table_size(uint32_t vcpus, const char *xen_version, + const char *processor_manufacturer) +{ + size_t size; + + /* first compute size without strings or terminating 0 bytes */ + size = sizeof(struct smbios_type_0) + sizeof(struct smbios_type_1) + + sizeof(struct smbios_type_3) + sizeof(struct smbios_type_4)*vcpus + + sizeof(struct smbios_type_16) + sizeof(struct smbios_type_17) + + sizeof(struct smbios_type_19) + sizeof(struct smbios_type_20) + + sizeof(struct smbios_type_32) + sizeof(struct smbios_type_127); + + /* 5 structures with no strings, 2 null bytes each */ + size += 10; + + /* Need to include 1 null byte per structure with strings (first + terminating null byte comes from the string terminator of the + last string). */ + size += 4 + vcpus; + + /* type 0: "Xen", xen_version, and release_date */ + size += strlen("Xen") + strlen(xen_version) + 2; + /* type 1: "Xen", xen_version, "HVM domU" */ + size += strlen("Xen") + strlen("HVM domU") + strlen(xen_version) + 3; + /* type 3: "Xen" */ + size += strlen("Xen") + 1; + /* type 4: socket designation ("CPU n"), processor_manufacturer */ + size += vcpus * (strlen("CPU n") + strlen(processor_manufacturer) + 2); + /* Make room for two-digit CPU numbers if necessary -- doesn't handle + vcpus > 99 */ + if (vcpus > 9) + size += vcpus - 9; + /* type 17: device locator string ("DIMM 1") */ + size += strlen("DIMM 1") + 1; + + return size; +} + +static size_t +write_smbios_tables(void *start, size_t max_size, + uint32_t vcpus, uint64_t memsize, + uint8_t uuid[16], char *xen_version, + uint32_t xen_major_version, uint32_t xen_minor_version) +{ + unsigned cpu_num; + void *p = start; + char cpu_manufacturer[15]; + size_t structure_table_length; + + get_cpu_manufacturer(cpu_manufacturer, 15); + + + structure_table_length = smbios_table_size(vcpus, xen_version, + cpu_manufacturer); + + if (structure_table_length + sizeof(struct smbios_entry_point) > max_size) + return 0; + + p = smbios_entry_point_init(p, sizeof(struct smbios_type_4), + structure_table_length, + (uint32_t)start + + sizeof(struct smbios_entry_point), + 9 + vcpus); + + p = smbios_type_0_init(p, xen_version, xen_major_version, + xen_minor_version); + p = smbios_type_1_init(p, xen_version, uuid); + p = smbios_type_3_init(p); + for (cpu_num = 1; cpu_num <= vcpus; ++cpu_num) + p = smbios_type_4_init(p, cpu_num, cpu_manufacturer); + p = smbios_type_16_init(p, memsize); + p = smbios_type_17_init(p, memsize); + p = smbios_type_19_init(p, memsize); + p = smbios_type_20_init(p, memsize); + p = smbios_type_32_init(p); + p = smbios_type_127_init(p); + + return (size_t)((char*)p - (char*)start); +} + +/* This tries to figure out how much pseudo-physical memory (in MB) + is allocated to the current domU. + + It iterates through the e820 table, adding up the 'usable' and + 'reserved' entries and rounding up to the nearest MB. + + The e820map is not at e820 in hvmloader, so this uses the + E820_MAP_* constants from e820.h to pick it up where libxenguest + left it. + */ +static uint64_t +get_memsize(void) +{ + struct e820entry *map = NULL; + uint8_t num_entries = 0; + uint64_t memsize = 0; + uint8_t i; + + map = (struct e820entry *) (E820_MAP_PAGE + E820_MAP_OFFSET); + num_entries = *((uint8_t *) (E820_MAP_PAGE + E820_MAP_NR_OFFSET)); + + /* walk through e820map, ignoring any entries that aren't marked + as usable or reserved. */ + + for (i = 0; i < num_entries; i++) { + if (map->type == E820_RAM || map->type == E820_RESERVED) + memsize += map->size; + map++; + } + + /* Round up to the nearest MB. The user specifies domU + pseudo-physical memory in megabytes, so not doing this + could easily lead to reporting one less MB than the user + specified. */ + if (memsize & ((1<<20)-1)) + memsize = (memsize >> 20) + 1; + else + memsize = (memsize >> 20); + + return memsize; +} + +void +hvm_write_smbios_tables(void) +{ + uint8_t uuid[16]; /* ** This will break if xen_domain_handle_t is + not uint8_t[16]. ** */ + uint16_t xen_major_version, xen_minor_version; + uint32_t xen_version; + char xen_extra_version[XEN_EXTRAVERSION_LEN]; + /* guess conservatively on buffer length for Xen version string */ + char xen_version_str[80]; + /* temporary variables used to build up Xen version string */ + char *p = NULL; /* points to next point of insertion */ + unsigned len = 0; /* length of string already composed */ + char *tmp = NULL; /* holds result of itoa() */ + unsigned tmp_len; /* length of next string to add */ + + hypercall_xen_version(XENVER_guest_handle, uuid); + + /* xen_version major and minor */ + xen_version = hypercall_xen_version(XENVER_version, NULL); + xen_major_version = (uint16_t) (xen_version >> 16); + xen_minor_version = (uint16_t) xen_version; + + hypercall_xen_version(XENVER_extraversion, xen_extra_version); + + /* build up human-readable Xen version string */ + p = xen_version_str; + len = 0; + + itoa(tmp, xen_major_version); + tmp_len = strlen(tmp); + len += tmp_len; + if (len >= sizeof(xen_version_str)) + goto error_out; + strcpy(p, tmp); + p += tmp_len; + + len++; + if (len >= sizeof(xen_version_str)) + goto error_out; + *p = '.'; + p++; + + itoa(tmp, xen_minor_version); + tmp_len = strlen(tmp); + len += tmp_len; + if (len >= sizeof(xen_version_str)) + goto error_out; + strcpy(p, tmp); + p += tmp_len; + + tmp_len = strlen(xen_extra_version); + len += tmp_len; + if (len >= sizeof(xen_version_str)) + goto error_out; + strcpy(p, xen_extra_version); + p += tmp_len; + + xen_version_str[sizeof(xen_version_str)-1] = '\0'; + + write_smbios_tables((void *) SMBIOS_PHYSICAL_ADDRESS, + SMBIOS_SIZE_LIMIT, get_vcpu_nr(), get_memsize(), + uuid, xen_version_str, + xen_major_version, xen_minor_version); + return; + + error_out: + puts("Could not write SMBIOS tables, error in hvmloader.c:" + "hvm_write_smbios_tables()\n"); +} + + +static void * +smbios_entry_point_init(void *start, + uint16_t max_structure_size, + uint16_t structure_table_length, + uint32_t structure_table_address, + uint16_t number_of_structures) +{ + uint8_t sum; + int i; + struct smbios_entry_point *ep = (struct smbios_entry_point *)start; + + strncpy(ep->anchor_string, "_SM_", 4); + ep->length = 0x1f; + ep->smbios_major_version = 2; + ep->smbios_minor_version = 4; + ep->max_structure_size = max_structure_size; + ep->entry_point_revision = 0; + memset(ep->formatted_area, 0, 5); + strncpy(ep->intermediate_anchor_string, "_DMI_", 5); + + ep->structure_table_length = structure_table_length; + ep->structure_table_address = structure_table_address; + ep->number_of_structures = number_of_structures; + ep->smbios_bcd_revision = 0x24; + + ep->checksum = 0; + ep->intermediate_checksum = 0; + + sum = 0; + for (i = 0; i < 0x10; ++i) + sum += ((int8_t *)start)[i]; + ep->checksum = -sum; + + sum = 0; + for (i = 0x10; i < ep->length; ++i) + sum += ((int8_t *)start)[i]; + ep->intermediate_checksum = -sum; + + return (char *)start + sizeof(struct smbios_entry_point); +} + +/* Type 0 -- BIOS Information */ +static void * +smbios_type_0_init(void *start, const char *xen_version, + uint32_t xen_major_version, uint32_t xen_minor_version) +{ + struct smbios_type_0 *p = (struct smbios_type_0 *)start; + + p->header.type = 0; + p->header.length = sizeof(struct smbios_type_0); + p->header.handle = 0; + + p->vendor_str = 1; + p->version_str = 2; + p->starting_address_segment = 0xe800; + p->release_date_str = 0; + p->rom_size = 0; + + memset(p->characteristics, 0, 8); + p->characteristics[7] = 0x08; /* BIOS characteristics not supported */ + p->characteristics_extension_bytes[0] = 0; + p->characteristics_extension_bytes[1] = 0; + + p->major_release = (uint8_t) xen_major_version; + p->minor_release = (uint8_t) xen_minor_version; + p->embedded_controller_major = 0xff; + p->embedded_controller_minor = 0xff; + + start += sizeof(struct smbios_type_0); + strcpy((char *)start, "Xen"); + start += strlen("Xen") + 1; + strcpy((char *)start, xen_version); + start += strlen(xen_version) + 1; + + *((uint8_t *)start) = 0; + return start + 1; +} + +/* Type 1 -- System Information */ +static void * +smbios_type_1_init(void *start, const char *xen_version, + uint8_t uuid[16]) +{ + struct smbios_type_1 *p = (struct smbios_type_1 *)start; + p->header.type = 1; + p->header.length = sizeof(struct smbios_type_1); + p->header.handle = 0x100; + + p->manufacturer_str = 1; + p->product_name_str = 2; + p->version_str = 3; + p->serial_number_str = 0; + + memcpy(p->uuid, uuid, 16); + + p->wake_up_type = 0x06; /* power switch */ + p->sku_str = 0; + p->family_str = 0; + + start += sizeof(struct smbios_type_1); + + strcpy((char *)start, "Xen"); + start += strlen("Xen") + 1; + strcpy((char *)start, "HVM domU"); + start += strlen("HVM domU") + 1; + strcpy((char *)start, xen_version); + start += strlen(xen_version) + 1; + *((uint8_t *)start) = 0; + + return start+1; +} + +/* Type 3 -- System Enclosure */ +static void * +smbios_type_3_init(void *start) +{ + struct smbios_type_3 *p = (struct smbios_type_3 *)start; + + p->header.type = 3; + p->header.length = sizeof(struct smbios_type_3); + p->header.handle = 0x300; + + p->manufacturer_str = 1; + p->type = 0x01; /* other */ + p->version_str = 0; + p->serial_number_str = 0; + p->asset_tag_str = 0; + p->boot_up_state = 0x03; /* safe */ + p->power_supply_state = 0x03; /* safe */ + p->thermal_state = 0x03; /* safe */ + p->security_status = 0x02; /* unknown */ + + start += sizeof(struct smbios_type_3); + + strcpy((char *)start, "Xen"); + start += strlen("Xen") + 1; + *((uint8_t *)start) = 0; + return start+1; +} + +/* Type 4 -- Processor Information */ +static void * +smbios_type_4_init(void *start, unsigned int cpu_number, char *cpu_manufacturer) +{ + char buf[80]; + struct smbios_type_4 *p = (struct smbios_type_4 *)start; + uint32_t eax, ebx, ecx, edx; + + p->header.type = 4; + p->header.length = sizeof(struct smbios_type_4); + p->header.handle = 0x400 + cpu_number; + + p->socket_designation_str = 1; + p->processor_type = 0x03; /* CPU */ + p->processor_family = 0x01; /* other */ + p->manufacturer_str = 2; + + cpuid(1, &eax, &ebx, &ecx, &edx); + + p->cpuid[0] = eax; + p->cpuid[1] = edx; + + p->version_str = 0; + p->voltage = 0; + p->external_clock = 0; + + p->max_speed = 0; /* unknown */ + p->current_speed = 0; /* unknown */ + + p->status = 0x41; /* socket populated, CPU enabled */ + p->upgrade = 0x01; /* other */ + + start += sizeof(struct smbios_type_4); + + strncpy(buf, "CPU ", sizeof(buf)); + if ((sizeof(buf) - strlen("CPU ")) >= 3) + itoa(buf + strlen("CPU "), cpu_number); + + strcpy((char *)start, buf); + start += strlen(buf) + 1; + + strcpy((char *)start, cpu_manufacturer); + start += strlen(buf) + 1; + + *((uint8_t *)start) = 0; + return start+1; +} + +/* Type 16 -- Physical Memory Array */ +static void * +smbios_type_16_init(void *start, uint32_t memsize) +{ + struct smbios_type_16 *p = (struct smbios_type_16*)start; + + p->header.type = 16; + p->header.handle = 0x1000; + p->header.length = sizeof(struct smbios_type_16); + + p->location = 0x01; /* other */ + p->use = 0x03; /* system memory */ + p->error_correction = 0x01; /* other */ + p->maximum_capacity = memsize * 1024; + p->memory_error_information_handle = 0xfffe; /* none provided */ + p->number_of_memory_devices = 1; + + start += sizeof(struct smbios_type_16); + *((uint16_t *)start) = 0; + return start + 2; +} + +/* Type 17 -- Memory Device */ +static void * +smbios_type_17_init(void *start, uint32_t memory_size_mb) +{ + struct smbios_type_17 *p = (struct smbios_type_17 *)start; + + p->header.type = 17; + p->header.length = sizeof(struct smbios_type_17); + p->header.handle = 0x1100; + + p->physical_memory_array_handle = 0x1000; + p->total_width = 64; + p->data_width = 64; + /* truncate memory_size_mb to 16 bits and clear most significant + bit [indicates size in MB] */ + p->size = (uint16_t) memory_size_mb & 0x7fff; + p->form_factor = 0x09; /* DIMM */ + p->device_set = 0; + p->device_locator_str = 1; + p->bank_locator_str = 0; + p->memory_type = 0x07; /* RAM */ + p->type_detail = 0; + + start += sizeof(struct smbios_type_17); + strcpy((char *)start, "DIMM 1"); + start += strlen("DIMM 1") + 1; + *((uint8_t *)start) = 0; + + return start+1; +} + +/* Type 19 -- Memory Array Mapped Address */ +static void * +smbios_type_19_init(void *start, uint32_t memory_size_mb) +{ + struct smbios_type_19 *p = (struct smbios_type_19 *)start; + + p->header.type = 19; + p->header.length = sizeof(struct smbios_type_19); + p->header.handle = 0x1300; + + p->starting_address = 0; + p->ending_address = (memory_size_mb-1) * 1024; + p->memory_array_handle = 0x1000; + p->partition_width = 1; + + start += sizeof(struct smbios_type_19); + *((uint16_t *)start) = 0; + return start + 2; +} + +/* Type 20 -- Memory Device Mapped Address */ +static void * +smbios_type_20_init(void *start, uint32_t memory_size_mb) +{ + struct smbios_type_20 *p = (struct smbios_type_20 *)start; + + p->header.type = 20; + p->header.length = sizeof(struct smbios_type_20); + p->header.handle = 0x1400; + + p->starting_address = 0; + p->ending_address = (memory_size_mb-1)*1024; + p->memory_device_handle = 0x1100; + p->memory_array_mapped_address_handle = 0x1300; + p->partition_row_position = 1; + p->interleave_position = 0; + p->interleaved_data_depth = 0; + + start += sizeof(struct smbios_type_20); + + *((uint16_t *)start) = 0; + return start+2; +} + +/* Type 32 -- System Boot Information */ +static void * +smbios_type_32_init(void *start) +{ + struct smbios_type_32 *p = (struct smbios_type_32 *)start; + + p->header.type = 32; + p->header.length = sizeof(struct smbios_type_32); + p->header.handle = 0x2000; + memset(p->reserved, 0, 6); + p->boot_status = 0; /* no errors detected */ + + start += sizeof(struct smbios_type_32); + *((uint16_t *)start) = 0; + return start+2; +} + +/* Type 127 -- End of Table */ +void * +smbios_type_127_init(void *start) +{ + struct smbios_type_127 *p = (struct smbios_type_127 *)start; + + p->header.type = 127; + p->header.length = sizeof(struct smbios_type_127); + p->header.handle = 0x7f00; + + start += sizeof(struct smbios_type_127); + *((uint16_t *)start) = 0; + return start + 2; +} diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/smbios.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/firmware/hvmloader/smbios.h Mon Aug 14 15:21:30 2006 -0400 @@ -0,0 +1,38 @@ +/* + * smbios.h - interface for Xen HVM SMBIOS generation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (C) IBM Corporation, 2006 + * + * Authors: Andrew D. Ball <aball@xxxxxxxxxx> + */ + +#ifndef SMBIOS_H +#define SMBIOS_H + +#include <stdint.h> +#include <stdlib.h> + +/* These constants must agree with the ACPI e820 memory map as defined + in tools/libxc/xc_hvm_build.c and the address the ROMBIOS pulls the + SMBIOS entry point from in the smbios_init subroutine. + */ +#define SMBIOS_PHYSICAL_ADDRESS 0x9f000 +#define SMBIOS_SIZE_LIMIT 0x800 + +void hvm_write_smbios_tables(void); + +#endif /* SMBIOS_H */ diff -r 39c113fb84ac -r 10f1113fd489 tools/firmware/hvmloader/smbios_types.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/firmware/hvmloader/smbios_types.h Mon Aug 14 15:21:30 2006 -0400 @@ -0,0 +1,182 @@ +/* + * smbios_types.h - data structure definitions for Xen HVM SMBIOS support + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Copyright (C) IBM Corporation, 2006 + * + * Authors: Andrew D. Ball <aball@xxxxxxxxxx> + * + * See the SMBIOS 2.4 spec for more detail: + * http://www.dmtf.org/standards/smbios/ + */ + +#ifndef SMBIOS_TYPES_H +#define SMBIOS_TYPES_H + +#include <stdint.h> + +/* SMBIOS entry point -- must be written to a 16-bit aligned address + between 0xf0000 and 0xfffff. + */ +struct smbios_entry_point { + char anchor_string[4]; + uint8_t checksum; + uint8_t length; + uint8_t smbios_major_version; + uint8_t smbios_minor_version; + uint16_t max_structure_size; + uint8_t entry_point_revision; + uint8_t formatted_area[5]; + char intermediate_anchor_string[5]; + uint8_t intermediate_checksum; + uint16_t structure_table_length; + uint32_t structure_table_address; + uint16_t number_of_structures; + uint8_t smbios_bcd_revision; +} __attribute__ ((packed)); + +/* This goes at the beginning of every SMBIOS structure. */ +struct smbios_structure_header { + uint8_t type; + uint8_t length; + uint16_t handle; +} __attribute__ ((packed)); + +/* SMBIOS type 0 - BIOS Information */ +struct smbios_type_0 { + struct smbios_structure_header header; + uint8_t vendor_str; + uint8_t version_str; + uint16_t starting_address_segment; + uint8_t release_date_str; + uint8_t rom_size; + uint8_t characteristics[8]; + uint8_t characteristics_extension_bytes[2]; + uint8_t major_release; + uint8_t minor_release; + uint8_t embedded_controller_major; + uint8_t embedded_controller_minor; +} __attribute__ ((packed)); + +/* SMBIOS type 1 - System Information */ +struct smbios_type_1 { + struct smbios_structure_header header; + uint8_t manufacturer_str; + uint8_t product_name_str; + uint8_t version_str; + uint8_t serial_number_str; + uint8_t uuid[16]; + uint8_t wake_up_type; + uint8_t sku_str; + uint8_t family_str; +} __attribute__ ((packed)); + +/* SMBIOS type 3 - System Enclosure */ +struct smbios_type_3 { + struct smbios_structure_header header; + uint8_t manufacturer_str; + uint8_t type; + uint8_t version_str; + uint8_t serial_number_str; + uint8_t asset_tag_str; + uint8_t boot_up_state; + uint8_t power_supply_state; + uint8_t thermal_state; + uint8_t security_status; +} __attribute__ ((packed)); + +/* SMBIOS type 4 - Processor Information */ +struct smbios_type_4 { + struct smbios_structure_header header; + uint8_t socket_designation_str; + uint8_t processor_type; + uint8_t processor_family; + uint8_t manufacturer_str; + uint32_t cpuid[2]; + uint8_t version_str; + uint8_t voltage; + uint16_t external_clock; + uint16_t max_speed; + uint16_t current_speed; + uint8_t status; + uint8_t upgrade; +} __attribute__ ((packed)); + +/* SMBIOS type 16 - Physical Memory Array + * Associated with one type 17 (Memory Device). + */ +struct smbios_type_16 { + struct smbios_structure_header header; + uint8_t location; + uint8_t use; + uint8_t error_correction; + uint32_t maximum_capacity; + uint16_t memory_error_information_handle; + uint16_t number_of_memory_devices; +} __attribute__ ((packed)); + +/* SMBIOS type 17 - Memory Device + * Associated with one type 19 + */ +struct smbios_type_17 { + struct smbios_structure_header header; + uint16_t physical_memory_array_handle; + uint16_t memory_error_information_handle; + uint16_t total_width; + uint16_t data_width; + uint16_t size; + uint8_t form_factor; + uint8_t device_set; + uint8_t device_locator_str; + uint8_t bank_locator_str; + uint8_t memory_type; + uint16_t type_detail; +} __attribute__ ((packed)); + +/* SMBIOS type 19 - Memory Array Mapped Address */ +struct smbios_type_19 { + struct smbios_structure_header header; + uint32_t starting_address; + uint32_t ending_address; + uint16_t memory_array_handle; + uint8_t partition_width; +} __attribute__ ((packed)); + +/* SMBIOS type 20 - Memory Device Mapped Address */ +struct smbios_type_20 { + struct smbios_structure_header header; + uint32_t starting_address; + uint32_t ending_address; + uint16_t memory_device_handle; + uint16_t memory_array_mapped_address_handle; + uint8_t partition_row_position; + uint8_t interleave_position; + uint8_t interleaved_data_depth; +} __attribute__ ((packed)); + +/* SMBIOS type 32 - System Boot Information */ +struct smbios_type_32 { + struct smbios_structure_header header; + uint8_t reserved[6]; + uint8_t boot_status; +} __attribute__ ((packed)); + +/* SMBIOS type 127 -- End-of-table */ +struct smbios_type_127 { + struct smbios_structure_header header; +} __attribute__ ((packed)); + +#endif /* SMBIOS_TYPES_H */ _______________________________________________ Xen-ppc-devel mailing list Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ppc-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |