]> xenbits.xensource.com Git - people/andrewcoop/xen-test-framework.git/commitdiff
Introduce _u() to compliement _p()
authorAndrew Cooper <andrew.cooper3@citrix.com>
Thu, 16 Jun 2016 10:28:07 +0000 (11:28 +0100)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Wed, 26 Apr 2017 18:15:05 +0000 (19:15 +0100)
This wraps (unsigned long) casts when pointers are needed to be handled as
integers.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
17 files changed:
arch/x86/desc.c
arch/x86/hvm/traps.c
arch/x86/include/arch/mm.h
arch/x86/pv/traps.c
arch/x86/setup.c
arch/x86/traps.c
include/xtf/numbers.h
tests/invlpg/main.c
tests/lbr-tsx-vmentry/main.c
tests/selftest/main.c
tests/xsa-186/main.c
tests/xsa-191/main.c
tests/xsa-192/main.c
tests/xsa-194/main.c
tests/xsa-195/main.c
tests/xsa-196/main.c
tests/xsa-204/main.c

index 7f8b80af264aa65a028158520c4df792615f3d5f..e695d4993359f583a2f224419ab576fd15181011 100644 (file)
@@ -1,3 +1,5 @@
+#include <xtf/numbers.h>
+
 #include <arch/desc.h>
 #include <arch/segment.h>
 #include <arch/symbolic-const.h>
@@ -19,7 +21,7 @@ user_desc gdt[NR_GDT_ENTRIES] =
 desc_ptr gdt_ptr =
 {
     .limit = sizeof(gdt) - 1,
-    .base = (unsigned long)&gdt,
+    .base = _u(&gdt),
 };
 
 #if defined(CONFIG_HVM)
@@ -29,7 +31,7 @@ gate_desc idt[256] = { };
 desc_ptr idt_ptr =
 {
     .limit = sizeof(idt) - 1,
-    .base = (unsigned long)&idt,
+    .base = _u(&idt),
 };
 
 #endif
