[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] xen,x86: introduce tcg_errata



The TCG emulator in QEMU is not good enough to pass the the tests in
stub_selftest. Detect if Xen is running on TCG early, then drop the
tests if it is the case.

Signed-off-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>

diff --git a/xen/arch/x86/cpu/common.c b/xen/arch/x86/cpu/common.c
index 4306e59..4229b30 100644
--- a/xen/arch/x86/cpu/common.c
+++ b/xen/arch/x86/cpu/common.c
@@ -621,6 +621,18 @@ void detect_ht(struct cpuinfo_x86 *c)
        }
 }
 
+bool tcg_errata = false;
+void __init detect_tcg_errata(void)
+{
+       uint32_t base, eax, signature[3];
+       char *sig = "TCGTCGTCGTCG";
+
+       base = 0x40000000;
+       cpuid(base, &eax, &signature[0], &signature[1], &signature[2]);
+       if ( !memcmp(sig, signature, 12) )
+               tcg_errata = true;
+}
+
 unsigned int __init apicid_to_socket(unsigned int apicid)
 {
        unsigned int dummy;
diff --git a/xen/arch/x86/extable.c b/xen/arch/x86/extable.c
index 72f30d9..6255f72 100644
--- a/xen/arch/x86/extable.c
+++ b/xen/arch/x86/extable.c
@@ -146,6 +146,9 @@ static int __init stub_selftest(void)
     unsigned long addr = this_cpu(stubs.addr) + STUB_BUF_SIZE / 2;
     unsigned int i;
 
+    if ( tcg_errata )
+        return 0;
+
     printk("Running stub recovery selftests...\n");
 
     for ( i = 0; i < ARRAY_SIZE(tests); ++i )
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
index 9407247..e33b76a 100644
--- a/xen/arch/x86/setup.c
+++ b/xen/arch/x86/setup.c
@@ -1521,6 +1521,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
     early_microcode_init();
 
     identify_cpu(&boot_cpu_data);
+    detect_tcg_errata();
 
     set_in_cr4(X86_CR4_OSFXSR | X86_CR4_OSXMMEXCPT);
 
diff --git a/xen/include/asm-x86/processor.h b/xen/include/asm-x86/processor.h
index e8c2f02..96b6125 100644
--- a/xen/include/asm-x86/processor.h
+++ b/xen/include/asm-x86/processor.h
@@ -169,6 +169,9 @@ extern void detect_extended_topology(struct cpuinfo_x86 *c);
 
 extern void detect_ht(struct cpuinfo_x86 *c);
 
+extern bool tcg_errata;
+extern void detect_tcg_errata(void);
+
 #define cpu_to_core(_cpu)   (cpu_data[_cpu].cpu_core_id)
 #define cpu_to_socket(_cpu) (cpu_data[_cpu].phys_proc_id)
 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.