]> xenbits.xensource.com Git - people/royger/xen.git/commitdiff
x86: clone Linux'es ASM_CALL_CONSTRAINT
authorJan Beulich <jbeulich@suse.com>
Fri, 17 May 2019 12:35:52 +0000 (14:35 +0200)
committerJan Beulich <jbeulich@suse.com>
Fri, 17 May 2019 12:35:52 +0000 (14:35 +0200)
While we don't mean to run their objtool over our generated code, it
still seems desirable to avoid calls to further functions before a
function's frame pointer is set up.

Suggested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Wei Liu <wei.liu2@citrix.com>
xen/arch/x86/efi/stub.c
xen/arch/x86/extable.c
xen/arch/x86/x86_emulate/x86_emulate.c
xen/include/asm-x86/asm_defns.h
xen/include/asm-x86/guest/hypercall.h

index 0c481e3235253489327ebb61d15b51b6812d81d9..c578bffc71d48178eb1e4b469773830ee1b38fc0 100644 (file)
@@ -2,8 +2,9 @@
 #include <xen/errno.h>
 #include <xen/init.h>
 #include <xen/lib.h>
-#include <asm/page.h>
+#include <asm/asm_defns.h>
 #include <asm/efibind.h>
+#include <asm/page.h>
 #include <efi/efidef.h>
 #include <efi/eficapsule.h>
 #include <efi/eficon.h>
@@ -34,10 +35,11 @@ void __init noreturn efi_multiboot2(EFI_HANDLE ImageHandle,
      * not be directly supported by C compiler.
      */
     asm volatile(
-    "    call *%3                     \n"
+    "    call *%[outstr]              \n"
     "0:  hlt                          \n"
     "    jmp  0b                      \n"
-       : "+c" (StdErr), "=d" (StdErr) : "1" (err), "rm" (StdErr->OutputString)
+       : "+c" (StdErr), "=d" (StdErr) ASM_CALL_CONSTRAINT
+       : "1" (err), [outstr] "rm" (StdErr->OutputString)
        : "rax", "r8", "r9", "r10", "r11", "memory");
 
     unreachable();
index a6430a6d8dc902392bd78462db816d7bff846542..70972f108557e6e6ef6059aa95992cae9f8e96af 100644 (file)
@@ -168,7 +168,7 @@ static int __init stub_selftest(void)
                        "jmp .Lret%=\n\t"
                        ".popsection\n\t"
                        _ASM_EXTABLE(.Lret%=, .Lfix%=)
-                       : [exn] "+m" (res)
+                       : [exn] "+m" (res) ASM_CALL_CONSTRAINT
                        : [stb] "r" (addr), "a" (tests[i].rax));
 
         if ( res.raw != tests[i].res.raw )
index f5989f3071358628946f9b708910c7a6cfde48d5..75ce0172dc40f44ec288f1204d3d485c97fe7121 100644 (file)
@@ -1122,7 +1122,8 @@ static inline int mkec(uint8_t e, int32_t ec, ...)
                    "jmp .Lret%=\n\t"                                    \
                    ".popsection\n\t"                                    \
                    _ASM_EXTABLE(.Lret%=, .Lfix%=)                       \
-                   : [exn] "+g" (stub_exn.info), constraints,           \
+                   : [exn] "+g" (stub_exn.info) ASM_CALL_CONSTRAINT,    \
+                     constraints,                                       \
                      [stub] "r" (stub.func),                            \
                      "m" (*(uint8_t(*)[MAX_INST_LEN + 1])stub.ptr) );   \
     if ( unlikely(~stub_exn.info.raw) )                                 \
index e688cf1c1611ab803bd3fa9d3bee09bf2f74ccd8..4fe5556a347826ba08b349d899a17c47539939c4 100644 (file)
@@ -25,6 +25,19 @@ asm ( "\t.equ CONFIG_INDIRECT_THUNK, "
 
 #ifndef __ASSEMBLY__
 void ret_from_intr(void);
+
+/*
+ * This output constraint should be used for any inline asm which has a "call"
+ * instruction.  Otherwise the asm may be inserted before the frame pointer
+ * gets set up by the containing function.
+ */
+#ifdef CONFIG_FRAME_POINTER
+register unsigned long current_stack_pointer asm("rsp");
+# define ASM_CALL_CONSTRAINT , "+r" (current_stack_pointer)
+#else
+# define ASM_CALL_CONSTRAINT
+#endif
+
 #endif
 
 #ifndef NDEBUG
index e9e626b474883551afa6a7d58493c243c2364b68..d548816b30a018c8a6b9af07c024a20bf5270b44 100644 (file)
@@ -40,7 +40,7 @@
         long res, tmp__;                                                \
         asm volatile (                                                  \
             "call hypercall_page + %c[offset]"                          \
-            : "=a" (res), "=D" (tmp__)                                  \
+            : "=a" (res), "=D" (tmp__) ASM_CALL_CONSTRAINT              \
             : [offset] "i" (hcall * 32),                                \
               "1" ((long)(a1))                                          \
             : "memory" );                                               \
@@ -53,6 +53,7 @@
         asm volatile (                                                  \
             "call hypercall_page + %c[offset]"                          \
             : "=a" (res), "=D" (tmp__), "=S" (tmp__)                    \
+              ASM_CALL_CONSTRAINT                                       \
             : [offset] "i" (hcall * 32),                                \
               "1" ((long)(a1)), "2" ((long)(a2))                        \
             : "memory" );                                               \
@@ -65,6 +66,7 @@
         asm volatile (                                                  \
             "call hypercall_page + %c[offset]"                          \
             : "=a" (res), "=D" (tmp__), "=S" (tmp__), "=d" (tmp__)      \
+              ASM_CALL_CONSTRAINT                                       \
             : [offset] "i" (hcall * 32),                                \
               "1" ((long)(a1)), "2" ((long)(a2)), "3" ((long)(a3))      \
             : "memory" );                                               \
@@ -78,7 +80,7 @@
         asm volatile (                                                  \
             "call hypercall_page + %c[offset]"                          \
             : "=a" (res), "=D" (tmp__), "=S" (tmp__), "=d" (tmp__),     \
-              "=&r" (tmp__)                                             \
+              "=&r" (tmp__) ASM_CALL_CONSTRAINT                         \
             : [offset] "i" (hcall * 32),                                \
               "1" ((long)(a1)), "2" ((long)(a2)), "3" ((long)(a3)),     \
               "4" (_a4)                                                 \