diff options
author | Roland McGrath <roland@gnu.org> | 2002-10-04 02:44:49 +0000 |
---|---|---|
committer | Thomas Schwinge <tschwinge@gnu.org> | 2009-06-17 23:50:18 +0200 |
commit | fafb8303e9e7f095cf6cbd4e805e57776f3ea7f3 (patch) | |
tree | 6c38057f37b70331bb1662c297f735920cbcf78b | |
parent | 3b39a75826362826518c252c2a9a9c8c862e9336 (diff) |
2002-10-03 Roland McGrath <roland@frob.com>
* i386/i386/gdt.h (KERNEL_CS, KERNEL_DS, KERNEL_TSS, KERNEL_LDT):
Values changed, new GDT layout not matching oskit base_gdt.h defaults.
(BASE_KERNEL_CS, BASE_KERNEL_DS): New macros with to oskit's values.
* oskit/x86/main.c (ktss): Variable moved to gdt.c.
(main): Don't diddle the tss here.
* i386/i386/gdt.c (gdt_init): Do it here instead.
* oskit/x86/main.c (my_exit): Restore oskit's base_gdt.
-rw-r--r-- | i386/i386/gdt.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/i386/i386/gdt.c b/i386/i386/gdt.c index 0fa4fc31..ce981693 100644 --- a/i386/i386/gdt.c +++ b/i386/i386/gdt.c @@ -39,6 +39,13 @@ extern void etext(); +/* The BASE_TSS in OSKit has no I/O permission bitmap, but we want + one. So we replace it with an extended TSS at link-time. */ +#include <machine/tss.h> +#include <machine/io_perm.h> +static struct task_tss ktss; +extern struct x86_tss base_tss __attribute__ ((alias ("ktss"))); + void gdt_init() { @@ -60,6 +67,18 @@ gdt_init() LINEAR_MIN_KERNEL_ADDRESS, 0xffffffff, ACC_PL_K|ACC_DATA_W, SZ_32); + /* Copy the values to the slots used by oskit code. */ + gdt[sel_idx (BASE_KERNEL_CS)] = gdt[sel_idx (KERNEL_CS)]; + gdt[sel_idx (BASE_KERNEL_DS)] = gdt[sel_idx (KERNEL_DS)]; + + /* Set up the KERNEL_TSS to include an I/O permission bitmap. */ + fill_gdt_descriptor(KERNEL_TSS, + kvtolin(&ktss), + sizeof(struct task_tss) - 1, + ACC_PL_K|ACC_TSS, 0); + ktss.tss.io_bit_map_offset = IOPB_INVAL; + ktss.barrier = 0xFF; + #if MULTIPROCESSOR /* * Set the %gs segment register to point at |