summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2015-03-23 15:34:14 -0700
committerAndy Lutomirski <luto@kernel.org>2015-03-23 16:09:45 -0700
commit304f26cb6ced52d009b65c98204543c1612c720b (patch)
tree613c499c7251bde846f829ec101de9705a2467df
parent8b0d8912aaea07e207d93829294bb1b3cd8e0c6a (diff)
downloadmisc-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.c48
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)