[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XTF PATCH] x86: Remove Xen as a hard requirement to run XTF.
If Xen isn't detected on CPUID, then: * Skip setting up Xenbus/PV-console/shared_info/hypercalls/qemu-debug. * Register COM1 as an output callback. This patch enables running XTF on QEMU-TCG/KVM out of the box. And a minor tweaks to set up baud rate make it work on real hardware too. Signed-off-by: Alejandro Vallejo <alejandro.garciavallejo@xxxxxxx> --- I tested PV and HVM still run fine under Xen, and I did account for viridian-enlightened guests, though I didn't test them. --- arch/x86/setup.c | 68 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 13 deletions(-) diff --git a/arch/x86/setup.c b/arch/x86/setup.c index 2ac212e..6172c7e 100644 --- a/arch/x86/setup.c +++ b/arch/x86/setup.c @@ -31,6 +31,8 @@ const char environment_description[] = ENVIRONMENT_DESCRIPTION; shared_info_t shared_info __page_aligned_bss; +static bool has_xen_hypervisor; + static void collect_cpuid(cpuid_count_fn_t cpuid_fn) { unsigned int tmp, eax, ebx, ecx, edx, addr = 0; @@ -243,11 +245,19 @@ static void map_shared_info(void) panic("Failed to map shared_info: %d\n", rc); } +static void pio_write(uint16_t port, const char *buf, size_t len) +{ + asm volatile("rep; outsb" : "+S" (buf), "+c" (len) : "d" (port)); +} + static void qemu_console_write(const char *buf, size_t len) { - asm volatile("rep outsb" - : "+S" (buf), "+c" (len) - : "d" (0x12)); + pio_write(0x12, buf, len); +} + +static void com1_console_write(const char *buf, size_t len) +{ + pio_write(0x3f8, buf, len); } static void xen_console_write(const char *buf, size_t len) @@ -255,12 +265,41 @@ static void xen_console_write(const char *buf, size_t len) hypercall_console_write(buf, len); } +static bool detect_xen_runtime(void) +{ + uint32_t eax, ebx, ecx, edx; + + /* PV tests always run under Xen */ + if ( IS_DEFINED(CONFIG_PV) ) + return true; + + /* HVM tests may additionally run on non-Xen hypervisors or baremetal */ + cpuid_count(0x40000000, 0, &eax, &ebx, &ecx, &edx); + if ( ebx == XEN_CPUID_SIGNATURE_EBX && + ecx == XEN_CPUID_SIGNATURE_ECX && + edx == XEN_CPUID_SIGNATURE_EDX ) + return true; + + /* Viridian guests have the Xen leaves higher up, so check there too */ + cpuid_count(0x40000100, 0, &eax, &ebx, &ecx, &edx); + return ebx == XEN_CPUID_SIGNATURE_EBX && + ecx == XEN_CPUID_SIGNATURE_ECX && + edx == XEN_CPUID_SIGNATURE_EDX; +} + void arch_setup(void) { - if ( IS_DEFINED(CONFIG_HVM) && !pvh_start_info ) - register_console_callback(qemu_console_write); + has_xen_hypervisor = detect_xen_runtime(); + + if ( has_xen_hypervisor ) + { + if ( IS_DEFINED(CONFIG_HVM) && !pvh_start_info ) + register_console_callback(qemu_console_write); - register_console_callback(xen_console_write); + register_console_callback(xen_console_write); + } + else + register_console_callback(com1_console_write); collect_cpuid(IS_DEFINED(CONFIG_PV) ? pv_cpuid_count : cpuid_count); @@ -268,15 +307,18 @@ void arch_setup(void) arch_init_traps(); - init_hypercalls(); - - if ( !is_initdomain() ) + if ( has_xen_hypervisor ) { - setup_pv_console(); - setup_xenbus(); - } + init_hypercalls(); - map_shared_info(); + if ( !is_initdomain() ) + { + setup_pv_console(); + setup_xenbus(); + } + + map_shared_info(); + } } int arch_get_domid(void) base-commit: 0cbf4c35b06b2b285fc325b8458132e844c5cf0e -- 2.43.0
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |