From: Andrew Cooper Date: Thu, 16 Jun 2016 10:28:07 +0000 (+0100) Subject: Introduce _u() to compliement _p() X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7e7c4526bc137999335b6e8e4b3db233ae2cf4b9;p=people%2Fandrewcoop%2Fxen-test-framework.git Introduce _u() to compliement _p() This wraps (unsigned long) casts when pointers are needed to be handled as integers. Signed-off-by: Andrew Cooper --- diff --git a/arch/x86/desc.c b/arch/x86/desc.c index 7f8b80a..e695d49 100644 --- a/arch/x86/desc.c +++ b/arch/x86/desc.c @@ -1,3 +1,5 @@ +#include + #include #include #include @@ -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 diff --git a/arch/x86/hvm/traps.c b/arch/x86/hvm/traps.c index 102af86..076d207 100644 --- a/arch/x86/hvm/traps.c +++ b/arch/x86/hvm/traps.c @@ -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)); } } diff --git a/arch/x86/include/arch/mm.h b/arch/x86/include/arch/mm.h index 22a505e..4059eba 100644 --- a/arch/x86/include/arch/mm.h +++ b/arch/x86/include/arch/mm.h @@ -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) diff --git a/arch/x86/pv/traps.c b/arch/x86/pv/traps.c index 1eef8d8..0d35838 100644 --- a/arch/x86/pv/traps.c +++ b/arch/x86/pv/traps.c @@ -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)); diff --git a/arch/x86/setup.c b/arch/x86/setup.c index f057aee..f64f22f 100644 --- a/arch/x86/setup.c +++ b/arch/x86/setup.c @@ -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(); } diff --git a/arch/x86/traps.c b/arch/x86/traps.c index b755ba8..318b405 100644 --- a/arch/x86/traps.c +++ b/arch/x86/traps.c @@ -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 } diff --git a/include/xtf/numbers.h b/include/xtf/numbers.h index ef28488..185d676 100644 --- a/include/xtf/numbers.h +++ b/include/xtf/numbers.h @@ -44,6 +44,11 @@ */ #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 */ diff --git a/tests/invlpg/main.c b/tests/invlpg/main.c index 817eca0..7abfcb5 100644 --- a/tests/invlpg/main.c +++ b/tests/invlpg/main.c @@ -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); diff --git a/tests/lbr-tsx-vmentry/main.c b/tests/lbr-tsx-vmentry/main.c index 5353bb2..734e9cd 100644 --- a/tests/lbr-tsx-vmentry/main.c +++ b/tests/lbr-tsx-vmentry/main.c @@ -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(); diff --git a/tests/selftest/main.c b/tests/selftest/main.c index 0926731..8ff42b9 100644 --- a/tests/selftest/main.c +++ b/tests/selftest/main.c @@ -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, diff --git a/tests/xsa-186/main.c b/tests/xsa-186/main.c index 869c9d5..93a7065 100644 --- a/tests/xsa-186/main.c +++ b/tests/xsa-186/main.c @@ -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, }; diff --git a/tests/xsa-191/main.c b/tests/xsa-191/main.c index d78c95c..7ede48d 100644 --- a/tests/xsa-191/main.c +++ b/tests/xsa-191/main.c @@ -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); diff --git a/tests/xsa-192/main.c b/tests/xsa-192/main.c index 8d72cb7..17dec92 100644 --- a/tests/xsa-192/main.c +++ b/tests/xsa-192/main.c @@ -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` */ diff --git a/tests/xsa-194/main.c b/tests/xsa-194/main.c index eeab9ed..5c5f59e 100644 --- a/tests/xsa-194/main.c +++ b/tests/xsa-194/main.c @@ -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 && diff --git a/tests/xsa-195/main.c b/tests/xsa-195/main.c index 2e18433..fb90df5 100644 --- a/tests/xsa-195/main.c +++ b/tests/xsa-195/main.c @@ -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 diff --git a/tests/xsa-196/main.c b/tests/xsa-196/main.c index 3f03092..ac7cb9c 100644 --- a/tests/xsa-196/main.c +++ b/tests/xsa-196/main.c @@ -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, }; diff --git a/tests/xsa-204/main.c b/tests/xsa-204/main.c index 86c2f82..6618aa3 100644 --- a/tests/xsa-204/main.c +++ b/tests/xsa-204/main.c @@ -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();