summaryrefslogtreecommitdiff
path: root/i386/i386/pcb.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2006-11-05 20:39:25 +0000
committerThomas Schwinge <tschwinge@gnu.org>2009-06-18 00:26:50 +0200
commit851fdb496728e83cdb3f591a674d3425efc1f11c (patch)
treedb509b0e1331721cfc4228fbdd85a111692d148e /i386/i386/pcb.c
parent0487d0193161eae0f56d2f9eab0d901dc8d0fe07 (diff)
2006-11-05 Barry deFreese <bddebian@comcast.net>
[task #5878 --- ``Backport code from GNU Mach's trunk to gnumach-1-branch: i386_set_gdt, i386_get_gdt''] * i386/include/mach/i386/mach_i386.defs (i386_set_gdt, i386_get_gdt): New routines. * i386/i386/user_ldt.c (i386_set_gdt, i386_get_gdt): New functions. * i386/i386/gdt.h (USER_GDT, USER_GDT_SLOTS): New macros. (GDTSZ): Compute it from USER_GDT and USER_GDT_SLOTS. * i386/i386/thread.h: Include `gdt.h'. (struct i386_machine_state): New member `user_gdt'. * i386/i386/pcb.c (switch_ktss): Copy those slots into the GDT. * linux/dev/include/linux/head.h: New file.
Diffstat (limited to 'i386/i386/pcb.c')
-rw-r--r--i386/i386/pcb.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/i386/i386/pcb.c b/i386/i386/pcb.c
index 9665caa..a18a5e6 100644
--- a/i386/i386/pcb.c
+++ b/i386/i386/pcb.c
@@ -191,6 +191,13 @@ void switch_ktss(pcb)
set_ldt(USER_LDT);
}
}
+
+ /* Copy in the per-thread GDT slots. No reloading is necessary
+ because just restoring the segment registers on the way back to
+ user mode reloads the shadow registers from the in-memory GDT. */
+ memcpy (gdt_desc_p (mycpu, USER_GDT),
+ pcb->ims.user_gdt, sizeof pcb->ims.user_gdt);
+
/*
* Load the floating-point context, if necessary.
*/