index 102af86453f39bd250d52a42fd85005c136dc745..076d207f1e843afc5b12bce2a694d1ab8ba585bf 100644 (file)
@@ -33,13 +33,13 @@ hw_tss tss __aligned(16) =
 {
 #if defined(__i386__)
 
-    .esp0 = (unsigned long)&boot_stack[2 * PAGE_SIZE],
+    .esp0 = _u(&boot_stack[2 * PAGE_SIZE]),
     .ss0  = __KERN_DS,
 
 #elif defined(__x86_64__)
 
-    .rsp0 = (unsigned long)&boot_stack[2 * PAGE_SIZE],
-    .ist[0] = (unsigned long)&boot_stack[3 * PAGE_SIZE],
+    .rsp0 =   _u(&boot_stack[2 * PAGE_SIZE]),
+    .ist[0] = _u(&boot_stack[3 * PAGE_SIZE]),
 
 #endif
 
@@ -49,17 +49,17 @@ hw_tss tss __aligned(16) =
 #if defined(__i386__)
 static hw_tss tss_DF __aligned(16) =
 {
-    .esp  = (unsigned long)&boot_stack[3 * PAGE_SIZE],
+    .esp  = _u(&boot_stack[3 * PAGE_SIZE]),
     .ss   = __KERN_DS,
     .ds   = __KERN_DS,
     .es   = __KERN_DS,
     .fs   = __KERN_DS,
     .gs   = __KERN_DS,
 
-    .eip  = (unsigned long)&entry_DF,
+    .eip  = _u(entry_DF),
     .cs   = __KERN_CS,
 
-    .cr3  = (unsigned long)&cr3_target,
+    .cr3  = _u(cr3_target),
 
     .iopb = X86_TSS_INVALID_IO_BITMAP,
 };
@@ -97,21 +97,20 @@ void pack_gate64(struct seg_gate64 *gate, unsigned type, uint64_t func,
 static void setup_gate(unsigned int entry, void *addr, unsigned int dpl)
 {
 #if defined(__i386__)
-    pack_gate32(&idt[entry], 14, (unsigned long)addr, dpl, __KERN_CS);
+    pack_gate32(&idt[entry], 14, _u(addr), dpl, __KERN_CS);
 #elif defined(__x86_64__)
-    pack_gate64(&idt[entry], 14, (unsigned long)addr, dpl, 0, __KERN_CS);
+    pack_gate64(&idt[entry], 14, _u(addr), dpl, 0, __KERN_CS);
 #endif
 }
 
 static void setup_doublefault(void)
 {
 #if defined(__i386__)
-    gdt[GDTE_TSS_DF] =
-        (typeof(*gdt))INIT_GDTE((unsigned long)&tss_DF, 0x67, 0x89);
+    gdt[GDTE_TSS_DF] = (typeof(*gdt))INIT_GDTE(_u(&tss_DF), 0x67, 0x89);
 
     pack_gate32(&idt[X86_EXC_DF], 5, 0, 0, GDTE_TSS_DF * 8);
 #elif defined(__x86_64__)
-    pack_gate64(&idt[X86_EXC_DF], 14, (unsigned long)entry_DF, 0, 1, __KERN_CS);
+    pack_gate64(&idt[X86_EXC_DF], 14, _u(entry_DF), 0, 1, __KERN_CS);
 #endif
 }
 
@@ -152,7 +151,7 @@ void arch_init_traps(void)
 
     lidt(&idt_ptr);
 
-    gdt[GDTE_TSS] = (typeof(*gdt))INIT_GDTE((unsigned long)&tss, 0x67, 0x89);
+    gdt[GDTE_TSS] = (typeof(*gdt))INIT_GDTE(_u(&tss), 0x67, 0x89);
     ltr(GDTE_TSS * 8);
 
     /*
@@ -177,7 +176,7 @@ void arch_init_traps(void)
         for ( gfn = virt_to_gfn(__start_user_text); gfn < end; ++gfn )
             l1_identmap[gfn] |= _PAGE_USER;
 
-        write_cr3((unsigned long)&cr3_target);
+        write_cr3(_u(cr3_target));
     }
 }
 
index 22a505efc032e43cb363ef58cac23a395457ab1b..4059eba30ebcb30bac6c7acd2c9e1531dae3d1b4 100644 (file)
@@ -38,7 +38,7 @@ static inline void *pfn_to_virt(unsigned long pfn)
 
 static inline unsigned long virt_to_pfn(const void *va)
 {
-    return ((unsigned long)va) >> PAGE_SHIFT;
+    return _u(va) >> PAGE_SHIFT;
 }
 
 #if defined(CONFIG_PV)
index 1eef8d8053a6e2674bca4feed89c51e6c6e7bb02..0d358385dd812d56230bff9cd0affdf0cb378f56 100644 (file)
@@ -34,27 +34,27 @@ void entry_ret_to_kernel(void);
 
 struct xen_trap_info pv_default_trap_info[] =
 {
-    { X86_EXC_DE,  0|4, __KERN_CS, (unsigned long)&entry_DE  },
-    { X86_EXC_DB,  0|4, __KERN_CS, (unsigned long)&entry_DB  },
-    { X86_EXC_NMI, 0|4, __KERN_CS, (unsigned long)&entry_NMI },
-    { X86_EXC_BP,  3|4, __KERN_CS, (unsigned long)&entry_BP  },
-    { X86_EXC_OF,  3|4, __KERN_CS, (unsigned long)&entry_OF  },
-    { X86_EXC_BR,  0|4, __KERN_CS, (unsigned long)&entry_BR  },
-    { X86_EXC_UD,  0|4, __KERN_CS, (unsigned long)&entry_UD  },
-    { X86_EXC_NM,  0|4, __KERN_CS, (unsigned long)&entry_NM  },
-    { X86_EXC_DF,  0|4, __KERN_CS, (unsigned long)&entry_DF  },
-    { X86_EXC_TS,  0|4, __KERN_CS, (unsigned long)&entry_TS  },
-    { X86_EXC_NP,  0|4, __KERN_CS, (unsigned long)&entry_NP  },
-    { X86_EXC_SS,  0|4, __KERN_CS, (unsigned long)&entry_SS  },
-    { X86_EXC_GP,  0|4, __KERN_CS, (unsigned long)&entry_GP  },
-    { X86_EXC_PF,  0|4, __KERN_CS, (unsigned long)&entry_PF  },
-    { X86_EXC_MF,  0|4, __KERN_CS, (unsigned long)&entry_MF  },
-    { X86_EXC_AC,  0|4, __KERN_CS, (unsigned long)&entry_AC  },
-    { X86_EXC_MC,  0|4, __KERN_CS, (unsigned long)&entry_MC  },
-    { X86_EXC_XM,  0|4, __KERN_CS, (unsigned long)&entry_XM  },
-    { X86_EXC_VE,  0|4, __KERN_CS, (unsigned long)&entry_VE  },
-
-    { X86_VEC_RET2KERN, 3|4, __KERN_CS, (unsigned long)&entry_ret_to_kernel },
+    { X86_EXC_DE,  0|4, __KERN_CS, _u(entry_DE)  },
+    { X86_EXC_DB,  0|4, __KERN_CS, _u(entry_DB)  },
+    { X86_EXC_NMI, 0|4, __KERN_CS, _u(entry_NMI) },
+    { X86_EXC_BP,  3|4, __KERN_CS, _u(entry_BP)  },
+    { X86_EXC_OF,  3|4, __KERN_CS, _u(entry_OF)  },
+    { X86_EXC_BR,  0|4, __KERN_CS, _u(entry_BR)  },
+    { X86_EXC_UD,  0|4, __KERN_CS, _u(entry_UD)  },
+    { X86_EXC_NM,  0|4, __KERN_CS, _u(entry_NM)  },
+    { X86_EXC_DF,  0|4, __KERN_CS, _u(entry_DF)  },
+    { X86_EXC_TS,  0|4, __KERN_CS, _u(entry_TS)  },
+    { X86_EXC_NP,  0|4, __KERN_CS, _u(entry_NP)  },
+    { X86_EXC_SS,  0|4, __KERN_CS, _u(entry_SS)  },
+    { X86_EXC_GP,  0|4, __KERN_CS, _u(entry_GP)  },
+    { X86_EXC_PF,  0|4, __KERN_CS, _u(entry_PF)  },
+    { X86_EXC_MF,  0|4, __KERN_CS, _u(entry_MF)  },
+    { X86_EXC_AC,  0|4, __KERN_CS, _u(entry_AC)  },
+    { X86_EXC_MC,  0|4, __KERN_CS, _u(entry_MC)  },
+    { X86_EXC_XM,  0|4, __KERN_CS, _u(entry_XM)  },
+    { X86_EXC_VE,  0|4, __KERN_CS, _u(entry_VE)  },
+
+    { X86_VEC_RET2KERN, 3|4, __KERN_CS, _u(entry_ret_to_kernel) },
 
     { 0, 0, 0, 0 }, /* Sentinel. */
 };
@@ -224,8 +224,9 @@ void arch_init_traps(void)
             panic("Unable to remap user_stack with _PAGE_USER\n");
 
         extern const char __start_user_text[], __end_user_text[];
-        unsigned long va = (unsigned long)__start_user_text;
-        while ( va < (unsigned long)__end_user_text )
+        unsigned long va = _u(__start_user_text);
+
+        while ( va < _u(__end_user_text) )
         {
             nl1e = pte_from_virt(_p(va), PF_SYM(AD, U, RW, P));
 
index f057aee0360d0cbff2efaefb7a94b4fbf49f4985..f64f22f1b2fca993fddd1780402ba84b4be7c864 100644 (file)
@@ -130,7 +130,7 @@ static void init_hypercalls(void)
             panic("Unable to locate Xen CPUID leaves\n");
 
         cpuid(base + 2, &eax, &ebx, &ecx, &edx);
-        wrmsr(ebx, (unsigned long)&hypercall_page);
+        wrmsr(ebx, _u(hypercall_page));
         barrier();
     }
 
index b755ba872266a9ae13263d500d14237d1f782be4..318b405550802b57615887d01f68f01abaaf7eb4 100644 (file)
@@ -65,7 +65,7 @@ unsigned long cpu_regs_sp(const struct cpu_regs *regs)
     if ( (regs->cs & 3) > (cs & 3) )
         return regs->_sp;
 
-    return (unsigned long)regs + offsetof(struct cpu_regs, _sp);
+    return _u(regs) + offsetof(struct cpu_regs, _sp);
 #endif
 }
 
