Index: 2006-01-05/arch/x86_64/kernel/head-xen.S =================================================================== --- 2006-01-05.orig/arch/x86_64/kernel/head-xen.S 2006-01-09 16:17:27.588367840 +0100 +++ 2006-01-05/arch/x86_64/kernel/head-xen.S 2006-01-09 12:23:00.000000000 +0100 @@ -191,18 +191,18 @@ ENTRY(cpu_gdt_table) /* The TLS descriptors are currently at a different place compared to i386. Hopefully nobody expects them at a fixed place (Wine?) */ .quad 0x0000000000000000 /* NULL descriptor */ - .quad 0x008ffa000000ffff /* __KERNEL_COMPAT32_CS */ + .quad 0 /* unused, was __KERNEL_COMPAT32_CS */ .quad 0x00affa000000ffff /* __KERNEL_CS */ .quad 0x00cff2000000ffff /* __KERNEL_DS */ .quad 0x00cffa000000ffff /* __USER32_CS */ .quad 0x00cff2000000ffff /* __USER_DS, __USER32_DS */ .quad 0x00affa000000ffff /* __USER_CS */ - .quad 0x00cffa000000ffff /* __KERNEL32_CS */ + .quad 0 /* unused, was __KERNEL32_CS */ .quad 0,0 /* TSS */ .quad 0,0 /* LDT */ .quad 0,0,0 /* three TLS descriptors */ - .quad 0 /* unused now? __KERNEL16_CS - 16bit PM for S3 wakeup. */ + .quad 0 /* unused, was __KERNEL16_CS - 16bit PM for S3 wakeup. */ gdt_end: #if 0 Index: 2006-01-05/include/asm-x86_64/mach-xen/asm/segment.h =================================================================== --- 2006-01-05.orig/include/asm-x86_64/mach-xen/asm/segment.h 2006-01-09 16:17:27.589367688 +0100 +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -#ifndef _ASM_SEGMENT_H -#define _ASM_SEGMENT_H - -#include - -#define __KERNEL_CS 0x10 -#define __KERNEL_DS 0x1b - -#define __KERNEL32_CS 0x3b - -/* - * we cannot use the same code segment descriptor for user and kernel - * -- not even in the long flat mode, because of different DPL /kkeil - * The segment offset needs to contain a RPL. Grr. -AK - * GDT layout to get 64bit syscall right (sysret hardcodes gdt offsets) - */ - -#define __USER32_CS 0x23 /* 4*8+3 */ -#define __USER_DS 0x2b /* 5*8+3 */ -#define __USER_CS 0x33 /* 6*8+3 */ -#define __USER32_DS __USER_DS -#define __KERNEL16_CS (GDT_ENTRY_KERNELCS16 * 8) -#define __KERNEL_COMPAT32_CS 0x8 - -#define GDT_ENTRY_TLS 1 -#define GDT_ENTRY_TSS 8 /* needs two entries */ -#define GDT_ENTRY_LDT 10 /* needs two entries */ -#define GDT_ENTRY_TLS_MIN 12 -#define GDT_ENTRY_TLS_MAX 14 -#define GDT_ENTRY_KERNELCS16 15 - -#define GDT_ENTRY_TLS_ENTRIES 3 - -/* TLS indexes for 64bit - hardcoded in arch_prctl */ -#define FS_TLS 0 -#define GS_TLS 1 - -#define GS_TLS_SEL ((GDT_ENTRY_TLS_MIN+GS_TLS)*8 + 3) -#define FS_TLS_SEL ((GDT_ENTRY_TLS_MIN+FS_TLS)*8 + 3) - -#define IDT_ENTRIES 256 -#define GDT_ENTRIES 16 -#define GDT_SIZE (GDT_ENTRIES * 8) -#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8) - -#endif Index: 2006-01-05/include/asm-x86_64/segment.h =================================================================== --- 2006-01-05.orig/include/asm-x86_64/segment.h 2006-01-09 16:17:27.589367688 +0100 +++ 2006-01-05/include/asm-x86_64/segment.h 2006-01-09 12:03:33.000000000 +0100 @@ -1,12 +1,17 @@ #ifndef _ASM_SEGMENT_H #define _ASM_SEGMENT_H +#include #include -#define __KERNEL_CS 0x10 -#define __KERNEL_DS 0x18 +#ifndef CONFIG_XEN +#define KERNEL_RPL 0 +#else +#define KERNEL_RPL 3 +#endif -#define __KERNEL32_CS 0x38 +#define __KERNEL_CS 0x10 +#define __KERNEL_DS (0x18 | KERNEL_RPL) /* * we cannot use the same code segment descriptor for user and kernel @@ -19,15 +24,20 @@ #define __USER_DS 0x2b /* 5*8+3 */ #define __USER_CS 0x33 /* 6*8+3 */ #define __USER32_DS __USER_DS +#ifndef CONFIG_XEN #define __KERNEL16_CS (GDT_ENTRY_KERNELCS16 * 8) #define __KERNEL_COMPAT32_CS 0x8 +#define __KERNEL32_CS 0x38 +#endif #define GDT_ENTRY_TLS 1 #define GDT_ENTRY_TSS 8 /* needs two entries */ #define GDT_ENTRY_LDT 10 /* needs two entries */ #define GDT_ENTRY_TLS_MIN 12 #define GDT_ENTRY_TLS_MAX 14 +#ifndef CONFIG_XEN #define GDT_ENTRY_KERNELCS16 15 +#endif #define GDT_ENTRY_TLS_ENTRIES 3