From fafb8303e9e7f095cf6cbd4e805e57776f3ea7f3 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 4 Oct 2002 02:44:49 +0000 Subject: 2002-10-03 Roland McGrath * 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. --- i386/i386/gdt.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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 +#include +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 -- cgit v1.2.3