Index: 2005-12-16/arch/i386/kernel/head-xen.S =================================================================== --- 2005-12-16.orig/arch/i386/kernel/head-xen.S 2005-12-22 14:29:10.000000000 +0100 +++ 2005-12-16/arch/i386/kernel/head-xen.S 2005-12-22 14:50:09.000000000 +0100 @@ -47,7 +47,7 @@ ENTRY(startup_32_smp) cld /* Set up the stack pointer */ - lss stack_start,%esp + movl $(init_thread_union+THREAD_SIZE),%esp checkCPUtype: @@ -104,10 +104,6 @@ ENTRY(lgdt_finish) pushl %eax lret -ENTRY(stack_start) - .long init_thread_union+THREAD_SIZE - .long __BOOT_DS - ready: .byte 0 .globl idt_descr @@ -160,27 +156,7 @@ ENTRY(cpu_gdt_table) .quad 0x0000000000000000 /* 0x80 TSS descriptor */ .quad 0x0000000000000000 /* 0x88 LDT descriptor */ - /* Segments used for calling PnP BIOS */ - .quad 0x0000000000000000 /* 0x90 32-bit code */ - .quad 0x0000000000000000 /* 0x98 16-bit code */ - .quad 0x0000000000000000 /* 0xa0 16-bit data */ - .quad 0x0000000000000000 /* 0xa8 16-bit data */ - .quad 0x0000000000000000 /* 0xb0 16-bit data */ - /* - * The APM segments have byte granularity and their bases - * and limits are set at run time. - */ - .quad 0x0000000000000000 /* 0xb8 APM CS code */ - .quad 0x0000000000000000 /* 0xc0 APM CS 16 code (16 bit) */ - .quad 0x0000000000000000 /* 0xc8 APM DS data */ - - .quad 0x0000000000000000 /* 0xd0 - ESPFIX 16-bit SS */ - .quad 0x0000000000000000 /* 0xd8 - unused */ - .quad 0x0000000000000000 /* 0xe0 - unused */ - .quad 0x0000000000000000 /* 0xe8 - unused */ - .quad 0x0000000000000000 /* 0xf0 - unused */ - .quad 0x0000000000000000 /* 0xf8 - GDT entry 31: double-fault TSS */ - .fill GDT_ENTRIES-32,8,0 + .fill GDT_ENTRIES-18,8,0 .org 0x3000 ENTRY(default_ldt) Index: 2005-12-16/include/asm-i386/mach-default/mach_mode.h =================================================================== --- 2005-12-16.orig/include/asm-i386/mach-default/mach_mode.h 2005-12-22 10:30:50.000000000 +0100 +++ 2005-12-16/include/asm-i386/mach-default/mach_mode.h 2005-12-22 10:38:46.000000000 +0100 @@ -1,6 +1,7 @@ #ifndef __ASM_MACH_MODE_H #define __ASM_MACH_MODE_H +#define KERNEL_RPL 0 #define USER_MODE_MASK 3 #endif /* __ASM_MACH_MODE_H */ Index: 2005-12-16/include/asm-i386/mach-default/mach_seg.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ 2005-12-16/include/asm-i386/mach-default/mach_seg.h 2005-12-22 10:49:39.000000000 +0100 @@ -0,0 +1,25 @@ +#ifndef __ASM_MACH_SEG_H +#define __ASM_MACH_SEG_H + +#define GDT_ENTRY_PNPBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 6) +#define GDT_ENTRY_APMBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 11) + +#define GDT_ENTRY_ESPFIX_SS (GDT_ENTRY_KERNEL_BASE + 14) +#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8) + +#define GDT_ENTRY_DOUBLEFAULT_TSS 31 + +/* + * The GDT has 32 entries + */ +#define GDT_ENTRIES 32 + +/* Simple and small GDT entries for booting only */ + +#define GDT_ENTRY_BOOT_CS 2 +#define __BOOT_CS (GDT_ENTRY_BOOT_CS * 8) + +#define GDT_ENTRY_BOOT_DS (GDT_ENTRY_BOOT_CS + 1) +#define __BOOT_DS (GDT_ENTRY_BOOT_DS * 8) + +#endif /* __ASM_MACH_SEG_H */ Index: 2005-12-16/include/asm-i386/mach-xen/asm/segment.h =================================================================== --- 2005-12-16.orig/include/asm-i386/mach-xen/asm/segment.h 2005-12-22 14:29:10.000000000 +0100 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,99 +0,0 @@ -#ifndef _ASM_SEGMENT_H -#define _ASM_SEGMENT_H - -/* - * The layout of the per-CPU GDT under Linux: - * - * 0 - null - * 1 - reserved - * 2 - reserved - * 3 - reserved - * - * 4 - unused <==== new cacheline - * 5 - unused - * - * ------- start of TLS (Thread-Local Storage) segments: - * - * 6 - TLS segment #1 [ glibc's TLS segment ] - * 7 - TLS segment #2 [ Wine's %fs Win32 segment ] - * 8 - TLS segment #3 - * 9 - reserved - * 10 - reserved - * 11 - reserved - * - * ------- start of kernel segments: - * - * 12 - kernel code segment <==== new cacheline - * 13 - kernel data segment - * 14 - default user CS - * 15 - default user DS - * 16 - TSS - * 17 - LDT - * 18 - PNPBIOS support (16->32 gate) - * 19 - PNPBIOS support - * 20 - PNPBIOS support - * 21 - PNPBIOS support - * 22 - PNPBIOS support - * 23 - APM BIOS support - * 24 - APM BIOS support - * 25 - APM BIOS support - * - * 26 - ESPFIX small SS - * 27 - unused - * 28 - unused - * 29 - unused - * 30 - unused - * 31 - TSS for double fault handler - */ -#define GDT_ENTRY_TLS_ENTRIES 3 -#define GDT_ENTRY_TLS_MIN 6 -#define GDT_ENTRY_TLS_MAX (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1) - -#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8) - -#define GDT_ENTRY_DEFAULT_USER_CS 14 -#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS * 8 + 3) - -#define GDT_ENTRY_DEFAULT_USER_DS 15 -#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS * 8 + 3) - -#define GDT_ENTRY_KERNEL_BASE 12 - -#define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE + 0) -#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8 + 1) - -#define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1) -#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8 + 1) - -#define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE + 4) -#define GDT_ENTRY_LDT (GDT_ENTRY_KERNEL_BASE + 5) - -#define GDT_ENTRY_PNPBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 6) -#define GDT_ENTRY_APMBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 11) - -#define GDT_ENTRY_ESPFIX_SS (GDT_ENTRY_KERNEL_BASE + 14) -#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8) - -#define GDT_ENTRY_DOUBLEFAULT_TSS 31 - -/* - * The GDT has 32 entries - */ -#define GDT_ENTRIES 32 - -#define GDT_SIZE (GDT_ENTRIES * 8) - -/* Simple and small GDT entries for booting only */ - -#define __BOOT_CS FLAT_KERNEL_CS - -#define __BOOT_DS FLAT_KERNEL_DS - -/* - * The interrupt descriptor table has room for 256 idt's, - * the global descriptor table is dependent on the number - * of tasks we can have.. - */ -#define IDT_ENTRIES 256 - -#endif Index: 2005-12-16/include/asm-i386/mach-xen/mach_mode.h =================================================================== --- 2005-12-16.orig/include/asm-i386/mach-xen/mach_mode.h 2005-12-22 10:30:41.000000000 +0100 +++ 2005-12-16/include/asm-i386/mach-xen/mach_mode.h 2005-12-22 10:38:37.000000000 +0100 @@ -1,6 +1,7 @@ #ifndef __ASM_MACH_MODE_H #define __ASM_MACH_MODE_H +#define KERNEL_RPL 1 #define USER_MODE_MASK 2 #endif /* __ASM_MACH_MODE_H */ Index: 2005-12-16/include/asm-i386/mach-xen/mach_seg.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ 2005-12-16/include/asm-i386/mach-xen/mach_seg.h 2005-12-22 10:50:55.000000000 +0100 @@ -0,0 +1,9 @@ +#ifndef __ASM_MACH_SEG_H +#define __ASM_MACH_SEG_H + +/* + * The GDT has 18 entries + */ +#define GDT_ENTRIES 18 + +#endif /* __ASM_MACH_SEG_H */ Index: 2005-12-16/include/asm-i386/segment.h =================================================================== --- 2005-12-16.orig/include/asm-i386/segment.h 2005-12-22 14:29:10.000000000 +0100 +++ 2005-12-16/include/asm-i386/segment.h 2005-12-22 10:49:29.000000000 +0100 @@ -1,6 +1,8 @@ #ifndef _ASM_SEGMENT_H #define _ASM_SEGMENT_H +#include + /* * The layout of the per-CPU GDT under Linux: * @@ -60,37 +62,18 @@ #define GDT_ENTRY_KERNEL_BASE 12 #define GDT_ENTRY_KERNEL_CS (GDT_ENTRY_KERNEL_BASE + 0) -#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8) +#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8 + KERNEL_RPL) #define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1) -#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8) +#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8 + KERNEL_RPL) #define GDT_ENTRY_TSS (GDT_ENTRY_KERNEL_BASE + 4) #define GDT_ENTRY_LDT (GDT_ENTRY_KERNEL_BASE + 5) -#define GDT_ENTRY_PNPBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 6) -#define GDT_ENTRY_APMBIOS_BASE (GDT_ENTRY_KERNEL_BASE + 11) - -#define GDT_ENTRY_ESPFIX_SS (GDT_ENTRY_KERNEL_BASE + 14) -#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8) - -#define GDT_ENTRY_DOUBLEFAULT_TSS 31 - -/* - * The GDT has 32 entries - */ -#define GDT_ENTRIES 32 +#include #define GDT_SIZE (GDT_ENTRIES * 8) -/* Simple and small GDT entries for booting only */ - -#define GDT_ENTRY_BOOT_CS 2 -#define __BOOT_CS (GDT_ENTRY_BOOT_CS * 8) - -#define GDT_ENTRY_BOOT_DS (GDT_ENTRY_BOOT_CS + 1) -#define __BOOT_DS (GDT_ENTRY_BOOT_DS * 8) - /* * The interrupt descriptor table has room for 256 idt's, * the global descriptor table is dependent on the number