index ef28488b29c2d4e9c8024eb0c2bcbb0b82345f82..185d67649b0a5f8bcb9ae3456ec096440a682266 100644 (file)
  */
 #define _p(v) ((void*)(unsigned long)(v))
 
+/**
+ * Express an arbitrary value @p v as unsigned long.
+ */
+#define _u(v) ((unsigned long)(v))
+
 #endif /* !__ASSEMBLY__ */
 #endif /* XTF_NUMBERS_H */
 
index 817eca0163bfaed2d262b2a713b714aafc6defc6..7abfcb5ea0ef1c46139fb3c355bf0533396e3b8b 100644 (file)
@@ -269,7 +269,7 @@ static void test_no_fault(void)
     printk("Testing 'invlpg' in normally-faulting conditions\n");
 
     printk("  Test: Mapped address\n");
-    invlpg_checked((unsigned long)&test_main);
+    invlpg_checked(_u(test_main));
 
     printk("  Test: Unmapped address\n");
     invlpg_checked(0);
index 5353bb23c8dfa17a41ad0f5cd70804d100ae04a1..734e9cdeeeec1b6e4450338960c249f3c1edbd9b 100644 (file)
@@ -65,8 +65,7 @@ void test_main(void)
         return xtf_skip("Skip: MSR_DEBUGCTL.LBR not available\n");
 
     /* Construct a function pointer to int3_stub() via its upper alias. */
