diff options
author | Andy Lutomirski <luto@kernel.org> | 2015-03-23 15:34:14 -0700 |
---|---|---|
committer | Andy Lutomirski <luto@kernel.org> | 2015-03-23 16:09:45 -0700 |
commit | 304f26cb6ced52d009b65c98204543c1612c720b (patch) | |
tree | 613c499c7251bde846f829ec101de9705a2467df | |
parent | 8b0d8912aaea07e207d93829294bb1b3cd8e0c6a (diff) | |
download | misc-tests-304f26cb6ced52d009b65c98204543c1612c720b.tar.gz |
sigreturn: Get rid of a bunch of magic numbers
Signed-off-by: Andy Lutomirski <luto@kernel.org>
-rw-r--r-- | sigreturn.c | 48 |
1 files changed, 28 insertions, 20 deletions
diff --git a/sigreturn.c b/sigreturn.c index 24b8a64..1286be4 100644 --- a/sigreturn.c +++ b/sigreturn.c @@ -23,9 +23,15 @@ struct selectors { unsigned short cs, gs, fs, ss; }; -static bool has_code16, has_data16, has_npcode32, has_npdata32; +static unsigned short ldt_nonexistent_sel; +static unsigned short code16_sel, data16_sel, npcode32_sel, npdata32_sel; -static int gdt_data16_idx, gdt_npdata32_idx; +static unsigned short gdt_data16_idx, gdt_npdata32_idx; + +static unsigned short LDT3(int idx) +{ + return (idx << 3) | 7; +} static void sethandler(int sig, void (*handler)(int, siginfo_t *, void *), int flags) @@ -62,13 +68,14 @@ asm (".pushsection .text\n\t" ".popsection"); extern char int3[4096]; -static void add_ldt(const struct user_desc *desc, bool *var, const char *name) +static void add_ldt(const struct user_desc *desc, unsigned short *var, + const char *name) { if (syscall(SYS_modify_ldt, 1, desc, sizeof(*desc)) == 0) { - *var = true; + *var = LDT3(desc->entry_number); } else { printf("[NOTE]\tFailed to create %s segment\n", name); - *var = false; + *var = 0; } } @@ -79,7 +86,8 @@ static void setup_ldt(void) if ((unsigned long)int3 > (1ULL << 32) - sizeof(int3)) errx(1, "int3 is too high\n"); - // Borrowed from a test case by hpa + ldt_nonexistent_sel = LDT3(2); + const struct user_desc code16_desc = { .entry_number = 0, .base_addr = (unsigned long)int3, @@ -91,7 +99,7 @@ static void setup_ldt(void) .seg_not_present = 0, .useable = 0 }; - add_ldt(&code16_desc, &has_code16, "code16"); + add_ldt(&code16_desc, &code16_sel, "code16"); const struct user_desc data16_desc = { .entry_number = 1, @@ -104,7 +112,7 @@ static void setup_ldt(void) .seg_not_present = 0, .useable = 0 }; - add_ldt(&data16_desc, &has_data16, "data16"); + add_ldt(&data16_desc, &data16_sel, "data16"); const struct user_desc npcode32_desc = { .entry_number = 3, @@ -117,7 +125,7 @@ static void setup_ldt(void) .seg_not_present = 1, .useable = 0 }; - add_ldt(&npcode32_desc, &has_npcode32, "npcode32"); + add_ldt(&npcode32_desc, &npcode32_sel, "npcode32"); const struct user_desc npdata32_desc = { .entry_number = 4, @@ -130,7 +138,7 @@ static void setup_ldt(void) .seg_not_present = 1, .useable = 0 }; - add_ldt(&npdata32_desc, &has_npdata32, "npdata32"); + add_ldt(&npdata32_desc, &npdata32_sel, "npdata32"); struct user_desc gdt_data16_desc = { .entry_number = -1, @@ -222,7 +230,7 @@ static void sigusr1(int sig, siginfo_t *info, void *ctx_void) *ssptr(ctx) = sig_ss; ctx->uc_mcontext.gregs[REG_IP] = - (sig_cs == 0x7 || sig_cs == 0x1f) ? 0 : (unsigned long)&int3; + sig_cs == code16_sel ? 0 : (unsigned long)&int3; ctx->uc_mcontext.gregs[REG_SP] = (unsigned long)0x8badf00d5aadc0deULL; ctx->uc_mcontext.gregs[REG_AX] = 0; @@ -298,8 +306,8 @@ int find_cs(int bitness) return my_cs + (2 << 3); if (my_cs > (2<<3) && cs_bitness(my_cs - (2 << 3)) == bitness) return my_cs - (2 << 3); - if (cs_bitness(0x7) == bitness) - return 0x7; + if (cs_bitness(code16_sel) == bitness) + return code16_sel; printf("[WARN]\tCould not find %d-bit CS\n", bitness); return -1; @@ -318,12 +326,12 @@ static int do_test(int cs_bits, bool use_16bit_ss, int force_ss) sig_ss = force_ss; } else { if (use_16bit_ss) { - if (!has_data16) { + if (!data16_sel) { printf("[SKIP]\tData segment unavailable for %d-bit CS, 16-bit SS\n", cs_bits); return 0; } - sig_ss = (1 << 3) | 7; /* LDT selector 1, RPL = 3 */ + sig_ss = data16_sel; } else { asm volatile ("mov %%ss,%0" : "=r" (sig_ss)); } @@ -496,19 +504,19 @@ int main() sethandler(SIGBUS, sigtrap, SA_ONSTACK); sethandler(SIGILL, sigtrap, SA_ONSTACK); /* 32-bit kernels do this */ - test_bad_iret(64, (2 << 3) | 7, -1); - test_bad_iret(32, (2 << 3) | 7, -1); - test_bad_iret(16, (2 << 3) | 7, -1); + test_bad_iret(64, ldt_nonexistent_sel, -1); + test_bad_iret(32, ldt_nonexistent_sel, -1); + test_bad_iret(16, ldt_nonexistent_sel, -1); test_bad_iret(64, my_cs, -1); test_bad_iret(32, my_cs, -1); test_bad_iret(16, my_cs, -1); /* IRET will fail with #NP */ - test_bad_iret(32, my_ss, (3 << 3) | 7); + test_bad_iret(32, my_ss, npcode32_sel); /* IRET will fail with #SS on the espfix stack */ - test_bad_iret(32, (4 << 3) | 7, -1); + test_bad_iret(32, npdata32_sel, -1); /* IRET will fail with #SS on the normal stack */ if (gdt_npdata32_idx) |