diff options
Diffstat (limited to 'sysdeps/mach/i386/thread_state.h')
-rw-r--r-- | sysdeps/mach/i386/thread_state.h | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/sysdeps/mach/i386/thread_state.h b/sysdeps/mach/i386/thread_state.h index 56d91dfdb7..be3c8a9cee 100644 --- a/sysdeps/mach/i386/thread_state.h +++ b/sysdeps/mach/i386/thread_state.h @@ -21,7 +21,10 @@ #include <mach/machine/thread_status.h> -#define MACHINE_THREAD_STATE_FLAVOR i386_THREAD_STATE +/* This lets the kernel define segments for a new thread. */ +#define MACHINE_NEW_THREAD_STATE_FLAVOR i386_THREAD_STATE +/* This makes the kernel load our segments descriptors. */ +#define MACHINE_THREAD_STATE_FLAVOR i386_REGS_SEGS_STATE #define MACHINE_THREAD_STATE_COUNT i386_THREAD_STATE_COUNT #define machine_thread_state i386_thread_state @@ -30,6 +33,14 @@ #define SP uesp #define SYSRETURN eax +#define MACHINE_THREAD_STATE_FIX_NEW(ts) do { \ + asm ("mov %%cs, %w0" : "=q" ((ts)->cs)); \ + asm ("mov %%ds, %w0" : "=q" ((ts)->ds)); \ + asm ("mov %%es, %w0" : "=q" ((ts)->es)); \ + asm ("mov %%fs, %w0" : "=q" ((ts)->fs)); \ + asm ("mov %%gs, %w0" : "=q" ((ts)->gs)); \ +} while(0) + struct machine_thread_all_state { int set; /* Mask of bits (1 << FLAVOR). */ |