-    void (*int3_stub_alias)(void) =
-        _p((unsigned long)&int3_stub | 0xffff800000000000);
+    void (*int3_stub_alias)(void) = _p(_u(int3_stub) | 0xffff800000000000);
 
     int3_stub_alias();
 
index 0926731329c6256541b5148a5a0fc95b2d945e9c..8ff42b9079bf6899a841e47fd7e7ce0d7b45f8ac 100644 (file)
@@ -95,9 +95,7 @@ static void test_exlog(void)
 
     /* Check that one entry has now been logged. */
     if ( !check_nr_entries(1) ||
-         !check_exlog_entry(0, __KERN_CS,
-                            (unsigned long)&label_test_exlog_int3,
-                            X86_EXC_BP, 0) )
+         !check_exlog_entry(0, __KERN_CS, _u(label_test_exlog_int3), X86_EXC_BP, 0) )
         goto out;
 
     asm volatile ("label_test_exlog_ud2a: ud2a; 1:"
@@ -105,9 +103,7 @@ static void test_exlog(void)
 
     /* Check that two entries have now been logged. */
     if ( !check_nr_entries(2) ||
-         !check_exlog_entry(1, __KERN_CS,
-                            (unsigned long)&label_test_exlog_ud2a,
-                            X86_EXC_UD, 0) )
+         !check_exlog_entry(1, __KERN_CS, _u(label_test_exlog_ud2a), X86_EXC_UD, 0) )
         goto out;
 
     xtf_exlog_reset();
@@ -188,9 +184,7 @@ static void test_NULL_unmapped(void)
                   : "=q" (tmp) :: "memory");
 
     if ( check_nr_entries(1) )
-        check_exlog_entry(0, __KERN_CS,
-                          (unsigned long)&label_test_NULL_unmapped,
-                          X86_EXC_PF, 0);
+        check_exlog_entry(0, __KERN_CS, _u(label_test_NULL_unmapped), X86_EXC_PF, 0);
 
     xtf_exlog_stop();
 }
@@ -206,7 +200,7 @@ static bool local_unhandled_exception_hook(struct cpu_regs *regs)
         return false;
     }
 
-    regs->ip = (unsigned long)hook_fixup;
+    regs->ip = _u(hook_fixup);
     return true;
 }
 
