summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@kernel.org>2015-03-18 16:44:25 -0700
committerAndy Lutomirski <luto@kernel.org>2015-03-18 16:44:25 -0700
commit2c10d8ca605c8ebd24fbb2e920a91bd5ae04ec36 (patch)
treeb0eecc53b907424e2a6b919cd4b566e906c85e49
parent54be0fdd8cc26ce54770cbc7e150a8c45393b803 (diff)
downloadmisc-tests-2c10d8ca605c8ebd24fbb2e920a91bd5ae04ec36.tar.gz
segregs: Use int 0x80 syscalls to avoid sysexit issues
Signed-off-by: Andy Lutomirski <luto@kernel.org>
-rw-r--r--segregs.c32
1 files changed, 23 insertions, 9 deletions
diff --git a/segregs.c b/segregs.c
index d6fdff1..a0c34b8 100644
--- a/segregs.c
+++ b/segregs.c
@@ -1,14 +1,14 @@
+/*
+ * Copyright (c) 2014-2015 Andy Lutomirski
+ * GPL v2
+ */
+
#include <stdio.h>
-#include <stdbool.h>
-#include <sys/syscall.h>
#include <unistd.h>
-#include <asm/ldt.h>
+#include <time.h>
#include <err.h>
-#include <sys/user.h>
-
-#ifdef __x86_64__
-# error This test is 32-bit only
-#endif
+#include <asm/ldt.h>
+#include <sys/syscall.h>
static unsigned short GDT3(int idx)
{
@@ -46,8 +46,22 @@ int main()
int errors = 0;
int total = 1000;
for (int i = 0; i < total; i++) {
+ struct timespec req = {
+ .tv_sec = 0,
+ .tv_nsec = 100000,
+ };
+ int ret;
+
asm volatile ("mov %0,%%es" : : "rm" (GDT3(idx)));
- usleep(100);
+
+ /*
+ * Force rescheduling. On 32-bit kernels, fast syscalls
+ * destroy DS and ES, so force int 80.
+ */
+ asm volatile ("int $0x80"
+ : "=a" (ret)
+ : "a" (SYS_nanosleep), "b" (&req),
+ "c" (0));
unsigned short es;
asm volatile ("mov %%es,%0" : "=rm" (es));