]> xenbits.xensource.com Git - people/andrewcoop/xen-test-framework.git/commitdiff
Pass _ASM_EXTABLE_HANDLER() references by asm() parameter
authorAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 11 Apr 2017 10:38:50 +0000 (11:38 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 11 Apr 2017 17:41:22 +0000 (18:41 +0100)
... rather than embedding a reference directly.  This makes LTO aware of the
reference (rather than finding no C-level references, dropping the functions
and subsequently failing to link), and allows local fault handlers to be
static.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
arch/x86/include/arch/extable.h
arch/x86/include/arch/lib.h
tests/cpuid-faulting/main.c
tests/fpu-exception-emulation/main.c
tests/xsa-173/main.c
tests/xsa-186/main.c
tests/xsa-191/main.c
tests/xsa-192/main.c
tests/xsa-196/main.c
tests/xsa-200/main.c

index 3039d16931376c696f2d9707a144c97ec95fd74b..792f26ca2a82c21508625115c1e6a271dea0fb12 100644 (file)
@@ -15,8 +15,8 @@
  * Sample usage:
  * <pre>
  *   asm volatile ("1: $INSN; 2:"
- *                 _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
- *                 : "=a" (fault) : "0" (0));
+ *                 _ASM_EXTABLE_HANDLER(1b, 2b, @%c[ex])
+ *                 : "=a" (fault) : "0" (0), [ex] "i" (ex_record_fault_eax));
  * </pre>
  */
 bool ex_record_fault_eax(struct cpu_regs *regs, const struct extable_entry *ex);
@@ -27,8 +27,8 @@ bool ex_record_fault_eax(struct cpu_regs *regs, const struct extable_entry *ex);
  * Sample usage:
  * <pre>
  *   asm volatile ("1: $INSN; 2:"
- *                 _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
- *                 : "=D" (fault) : "0" (0));
+ *                 _ASM_EXTABLE_HANDLER(1b, 2b, @%c[ex])
+ *                 : "=D" (fault) : "0" (0), [ex] "i" (ex_record_fault_edi));
  * </pre>
  */
 bool ex_record_fault_edi(struct cpu_regs *regs, const struct extable_entry *ex);
index 405343c98a40b85e182749da77f4393622231612..961274a494335ae3bb6a2a9355c30eed13e3e99a 100644 (file)
@@ -19,9 +19,9 @@ static inline bool rdmsr_safe(uint32_t idx, uint64_t *val)
     uint32_t lo, hi, new_idx;
 
     asm volatile("1: rdmsr; 2:"
-                 _ASM_EXTABLE_HANDLER(1b, 2b, ex_rdmsr_safe)
+                 _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                  : "=a" (lo), "=d" (hi), "=c" (new_idx)
-                 : "c" (idx));
+                 : "c" (idx), [ex] "i" (ex_rdmsr_safe));
 
     bool fault = idx != new_idx;
 
@@ -43,10 +43,11 @@ static inline bool wrmsr_safe(uint32_t idx, uint64_t val)
     uint32_t new_idx;
 
     asm volatile ("1: wrmsr; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_wrmsr_safe)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                   : "=c" (new_idx)
                   : "c" (idx), "a" ((uint32_t)val),
-                    "d" ((uint32_t)(val >> 32)));
+                    "d" ((uint32_t)(val >> 32)),
+                    [ex] "i" (ex_wrmsr_safe));
 
     return idx != new_idx;
 }
index 27265766b7301e94764e0d7e3928a32a82a9f2a9..cc1baa375176d8f662808d1987e3c9c5b1284ab7 100644 (file)
@@ -34,9 +34,9 @@ unsigned long stub_cpuid(void)
     unsigned int fault = 0, tmp;
 
     asm volatile("1: cpuid; 2:"
-                 _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+                 _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                  : "=a" (tmp), "+D" (fault)
-                 : "a" (0)
+                 : "a" (0), [ex] "i" (ex_record_fault_edi)
                  : "ebx", "ecx", "edx");
 
     return fault;