@@ -266,7 +260,7 @@ static void test_custom_idte(void)
 {
     struct xtf_idte idte =
         {
-            .addr = (unsigned long)test_idte_handler,
+            .addr = _u(test_idte_handler),
             /* PV guests need DPL1, HVM need DPL0. */
             .dpl = IS_DEFINED(CONFIG_PV) ? 1 : 0,
             .cs = __KERN_CS,
index 869c9d526702047dc81d82a36d68094463de3b65..93a706512d0977e7608783cf3d2c13e071fce358 100644 (file)
@@ -81,7 +81,7 @@ void test_main(void)
 {
     struct xtf_idte idte =
     {
-        .addr = (unsigned long)test_int_handler,
+        .addr = _u(test_int_handler),
         .cs = __KERN_CS,
     };
 
index d78c95c90e270ad94b1a73c6fe9d0017bb7903ae..7ede48dc8b159e8229b77318def565bc7da31a8a 100644 (file)
@@ -74,8 +74,7 @@ void test_main(void)
 
     user_desc ldt[1] = { gdt[__KERN_DS >> 3] };
 
-    gdt[GDTE_AVAIL0] =
-        (typeof(*gdt))INIT_GDTE((unsigned long)ldt, sizeof(ldt) - 1, 0x82);
+    gdt[GDTE_AVAIL0] = (typeof(*gdt))INIT_GDTE(_u(ldt), sizeof(ldt) - 1, 0x82);
     barrier();
 
     lldt(GDTE_AVAIL0 << 3);
index 8d72cb73ebf015835ed7d9f0333f545f32022609..17dec929bf6992ece59b3dcbce6307706c444bd3 100644 (file)
@@ -48,7 +48,7 @@ hw_tss vm86_tss __aligned(16) =
     .cs     = 0,
     .ss     = 0,
 
-    .esp0   = (unsigned long)&boot_stack[2 * PAGE_SIZE],
+    .esp0   = _u(&boot_stack[2 * PAGE_SIZE]),
     .ss0    = __KERN_DS,
     .ldtr   = 0,
 
@@ -81,7 +81,7 @@ void test_main(void)
 {
     struct xtf_idte idte =
     {
-        .addr = (unsigned long)ret_from_vm86,
+        .addr = _u(ret_from_vm86),
         .cs   = __KERN_CS,
         .dpl  = 3,
     };
@@ -90,8 +90,7 @@ void test_main(void)
     xtf_set_idte(X86_VEC_AVAIL, &idte);
 
     /* Create the vm86 TSS descriptor. */
-    gdt[GDTE_AVAIL0] =
-        (user_desc)INIT_GDTE((unsigned long)&vm86_tss, 0x67, 0x89);
+    gdt[GDTE_AVAIL0] = (user_desc)INIT_GDTE(_u(&vm86_tss), 0x67, 0x89);
 
     /* Copy a stub to somewhere vm86 can actually reach. */
     uint8_t insn_buf[] = { 0xcd, X86_VEC_AVAIL }; /* `int $X86_VEC_AVAIL` */
index eeab9ed2f46d01d870a81e0db0df54f3dc3224f4..5c5f59e2ec8e495776cd0e09385c7b5b7a13b96f 100644 (file)
@@ -50,8 +50,7 @@ int memcmpzero(const void *buf, size_t sz)
 void test_main(void)
 {
     bool leak_detected = false;
-    uint32_t *size = _p(ROUNDUP((unsigned long)&_end[0],
-                                sizeof(unsigned long)));
+    uint32_t *size = _p(ROUNDUP(_u(_end), sizeof(unsigned long)));
     Elf32_Ehdr *ehdr = _p(size) + 4;
 
     if ( !(ehdr->e_ident[EI_MAG0] == ELFMAG0 &&
index 2e18433a4199bc8d5d33648fd0e57698b4a5363a..fb90df5615c5c8eab550f0f2bda39c9869d0a3ab 100644 (file)
@@ -47,7 +47,7 @@ void test_main(void)
      * A vulnerable Xen mis-calculates the memory adjustment, meaning that it
      * will attempt to read from some other address.
      */
-    unsigned long va = (unsigned long)mem - mem_adjust;
+    unsigned long va = _u(mem) - mem_adjust;
 
     /*
      * Make all of the virtual address space readable, so Xen's data fetch
index 3f03092a1c5ff1ad5cfecf64439bceef5fa99a31..ac7cb9c6f2ac1b2513e80878ca251312b8f67dca 100644 (file)
@@ -83,7 +83,7 @@ void test_main(void)
 
     struct xtf_idte idte =
     {
-        .addr = (unsigned long)custom_doublefault_handler,
+        .addr = _u(custom_doublefault_handler),
         .cs   = __KERN_CS,
         .dpl  = 0,
     };
index 86c2f82004ff4ce3e62ed94c925af47f8521f339..6618aa3d7c68d0306970802c6c993df79127210a 100644 (file)
@@ -67,7 +67,7 @@ void test_main(void)
     /* Set up the MSRs. */
     wrmsr(MSR_STAR, ((((uint64_t)GDTE_AVAIL0 * 8 + 0) << 32) |
                      (((uint64_t)GDTE_AVAIL2 * 8 + 3) << 48)));
-    wrmsr(MSR_LSTAR, (unsigned long)entry_SYSCALL_64);
+    wrmsr(MSR_LSTAR, _u(entry_SYSCALL_64));
     wrmsr(MSR_FMASK, X86_EFLAGS_TF);
 
     xtf_exlog_start();