diff options
author | Andy Lutomirski <luto@kernel.org> | 2015-03-18 16:44:25 -0700 |
---|---|---|
committer | Andy Lutomirski <luto@kernel.org> | 2015-03-18 16:44:25 -0700 |
commit | 2c10d8ca605c8ebd24fbb2e920a91bd5ae04ec36 (patch) | |
tree | b0eecc53b907424e2a6b919cd4b566e906c85e49 | |
parent | 54be0fdd8cc26ce54770cbc7e150a8c45393b803 (diff) | |
download | misc-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.c | 32 |
1 files changed, 23 insertions, 9 deletions
@@ -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)); |