@@ -48,9 +48,9 @@ unsigned long stub_fep_cpuid(void)
 
     asm volatile(_ASM_XEN_FEP
                  "1: cpuid; 2:"
-                 _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+                 _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                  : "=a" (tmp), "+D" (fault)
-                 : "a" (0)
+                 : "a" (0), [ex] "i" (ex_record_fault_edi)
                  : "ebx", "ecx", "edx");
 
     return fault;
index b30b1b302be8b06e590c82f1db57c6ca4138937a..24ec1dff0574d5a586d43ffb72a9a8941bce0863 100644 (file)
@@ -77,9 +77,10 @@ exinfo_t probe_x87(bool force)
                   "jz 1f;"
                   _ASM_XEN_FEP
                   "1: fnop; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                   : "+a" (fault)
-                  : [fep] "q" (force));
+                  : [fep] "q" (force),
+                    [ex]  "i" (ex_record_fault_eax));
 
     return fault;
 }
@@ -109,9 +110,10 @@ exinfo_t probe_x87_wait(bool force)
                   "jz 1f;"
                   _ASM_XEN_FEP
                   "1: wait; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                   : "+a" (fault)
-                  : [fep] "q" (force));
+                  : [fep] "q" (force),
+                    [ex]  "i" (ex_record_fault_eax));
 
     return fault;
 }
@@ -140,9 +142,10 @@ exinfo_t probe_mmx(bool force)
                   "jz 1f;"
                   _ASM_XEN_FEP
                   "1: movq %%mm0, %%mm0; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                   : "+a" (fault)
-                  : [fep] "q" (force));
+                  : [fep] "q" (force),
+                    [ex]  "i" (ex_record_fault_eax));
 
     return fault;
 }
@@ -155,9 +158,10 @@ exinfo_t probe_sse(bool force)
                   "jz 1f;"
                   _ASM_XEN_FEP
                   "1: movups %%xmm0, %%xmm0; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                   : "+a" (fault)
-                  : [fep] "q" (force));
+                  : [fep] "q" (force),
+                    [ex]  "i" (ex_record_fault_eax));
 
     return fault;
 }
index e0f10f5cfbf8b8826d98cc84a0beb3ce3843426f..a4bc6de6a89b28b1891d58d7368bccd0871bd127 100644 (file)
@@ -33,7 +33,7 @@ uint64_t nl2[PAE_L2_PT_ENTRIES] __aligned(PAGE_SIZE);
 
 static bool seen_fault;
 
