From: Andrew Cooper Date: Fri, 2 Mar 2018 14:02:35 +0000 (+0000) Subject: Add more helpful GDTE() helpers X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=7defbb103492b2e073c81abb6a8c417ddcffcbfd;p=xtf.git Add more helpful GDTE() helpers All tests and some setup infrastructure need explicitly typed versions of INIT_GDTE() and INIT_GDTE_SYM(). Introduce GDTE() and GDTE_SYM() to do just this, and update the impacted users. Signed-off-by: Andrew Cooper --- diff --git a/arch/x86/hvm/traps.c b/arch/x86/hvm/traps.c index 2797bce..f936d4d 100644 --- a/arch/x86/hvm/traps.c +++ b/arch/x86/hvm/traps.c @@ -79,7 +79,7 @@ static void setup_doublefault(void) { if ( IS_DEFINED(CONFIG_32BIT) ) { - gdt[GDTE_TSS_DF] = (typeof(*gdt))INIT_GDTE(_u(&tss_DF), 0x67, 0x89); + gdt[GDTE_TSS_DF] = GDTE(_u(&tss_DF), 0x67, 0x89); pack_task_gate(&idt[X86_EXC_DF], GDTE_TSS_DF * 8); } @@ -120,7 +120,7 @@ void arch_init_traps(void) lidt(&idt_ptr); - gdt[GDTE_TSS] = (typeof(*gdt))INIT_GDTE(_u(&tss), 0x67, 0x89); + gdt[GDTE_TSS] = GDTE(_u(&tss), 0x67, 0x89); ltr(GDTE_TSS * 8); /* diff --git a/arch/x86/include/arch/desc.h b/arch/x86/include/arch/desc.h index e218e6e..89198ec 100644 --- a/arch/x86/include/arch/desc.h +++ b/arch/x86/include/arch/desc.h @@ -91,7 +91,7 @@ struct __packed seg_desc32 { #define SEG_ATTR_W 0x0002 /**< Writable? (0 = RO seg, 1 = RW seg) */ /** - * Initialise an LDT/GDT entry using a raw attribute number. + * Initialiser for an LDT/GDT entry using a raw attribute number. * * @param base Segment base. * @param limit Segment limit. @@ -103,6 +103,11 @@ struct __packed seg_desc32 { (((attr) & 0xf0ff) << 8) | (((base) & 0xff0000) >> 16) \ } } } +/** + * As INIT_GDTE(), but creates a user_desc object. + */ +#define GDTE(base, limit, attr) ((user_desc)INIT_GDTE(base, limit, attr)) + /** Long mode lgdt/lidt table pointer. */ struct __packed desc_ptr64 { uint16_t limit; diff --git a/arch/x86/include/arch/symbolic-const.h b/arch/x86/include/arch/symbolic-const.h index 41f97ff..d9d2db8 100644 --- a/arch/x86/include/arch/symbolic-const.h +++ b/arch/x86/include/arch/symbolic-const.h @@ -42,7 +42,7 @@ #define TOK_OR(t, ...) VAR_MACRO_C1(TOK_OR, t, ##__VA_ARGS__) /** - * Initialise an LDT/GDT entry using SEG_ATTR_ mnemonics. + * Initialiser for an LDT/GDT entry using SEG_ATTR_ mnemonics. * * @param base Segment base. * @param limit Segment limit. @@ -58,6 +58,12 @@ #define INIT_GDTE_SYM(base, limit, ...) \ INIT_GDTE(base, limit, TOK_OR(SEG_ATTR_, ##__VA_ARGS__)) +/** + * As INIT_GDTE_SYM(), but creates a user_desc object. + */ +#define GDTE_SYM(base, limit, ...) \ + ((user_desc)INIT_GDTE_SYM(base, limit, __VA_ARGS__)) + /** * Create a selector based error code using X86_EC_ mnemonics. * diff --git a/tests/invlpg/main.c b/tests/invlpg/main.c index 55a7e6f..416fad3 100644 --- a/tests/invlpg/main.c +++ b/tests/invlpg/main.c @@ -271,12 +271,12 @@ static void test_no_fault(void) invlpg_fs_checked(0); printk(" Test: Past segment limit\n"); - gdt[GDTE_AVAIL0] = (typeof(*gdt))INIT_GDTE_SYM(0, 1, COMMON, DATA, DPL0, B, W); + gdt[GDTE_AVAIL0] = GDTE_SYM(0, 1, COMMON, DATA, DPL0, B, W); write_fs(GDTE_AVAIL0 << 3); invlpg_fs_checked(0x2000); printk(" Test: Before expand-down segment limit\n"); - gdt[GDTE_AVAIL0] = (typeof(*gdt))INIT_GDTE_SYM(0, 1, COMMON, DATA, DPL0, B, W, E); + gdt[GDTE_AVAIL0] = GDTE_SYM(0, 1, COMMON, DATA, DPL0, B, W, E); write_fs(GDTE_AVAIL0 << 3); invlpg_fs_checked(0); diff --git a/tests/memop-seg/main.c b/tests/memop-seg/main.c index c9b885e..579f460 100644 --- a/tests/memop-seg/main.c +++ b/tests/memop-seg/main.c @@ -260,8 +260,8 @@ void test_main(void) /* For 32bit, use segments with a limit of 2GB. */ if ( IS_DEFINED(CONFIG_32BIT) ) { - user_desc code = INIT_GDTE_SYM(0, 0x7ffff, COMMON, CODE, DPL3, R, D); - user_desc data = INIT_GDTE_SYM(0, 0x7ffff, COMMON, DATA, DPL3, B, W); + user_desc code = GDTE_SYM(0, 0x7ffff, COMMON, CODE, DPL3, R, D); + user_desc data = GDTE_SYM(0, 0x7ffff, COMMON, DATA, DPL3, B, W); if ( IS_DEFINED(CONFIG_HVM) ) { diff --git a/tests/nmi-taskswitch-priv/main.c b/tests/nmi-taskswitch-priv/main.c index 3b4aadf..81c112f 100644 --- a/tests/nmi-taskswitch-priv/main.c +++ b/tests/nmi-taskswitch-priv/main.c @@ -146,7 +146,7 @@ void test_main(void) * Set up NMI handling to be a task gate. */ xtf_unhandled_exception_hook = unhandled_exception; - gdt[GDTE_AVAIL0] = (user_desc)INIT_GDTE(_u(&nmi_tss), 0x67, 0x89); + gdt[GDTE_AVAIL0] = GDTE(_u(&nmi_tss), 0x67, 0x89); pack_task_gate(&idt[X86_EXC_NMI], GDTE_AVAIL0 * 8); barrier(); diff --git a/tests/xsa-186/main.c b/tests/xsa-186/main.c index 47834bd..8eef883 100644 --- a/tests/xsa-186/main.c +++ b/tests/xsa-186/main.c @@ -191,8 +191,7 @@ void test_main(void) * to execute the code with. The stub still runs with 32bit data * segments, which is perfectly valid. */ - gdt[GDTE_AVAIL0] = - (typeof(*gdt))INIT_GDTE_SYM(0, 0xfffff, COMMON, CODE, DPL0, R); + gdt[GDTE_AVAIL0] = GDTE_SYM(0, 0xfffff, COMMON, CODE, DPL0, R); asm volatile ("push $%c[cs16];" "push $1f;" diff --git a/tests/xsa-191/main.c b/tests/xsa-191/main.c index d446ed8..30bec6f 100644 --- a/tests/xsa-191/main.c +++ b/tests/xsa-191/main.c @@ -64,7 +64,7 @@ void test_main(void) user_desc ldt[1] = { gdt[__KERN_DS >> 3] }; - gdt[GDTE_AVAIL0] = (typeof(*gdt))INIT_GDTE(_u(ldt), sizeof(ldt) - 1, 0x82); + gdt[GDTE_AVAIL0] = 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 746e335..7cc6c5c 100644 --- a/tests/xsa-192/main.c +++ b/tests/xsa-192/main.c @@ -86,7 +86,7 @@ void test_main(void) xtf_set_idte(X86_VEC_AVAIL, &idte); /* Create the vm86 TSS descriptor. */ - gdt[GDTE_AVAIL0] = (user_desc)INIT_GDTE(_u(&vm86_tss), 0x67, 0x89); + gdt[GDTE_AVAIL0] = 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` */ @@ -98,7 +98,7 @@ void test_main(void) */ if ( vendor_is_amd ) { - gdt[GDTE_AVAIL1] = (user_desc)INIT_GDTE(0, 0, 0x82); + gdt[GDTE_AVAIL1] = GDTE(0, 0, 0x82); lldt(GDTE_AVAIL1 << 3); } lldt(0);