From 2c10d8ca605c8ebd24fbb2e920a91bd5ae04ec36 Mon Sep 17 00:00:00 2001 From: Andy Lutomirski Date: Wed, 18 Mar 2015 16:44:25 -0700 Subject: segregs: Use int 0x80 syscalls to avoid sysexit issues Signed-off-by: Andy Lutomirski --- segregs.c | 32 +++++++++++++++++++++++--------- 1 file 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 -#include -#include #include -#include +#include #include -#include - -#ifdef __x86_64__ -# error This test is 32-bit only -#endif +#include +#include 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)); -- cgit 1.2.3-korg