-bool ex_fault(struct cpu_regs *regs, const struct extable_entry *ex)
+static bool ex_fault(struct cpu_regs *regs, const struct extable_entry *ex)
 {
     /* Expect to see #PF indicating that a reserved bits was set. */
     if ( regs->entry_vector == X86_EXC_PF &&
@@ -66,9 +66,10 @@ void test_main(void)
     ptr = _p((4ULL << PAE_L3_PT_SHIFT) + MB(1));
 
     asm volatile ("1:mov (%[ptr]), %[val]; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_fault)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                   : [val] "=q" (val)
-                  : [ptr] "r" (ptr)
+                  : [ptr] "r" (ptr),
+                    [ex]  "i" (ex_fault)
                   : "memory");
 
     if ( seen_fault )
index 1d6367dd4cf674723de1073d4b36e3137d966f3f..869c9d526702047dc81d82a36d68094463de3b65 100644 (file)
@@ -61,7 +61,7 @@ asm(".align 16;"
     "insn_stub_end:;"
     );
 
-bool ex_fault(struct cpu_regs *regs, const struct extable_entry *ex)
+static bool ex_fault(struct cpu_regs *regs, const struct extable_entry *ex)
 {
     if ( regs->entry_vector == X86_EXC_GP && regs->error_code == 0 )
     {
@@ -178,10 +178,11 @@ void test_main(void)
      * instructions don't get lost.
      */
     asm volatile ("call *%[ptr];"
-                  _ASM_EXTABLE_HANDLER(-1, 0, ex_fault)
+                  _ASM_EXTABLE_HANDLER(-1, 0, %c[ex])
                   : "=a" (res)
                   : "0" (0),
-                    [ptr] "r" (stub)
+                    [ptr] "r" (stub),
+                    [ex]  "i" (ex_fault)
                   : "memory");
 
     if ( res != 0xc0de )
index 7bc29a769f3a91e1dd9f473fe11629b952516389..d78c95c90e270ad94b1a73c6fe9d0017bb7903ae 100644 (file)
@@ -44,10 +44,11 @@ void test_main(void)
     write_fs(0);
     asm volatile (_ASM_XEN_FEP
                   "1: mov %%fs:0, %[dst]; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                   : "=D" (fault),
                     [dst] "=r" (tmp)
-                  : "D" (0));
+                  : "D" (0),
+                    [ex] "i" (ex_record_fault_edi));
 
     switch ( fault )
     {
@@ -82,10 +83,11 @@ void test_main(void)
 
     asm volatile (_ASM_XEN_FEP
                   "1: mov %[sel], %%fs; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                   : "=a" (fault)
                   : "a" (0),
-                    [sel] "r" (4));
+                    [sel] "r" (4),
+                    [ex]  "i" (ex_record_fault_eax));
 
     switch ( fault )
     {
index c930e9d7a0f74cb342bcc24606f8e1b89147fc25..8d72cb73ebf015835ed7d9f0333f545f32022609 100644 (file)
@@ -69,9 +69,10 @@ unsigned long user_ldt_use(void)
 
     /* Attempt to load %fs from the LDT. */
     asm volatile ("1: mov %[sel], %%fs; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                   : "+a" (fault)
-                  : [sel] "r" (LDT_SEL));
+                  : [sel] "r" (LDT_SEL),
+                    [ex]  "i" (ex_record_fault_eax));
 
     return fault;
 }
index 4a0ec1294809098e11d403c30aa500947e51cf8d..3f03092a1c5ff1ad5cfecf64439bceef5fa99a31 100644 (file)
@@ -56,7 +56,7 @@ unsigned long compat_userspace(void)
                   "start_32bit:;"
                   _ASM_XEN_FEP
                   "1: int $%c[df]; 2:"
-                  _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_eax)
+                  _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
 
                   /* Return to 64bit. */
                   "ljmpl $%c[cs], $1f;"
@@ -66,7 +66,8 @@ unsigned long compat_userspace(void)
                   : "+a" (fault)
                   : [df]   "i" (X86_EXC_DF),
                     [cs32] "i" (GDTE_CS32_DPL3 * 8 + 3),
-                    [cs]   "i" (__USER_CS));
+                    [cs]   "i" (__USER_CS),
+                    [ex]   "i" (ex_record_fault_eax));
 
     return fault;
 }
index fd30c4dd9cabdfd4e8a9e9eb1018fcdee9e78888..69b1d3c21b1ee5ce04a80ce1447450e157f3ce49 100644 (file)
@@ -45,10 +45,10 @@ void test_main(void)
     {
         /* Poke the emulator. */
         asm volatile (_ASM_XEN_FEP "1: .byte 0x66; cmpxchg8b %[ptr]; 2:"
-                      _ASM_EXTABLE_HANDLER(1b, 2b, ex_record_fault_edi)
+                      _ASM_EXTABLE_HANDLER(1b, 2b, %c[ex])
                       : "=A" (prev), [ptr] "+m" (mem), "+D" (fault)
                       : "c" ((uint32_t)(new >> 32)), "b" ((uint32_t)new),
-                        "0" (old));
+                        "0" (old), [ex] "i" (ex_record_fault_edi));
 
         if ( fault == EXINFO_SYM(UD, 0) )
             return xtf_success("Success: Not vulnerable to XSA-200\n");