]> xenbits.xensource.com Git - xen.git/commitdiff
x86: fix get_cpu_info() when built with clang
authorAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 10 Feb 2016 13:51:25 +0000 (14:51 +0100)
committerJan Beulich <jbeulich@suse.com>
Wed, 10 Feb 2016 13:51:25 +0000 (14:51 +0100)
Clang understands the GCCism in use here, but still complains that sp is
unintialised.  In such cases, resort to the older version of this code, which
directly reads %rsp into the temporary variable.

Note that we still keep the GCCism in the default case, as it causes GCC to
create rather better assembly.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
xen/include/asm-x86/current.h

index f011d2d2a0e456aa6f5396dbf4c1a6e14d36ae75..15b99ff8c0bd5aabf9962f07f700e66223474e56 100644 (file)
@@ -47,7 +47,13 @@ struct cpu_info {
 
 static inline struct cpu_info *get_cpu_info(void)
 {
+#ifdef __clang__
+    /* Clang complains that sp in the else case is not initialised. */
+    unsigned long sp;
+    asm ( "mov %%rsp, %0" : "=r" (sp) );
+#else
     register unsigned long sp asm("rsp");
+#endif
 
     return (struct cpu_info *)((sp & ~(STACK_SIZE-1)) + STACK_SIZE) - 1;
 }