diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug index 615e188..7791d31 100644 --- a/arch/x86/Kconfig.debug +++ b/arch/x86/Kconfig.debug @@ -1,7 +1,7 @@ menu "Kernel hacking" config TRACE_IRQFLAGS_SUPPORT - def_bool y + def_bool n source "lib/Kconfig.debug" diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h index 91f3e08..b69a989 100644 --- a/arch/x86/include/asm/cpufeature.h +++ b/arch/x86/include/asm/cpufeature.h @@ -271,7 +271,7 @@ extern const char * const x86_power_flags[32]; #define cpu_has_pebs boot_cpu_has(X86_FEATURE_PEBS) #define cpu_has_clflush boot_cpu_has(X86_FEATURE_CLFLSH) #define cpu_has_bts boot_cpu_has(X86_FEATURE_BTS) -#define cpu_has_gbpages boot_cpu_has(X86_FEATURE_GBPAGES) +#define cpu_has_gbpages 0 #define cpu_has_arch_perfmon boot_cpu_has(X86_FEATURE_ARCH_PERFMON) #define cpu_has_pat boot_cpu_has(X86_FEATURE_PAT) #define cpu_has_xmm4_1 boot_cpu_has(X86_FEATURE_XMM4_1) diff --git a/arch/x86/include/asm/hypervisor.h b/arch/x86/include/asm/hypervisor.h index 7a15153..f0bbb51 100644 --- a/arch/x86/include/asm/hypervisor.h +++ b/arch/x86/include/asm/hypervisor.h @@ -49,6 +49,7 @@ extern const struct hypervisor_x86 *x86_hyper; extern const struct hypervisor_x86 x86_hyper_vmware; extern const struct hypervisor_x86 x86_hyper_ms_hyperv; extern const struct hypervisor_x86 x86_hyper_xen_hvm; +extern const struct hypervisor_x86 x86_hyper_xen_hybrid; static inline bool hypervisor_x2apic_available(void) { diff --git a/arch/x86/kernel/cpu/hypervisor.c b/arch/x86/kernel/cpu/hypervisor.c index 8095f86..5ec8dbb 100644 --- a/arch/x86/kernel/cpu/hypervisor.c +++ b/arch/x86/kernel/cpu/hypervisor.c @@ -37,6 +37,7 @@ static const __initconst struct hypervisor_x86 * const hypervisors[] = #ifdef CONFIG_XEN_PVHVM &x86_hyper_xen_hvm, #endif + &x86_hyper_xen_hybrid, }; const struct hypervisor_x86 *x86_hyper; diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 7942335..414cbb8 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -202,7 +202,10 @@ void set_pte_vaddr_pud(pud_t *pud_page, unsigned long vaddr, pte_t new_pte) pmd = fill_pmd(pud, vaddr); pte = fill_pte(pmd, vaddr); - set_pte(pte, new_pte); + if (xen_domain_type == XEN_PV_IN_HVM) { + set_pte_at(&init_mm, vaddr, pte, new_pte); + } else + set_pte(pte, new_pte); /* * It's enough to flush this one mapping. diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 0369843..5810ef4 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -425,7 +425,11 @@ static void __init __early_set_fixmap(enum fixed_addresses idx, pte = early_ioremap_pte(addr); if (pgprot_val(flags)) - set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags)); + set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags)); +#if 0 + set_pte_at(&init_mm, addr, pte, pfn_pte(phys >> PAGE_SHIFT, + flags)); +#endif else pte_clear(&init_mm, addr, pte); __flush_tlb_one(addr); diff --git a/arch/x86/pci/direct.c b/arch/x86/pci/direct.c index bd33620..eb6d4d7 100644 --- a/arch/x86/pci/direct.c +++ b/arch/x86/pci/direct.c @@ -282,6 +282,9 @@ int __init pci_direct_probe(void) { struct resource *region, *region2; + if (xen_domain_type == XEN_PV_IN_HVM) + return 0; + if ((pci_probe & PCI_PROBE_CONF1) == 0) goto type2; region = request_region(0xCF8, 8, "PCI conf1"); diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index e3c6a06..bb430f8 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c @@ -110,7 +110,7 @@ struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; * * 0: not available, 1: available */ -static int have_vcpu_info_placement = 1; +static int have_vcpu_info_placement = 0; static void clamp_max_cpus(void) { @@ -222,8 +222,10 @@ static void xen_cpuid(unsigned int *ax, unsigned int *bx, maskebx = 0; break; } - - asm(XEN_EMULATE_PREFIX "cpuid" + if (xen_domain_type == XEN_PV_IN_HVM) { + native_cpuid(ax, bx, cx, dx); + } else + asm(XEN_EMULATE_PREFIX "cpuid" : "=a" (*ax), "=b" (*bx), "=c" (*cx), @@ -244,6 +246,7 @@ static __init void xen_init_cpuid_mask(void) ~((1 << X86_FEATURE_MCE) | /* disable MCE */ (1 << X86_FEATURE_MCA) | /* disable MCA */ (1 << X86_FEATURE_MTRR) | /* disable MTRR */ + (1 << X86_FEATURE_PSE) | /* disable 2M pages */ (1 << X86_FEATURE_ACC)); /* thermal monitoring */ if (!xen_initial_domain()) @@ -393,6 +396,10 @@ static void xen_load_gdt(const struct desc_ptr *dtr) make_lowmem_page_readonly(virt); } + if (xen_domain_type == XEN_PV_IN_HVM) { + native_load_gdt(dtr); + return; + } if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct))) BUG(); } @@ -431,6 +438,10 @@ static __init void xen_load_gdt_boot(const struct desc_ptr *dtr) frames[f] = mfn; } + if (xen_domain_type == XEN_PV_IN_HVM) { + native_load_gdt(dtr); + return; + } if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct))) BUG(); } @@ -944,6 +955,11 @@ static const struct pv_init_ops xen_init_ops __initdata = { .patch = xen_patch, }; +extern void native_iret(void); +extern void native_irq_enable_sysexit(void); +extern void native_usergs_sysret32(void); +extern void native_usergs_sysret64(void); + static const struct pv_cpu_ops xen_cpu_ops __initdata = { .cpuid = xen_cpuid, @@ -957,48 +973,48 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = { .read_cr4 = native_read_cr4, .read_cr4_safe = native_read_cr4_safe, - .write_cr4 = xen_write_cr4, + .write_cr4 = native_write_cr4, .wbinvd = native_wbinvd, .read_msr = native_read_msr_safe, - .write_msr = xen_write_msr_safe, + .write_msr = native_write_msr_safe, .read_tsc = native_read_tsc, .read_pmc = native_read_pmc, - .iret = xen_iret, - .irq_enable_sysexit = xen_sysexit, + .iret = native_iret, + .irq_enable_sysexit = native_irq_enable_sysexit, #ifdef CONFIG_X86_64 - .usergs_sysret32 = xen_sysret32, - .usergs_sysret64 = xen_sysret64, + .usergs_sysret32 = native_usergs_sysret32, + .usergs_sysret64 = native_usergs_sysret64, #endif - .load_tr_desc = paravirt_nop, - .set_ldt = xen_set_ldt, - .load_gdt = xen_load_gdt, - .load_idt = xen_load_idt, - .load_tls = xen_load_tls, + .load_tr_desc = native_load_tr_desc, + .set_ldt = native_set_ldt, + .load_gdt = native_load_gdt, + .load_idt = native_load_idt, + .load_tls = native_load_tls, #ifdef CONFIG_X86_64 - .load_gs_index = xen_load_gs_index, + .load_gs_index = native_load_gs_index, #endif - .alloc_ldt = xen_alloc_ldt, - .free_ldt = xen_free_ldt, + .alloc_ldt = paravirt_nop, + .free_ldt = paravirt_nop, .store_gdt = native_store_gdt, .store_idt = native_store_idt, - .store_tr = xen_store_tr, + .store_tr = native_store_tr, - .write_ldt_entry = xen_write_ldt_entry, - .write_gdt_entry = xen_write_gdt_entry, - .write_idt_entry = xen_write_idt_entry, - .load_sp0 = xen_load_sp0, + .write_ldt_entry = native_write_ldt_entry, + .write_gdt_entry = native_write_gdt_entry, + .write_idt_entry = native_write_idt_entry, + .load_sp0 = native_load_sp0, - .set_iopl_mask = xen_set_iopl_mask, + .set_iopl_mask = native_set_iopl_mask, .io_delay = xen_io_delay, /* Xen takes care of %gs when switching to usermode for us */ - .swapgs = paravirt_nop, + .swapgs = native_swapgs, .start_context_switch = paravirt_start_context_switch, .end_context_switch = xen_end_context_switch, @@ -1071,6 +1087,10 @@ static const struct machine_ops __initdata xen_machine_ops = { */ static void __init xen_setup_stackprotector(void) { + if (xen_domain_type == XEN_PV_IN_HVM) { + switch_to_new_gdt(0); + return; + } pv_cpu_ops.write_gdt_entry = xen_write_gdt_entry_boot; pv_cpu_ops.load_gdt = xen_load_gdt_boot; @@ -1091,7 +1111,7 @@ asmlinkage void __init xen_start_kernel(void) if (!xen_start_info) return; - xen_domain_type = XEN_PV_DOMAIN; + xen_domain_type = XEN_PV_IN_HVM; xen_setup_machphys_mapping(); @@ -1214,11 +1234,13 @@ asmlinkage void __init xen_start_kernel(void) * were early_cpu_init (run before ->arch_setup()) calls early_amd_init * which pokes 0xcf8 port. */ +#if 0 set_iopl.iopl = 1; rc = HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl); if (rc != 0) xen_raw_printk("physdev_op failed %d\n", rc); +#endif #ifdef CONFIG_X86_32 /* set up basic CPUID stuff */ cpu_detect(&new_cpu_data); @@ -1388,3 +1410,20 @@ const __refconst struct hypervisor_x86 x86_hyper_xen_hvm = { }; EXPORT_SYMBOL(x86_hyper_xen_hvm); #endif + +static bool __init xen_pvhvm_platform_detect(void) +{ + return (xen_domain_type == XEN_PV_IN_HVM); +} + +static void __init xen_pvhvm_guest_init(void) +{ + if (xen_feature(XENFEAT_hvm_callback_vector)) + xen_have_vector_callback = 1; +} + +const __refconst struct hypervisor_x86 x86_hyper_xen_hybrid = { + .name = "Xen Hybrid", + .detect = xen_pvhvm_platform_detect, + .init_platform = xen_pvhvm_guest_init, +}; diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c index 6a6fe89..fb4777c 100644 --- a/arch/x86/xen/irq.c +++ b/arch/x86/xen/irq.c @@ -100,6 +100,9 @@ PV_CALLEE_SAVE_REGS_THUNK(xen_irq_enable); static void xen_safe_halt(void) { + if (xen_domain_type == XEN_PV_IN_HVM) + local_irq_enable(); + /* Blocking includes an implicit local_irq_enable(). */ if (HYPERVISOR_sched_op(SCHEDOP_block, NULL) != 0) BUG(); @@ -114,15 +117,21 @@ static void xen_halt(void) } static const struct pv_irq_ops xen_irq_ops __initdata = { +#if 0 .save_fl = PV_CALLEE_SAVE(xen_save_fl), .restore_fl = PV_CALLEE_SAVE(xen_restore_fl), .irq_disable = PV_CALLEE_SAVE(xen_irq_disable), .irq_enable = PV_CALLEE_SAVE(xen_irq_enable), +#endif + .save_fl = __PV_IS_CALLEE_SAVE(native_save_fl), + .restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl), + .irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable), + .irq_enable = __PV_IS_CALLEE_SAVE(native_irq_enable), .safe_halt = xen_safe_halt, .halt = xen_halt, #ifdef CONFIG_X86_64 - .adjust_exception_frame = xen_adjust_exception_frame, + .adjust_exception_frame = paravirt_nop, #endif }; diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index f298bd7..978d4be 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c @@ -2047,8 +2047,8 @@ static void xen_leave_lazy_mmu(void) } static const struct pv_mmu_ops xen_mmu_ops __initdata = { - .read_cr2 = xen_read_cr2, - .write_cr2 = xen_write_cr2, + .read_cr2 = native_read_cr2, + .write_cr2 = native_write_cr2, .read_cr3 = xen_read_cr3, #ifdef CONFIG_X86_32 diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index adaf127..3a4d9c3 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c @@ -394,9 +394,9 @@ void __cpuinit xen_enable_syscall(void) void __init xen_arch_setup(void) { xen_panic_handler_init(); - - HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments); HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_writable_pagetables); +#if 0 + HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_4gb_segments); if (!xen_feature(XENFEAT_auto_translated_physmap)) HYPERVISOR_vm_assist(VMASST_CMD_enable, @@ -415,6 +415,7 @@ void __init xen_arch_setup(void) disable_acpi(); } #endif +#endif memcpy(boot_command_line, xen_start_info->cmd_line, MAX_GUEST_CMDLINE > COMMAND_LINE_SIZE ? diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S index aaa7291..9d0e0e3 100644 --- a/arch/x86/xen/xen-head.S +++ b/arch/x86/xen/xen-head.S @@ -16,6 +16,7 @@ __INIT ENTRY(startup_xen) cld + sti #ifdef CONFIG_X86_32 mov %esi,xen_start_info mov $init_thread_union+THREAD_SIZE,%esp diff --git a/config.sav b/config.sav index ce59406..fb7aff2 100644 --- a/config.sav +++ b/config.sav @@ -1,7 +1,7 @@ # # Automatically generated make config: don't edit # Linux/x86_64 2.6.39 Kernel Configuration -# Thu May 26 11:28:17 2011 +# Mon Jul 25 15:31:44 2011 # CONFIG_64BIT=y # CONFIG_X86_32 is not set @@ -153,7 +153,7 @@ CONFIG_RD_BZIP2=y CONFIG_RD_LZMA=y CONFIG_RD_XZ=y CONFIG_RD_LZO=y -CONFIG_CC_OPTIMIZE_FOR_SIZE=y +# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set CONFIG_SYSCTL=y CONFIG_ANON_INODES=y # CONFIG_EXPERT is not set @@ -190,7 +190,6 @@ CONFIG_PCI_QUIRKS=y CONFIG_SLAB=y # CONFIG_SLUB is not set CONFIG_PROFILING=y -CONFIG_TRACEPOINTS=y CONFIG_OPROFILE=m # CONFIG_OPROFILE_EVENT_MULTIPLEX is not set CONFIG_HAVE_OPROFILE=y @@ -294,7 +293,7 @@ CONFIG_X86_SUPPORTS_MEMORY_FAILURE=y CONFIG_SCHED_OMIT_FRAME_POINTER=y CONFIG_PARAVIRT_GUEST=y CONFIG_XEN=y -CONFIG_XEN_DOM0=y +CONFIG_XEN_DOM0=n CONFIG_XEN_PRIVILEGED_GUEST=y CONFIG_XEN_PVHVM=y CONFIG_XEN_MAX_DOMAIN_MEMORY=128 @@ -1046,7 +1045,6 @@ CONFIG_XPS=y # CONFIG_NET_PKTGEN=m # CONFIG_NET_TCPPROBE is not set -CONFIG_NET_DROP_MONITOR=y CONFIG_HAMRADIO=y # @@ -1956,7 +1954,6 @@ CONFIG_IWLAGN=m CONFIG_IWLWIFI_DEBUG=y CONFIG_IWLWIFI_DEBUGFS=y # CONFIG_IWLWIFI_DEBUG_EXPERIMENTAL_UCODE is not set -# CONFIG_IWLWIFI_DEVICE_TRACING is not set # CONFIG_IWL_P2P is not set CONFIG_IWLWIFI_LEGACY=m @@ -1965,12 +1962,10 @@ CONFIG_IWLWIFI_LEGACY=m # # CONFIG_IWLWIFI_LEGACY_DEBUG is not set # CONFIG_IWLWIFI_LEGACY_DEBUGFS is not set -# CONFIG_IWLWIFI_LEGACY_DEVICE_TRACING is not set CONFIG_IWL4965=m CONFIG_IWL3945=m CONFIG_IWM=m # CONFIG_IWM_DEBUG is not set -# CONFIG_IWM_TRACING is not set CONFIG_LIBERTAS=m CONFIG_LIBERTAS_USB=m CONFIG_LIBERTAS_CS=m @@ -4546,7 +4541,7 @@ CONFIG_DLM_DEBUG=y # # Kernel hacking # -CONFIG_TRACE_IRQFLAGS_SUPPORT=y +# CONFIG_TRACE_IRQFLAGS_SUPPORT is not set # CONFIG_PRINTK_TIME is not set CONFIG_DEFAULT_MESSAGE_LOGLEVEL=4 # CONFIG_ENABLE_WARN_DEPRECATED is not set @@ -4575,10 +4570,7 @@ CONFIG_TIMER_STATS=y # CONFIG_RT_MUTEX_TESTER is not set # CONFIG_DEBUG_SPINLOCK is not set # CONFIG_DEBUG_MUTEXES is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set -# CONFIG_PROVE_LOCKING is not set # CONFIG_SPARSE_RCU_POINTER is not set -# CONFIG_LOCK_STAT is not set # CONFIG_DEBUG_SPINLOCK_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set CONFIG_STACKTRACE=y @@ -4611,8 +4603,6 @@ CONFIG_LATENCYTOP=y # CONFIG_SYSCTL_SYSCALL_CHECK is not set # CONFIG_DEBUG_PAGEALLOC is not set CONFIG_USER_STACKTRACE_SUPPORT=y -CONFIG_NOP_TRACER=y -CONFIG_HAVE_FTRACE_NMI_ENTER=y CONFIG_HAVE_FUNCTION_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y CONFIG_HAVE_FUNCTION_GRAPH_FP_TEST=y @@ -4621,34 +4611,8 @@ CONFIG_HAVE_DYNAMIC_FTRACE=y CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y CONFIG_HAVE_SYSCALL_TRACEPOINTS=y CONFIG_HAVE_C_RECORDMCOUNT=y -CONFIG_TRACER_MAX_TRACE=y CONFIG_RING_BUFFER=y -CONFIG_FTRACE_NMI_ENTER=y -CONFIG_EVENT_TRACING=y -CONFIG_EVENT_POWER_TRACING_DEPRECATED=y -CONFIG_CONTEXT_SWITCH_TRACER=y CONFIG_RING_BUFFER_ALLOW_SWAP=y -CONFIG_TRACING=y -CONFIG_GENERIC_TRACER=y -CONFIG_TRACING_SUPPORT=y -CONFIG_FTRACE=y -CONFIG_FUNCTION_TRACER=y -CONFIG_FUNCTION_GRAPH_TRACER=y -# CONFIG_IRQSOFF_TRACER is not set -CONFIG_SCHED_TRACER=y -CONFIG_FTRACE_SYSCALLS=y -CONFIG_BRANCH_PROFILE_NONE=y -# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set -# CONFIG_PROFILE_ALL_BRANCHES is not set -CONFIG_STACK_TRACER=y -CONFIG_BLK_DEV_IO_TRACE=y -CONFIG_KPROBE_EVENT=y -CONFIG_DYNAMIC_FTRACE=y -CONFIG_FUNCTION_PROFILER=y -CONFIG_FTRACE_MCOUNT_RECORD=y -# CONFIG_FTRACE_STARTUP_TEST is not set -# CONFIG_MMIOTRACE is not set -CONFIG_RING_BUFFER_BENCHMARK=m CONFIG_PROVIDE_OHCI1394_DMA_INIT=y # CONFIG_FIREWIRE_OHCI_REMOTE_DMA is not set CONFIG_BUILD_DOCSRC=y @@ -4665,6 +4629,7 @@ CONFIG_KGDB_TESTS=y # CONFIG_KGDB_LOW_LEVEL_TRAP is not set # CONFIG_KGDB_KDB is not set CONFIG_HAVE_ARCH_KMEMCHECK=y +# CONFIG_KMEMCHECK is not set # CONFIG_TEST_KSTRTOX is not set CONFIG_STRICT_DEVMEM=y # CONFIG_X86_VERBOSE_BOOTUP is not set @@ -4863,13 +4828,12 @@ CONFIG_VIRTUALIZATION=y CONFIG_KVM=m CONFIG_KVM_INTEL=m CONFIG_KVM_AMD=m -# CONFIG_KVM_MMU_AUDIT is not set # CONFIG_VHOST_NET is not set CONFIG_VIRTIO=m CONFIG_VIRTIO_RING=m CONFIG_VIRTIO_PCI=m CONFIG_VIRTIO_BALLOON=m -CONFIG_BINARY_PRINTF=y +# CONFIG_BINARY_PRINTF is not set # # Library routines diff --git a/drivers/tty/serial/8250.c b/drivers/tty/serial/8250.c index 6611535..1f52fd1 100644 --- a/drivers/tty/serial/8250.c +++ b/drivers/tty/serial/8250.c @@ -3294,6 +3294,8 @@ static int __init serial8250_init(void) { int ret; +return -ENODEV; + if (nr_uarts > UART_NR) nr_uarts = UART_NR; diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 33167b4..9133641 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c @@ -1579,7 +1579,8 @@ int xen_set_callback_via(uint64_t via) } EXPORT_SYMBOL_GPL(xen_set_callback_via); -#ifdef CONFIG_XEN_PVHVM +#ifdef CONFIG_XEN_PVHVM +/* #if 1 */ /* Vector callbacks are better than PCI interrupts to receive event * channel notifications because we can receive vector callbacks on any * vcpu and we don't need PCI support or APIC interactions. */ @@ -1632,5 +1633,7 @@ void __init xen_init_IRQ(void) irq_ctx_init(smp_processor_id()); if (xen_initial_domain()) xen_setup_pirqs(); + if (xen_domain_type == XEN_PV_IN_HVM) + xen_callback_vector(); } } diff --git a/include/xen/xen.h b/include/xen/xen.h index a164024..96ad928 100644 --- a/include/xen/xen.h +++ b/include/xen/xen.h @@ -4,6 +4,7 @@ enum xen_domain_type { XEN_NATIVE, /* running on bare hardware */ XEN_PV_DOMAIN, /* running in a PV domain */ + XEN_PV_IN_HVM, /* running PV in HVM container */ XEN_HVM_DOMAIN, /* running in a Xen hvm domain */ }; @@ -15,7 +16,8 @@ extern enum xen_domain_type xen_domain_type; #define xen_domain() (xen_domain_type != XEN_NATIVE) #define xen_pv_domain() (xen_domain() && \ - xen_domain_type == XEN_PV_DOMAIN) + (xen_domain_type == XEN_PV_DOMAIN || \ + xen_domain_type == XEN_PV_IN_HVM)) #define xen_hvm_domain() (xen_domain() && \ xen_domain_type == XEN_HVM_DOMAIN)