]> xenbits.xensource.com Git - people/andrewcoop/xen-test-framework.git/commitdiff
Add more helpful GDTE() helpers
authorAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 2 Mar 2018 14:02:35 +0000 (14:02 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Fri, 2 Mar 2018 15:19:24 +0000 (15:19 +0000)
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 <andrew.cooper3@citrix.com>
arch/x86/hvm/traps.c
arch/x86/include/arch/desc.h
arch/x86/include/arch/symbolic-const.h
tests/invlpg/main.c
tests/memop-seg/main.c
tests/nmi-taskswitch-priv/main.c
tests/xsa-186/main.c
tests/xsa-191/main.c
tests/xsa-192/main.c

index 2797bce039cafd029fe196c48d038bfe50a48022..f936d4d74d0f9e2e41047d71eab4ba68ec34fda9 100644 (file)
@@ -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);
 
     /*
index e218e6ed58f454a6ffd2916183a46d0605fc91fd..89198ecabe2578749c9030bebde15a4fe2b4e918 100644 (file)
@@ -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;
index 41f97ff7e94a0f5b2f5b9c880a2ab0825155d0bb..d9d2db8683b7f0f14be0463988856da59040cd4d 100644 (file)
@@ -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.
 #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.
  *
index 55a7e6f977f48494967c1f5d1a15b2dfa663ad45..416fad38b7992655fba810c01b06d8c631ade108 100644 (file)
@@ -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);
 
index c9b885eaee730d670d8e312dcb815ff180a097eb..579f4609780c9d1a870ad5516aaec12d27c5d59e 100644 (file)
@@ -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) )
         {
index 3b4aadf80d3523f576fcc1d3cbff1cca3fbe53ce..81c112f91ecf90c460c3be050802d962059107ff 100644 (file)
@@ -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();
 
index 47834bdb120eec9e62e23fbe30d0f23d7362aa64..8eef883d38d0af034aa80b173c626b7675026eb4 100644 (file)
@@ -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;"
index d446ed83c1c9beb08c551b8e8d49c6c0e8d3d0a7..30bec6fd4c014aa4e22eca73bf49247fcdf99f35 100644 (file)
@@ -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);
index 746e3357b8046de7a8fddb638fdbf4001fc78978..7cc6c5c4cc159006e928736a8e12e3a439a05d64 100644 (file)
@@ -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);