Unify segment headers
cover Unify segment headers
Hi,
In this patch, I unify segment_32.h and segment_64.h into segment.h They have some common parts, but a considerable ammount of code still has to be around ifdefs.
The only patch that is really important to paravirt is the first one, that moves a paravirt definition into the common header. The other two are just normal integration, and pretty much independent
PATCH 1/3 put get_kernel_rpl in a common location
This macro is useful for both i386 and x86_64, so put it in a common location, where both arches can grab it.
--- include/asm-x86/segment.h | 9 +++++++++ include/asm-x86/segment_32.h | 3 --- 2 files changed, 9 insertions(+), 3 deletions(-)
include/asm-x86/segment.h +9 -0
@@ -1,5 +1,14 @@ +#ifndef _ASM_X86_SEGMENT_H_ +#define _ASM_X86_SEGMENT_H_ +#ifdef CONFIG_X86_32 # include "segment_32.h" #else # include "segment_64.h" #endif + +#ifndef CONFIG_PARAVIRT +#define get_kernel_rpl () 0 +#endif + +#endif
include/asm-x86/segment_32.h +0 -3
@@ -129,9 +129,6 @@#define SEGMENT_LDT 0x4#define SEGMENT_GDT 0x0 -#ifndef CONFIG_PARAVIRT -#define get_kernel_rpl () 0 -#endif /* * Matching rules for certain types of segments. */
Signature · 1 line
1.4.4.2
PATCH 1/3 put get_kernel_rpl in a common location
In reply to Glauber de Oliveira CostaThis macro is useful for both i386 and x86_64, so put it in a common location, where both arches can grab it.
--- include/asm-x86/segment.h | 9 +++++++++ include/asm-x86/segment_32.h | 3 --- 2 files changed, 9 insertions(+), 3 deletions(-)
include/asm-x86/segment.h +9 -0
@@ -1,5 +1,14 @@ +#ifndef _ASM_X86_SEGMENT_H_ +#define _ASM_X86_SEGMENT_H_ +#ifdef CONFIG_X86_32 # include "segment_32.h" #else # include "segment_64.h" #endif + +#ifndef CONFIG_PARAVIRT +#define get_kernel_rpl () 0 +#endif + +#endif
include/asm-x86/segment_32.h +0 -3
@@ -129,9 +129,6 @@#define SEGMENT_LDT 0x4#define SEGMENT_GDT 0x0 -#ifndef CONFIG_PARAVIRT -#define get_kernel_rpl () 0 -#endif /* * Matching rules for certain types of segments. */
Signature · 1 line
1.4.4.2
PATCH 2/3 unify common parts of segment.h
Although segment handling in i386 and x86_64 are very different, there's a common part. Put them in segment.h instead of arch specific headers
--- include/asm-x86/segment.h | 16 ++++++++++++++++ include/asm-x86/segment_32.h | 22 ---------------------- include/asm-x86/segment_64.h | 17 ----------------- 3 files changed, 16 insertions(+), 39 deletions(-)
include/asm-x86/segment.h +16 -0
@@ -11,4 +11,20 @@#define get_kernel_rpl () 0#endif +/* User mode is privilege level 3 */ +#define USER_RPL 0x3 +/* LDT segment has TI set, GDT has it cleared */ +#define SEGMENT_LDT 0x4 +#define SEGMENT_GDT 0x0 + +/* Bottom two bits of selector give the ring privilege level */ +#define SEGMENT_RPL_MASK 0x3 +/* Bit 2 is table indicator (LDT/GDT) */ +#define SEGMENT_TI_MASK 0x4 + +#define IDT_ENTRIES 256 +#define GDT_SIZE (GDT_ENTRIES * 8) +#define GDT_ENTRY_TLS_ENTRIES 3 +#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8) +#endif
include/asm-x86/segment_32.h +0 -22
@@ -45,12 +45,9 @@* 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)
@@ -87,7 +84,6 @@* The GDT has 32 entries */ #define GDT_ENTRIES 32 -#define GDT_SIZE (GDT_ENTRIES * 8)/* Simple and small GDT entries for booting only */
@@ -112,24 +108,6 @@#define PNP_TS2 (GDT_ENTRY_PNPBIOS_TS2 * 8)/* another data segment */ /* -* 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 - -/* Bottom two bits of selector give the ring privilege level */ -#define SEGMENT_RPL_MASK 0x3 -/* Bit 2 is table indicator (LDT/GDT) */ -#define SEGMENT_TI_MASK 0x4 - -/* User mode is privilege level 3 */ -#define USER_RPL 0x3 -/* LDT segment has TI set, GDT has it cleared */ -#define SEGMENT_LDT 0x4 -#define SEGMENT_GDT 0x0 - -/* * Matching rules for certain types of segments. */
include/asm-x86/segment_64.h +0 -17
@@ -33,8 +33,6 @@#define GDT_ENTRY_TLS_MIN 12#define GDT_ENTRY_TLS_MAX 14 -#define GDT_ENTRY_TLS_ENTRIES 3 -#define GDT_ENTRY_PER_CPU 15/* Abused to load per CPU data from limit */ #define __PER_CPU_SEG (GDT_ENTRY_PER_CPU * 8 + 3)
@@ -45,20 +43,5 @@#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) - -/* Bottom two bits of selector give the ring privilege level */ -#define SEGMENT_RPL_MASK 0x3 -/* Bit 2 is table indicator (LDT/GDT) */ -#define SEGMENT_TI_MASK 0x4 - -/* User mode is privilege level 3 */ -#define USER_RPL 0x3 -/* LDT segment has TI set, GDT has it cleared */ -#define SEGMENT_LDT 0x4 -#define SEGMENT_GDT 0x0 -#endif
Signature · 1 line
1.4.4.2
PATCH 2/3 unify common parts of segment.h
In reply to Glauber de Oliveira CostaAlthough segment handling in i386 and x86_64 are very different, there's a common part. Put them in segment.h instead of arch specific headers
--- include/asm-x86/segment.h | 16 ++++++++++++++++ include/asm-x86/segment_32.h | 22 ---------------------- include/asm-x86/segment_64.h | 17 ----------------- 3 files changed, 16 insertions(+), 39 deletions(-)
include/asm-x86/segment.h +16 -0
@@ -11,4 +11,20 @@#define get_kernel_rpl () 0#endif +/* User mode is privilege level 3 */ +#define USER_RPL 0x3 +/* LDT segment has TI set, GDT has it cleared */ +#define SEGMENT_LDT 0x4 +#define SEGMENT_GDT 0x0 + +/* Bottom two bits of selector give the ring privilege level */ +#define SEGMENT_RPL_MASK 0x3 +/* Bit 2 is table indicator (LDT/GDT) */ +#define SEGMENT_TI_MASK 0x4 + +#define IDT_ENTRIES 256 +#define GDT_SIZE (GDT_ENTRIES * 8) +#define GDT_ENTRY_TLS_ENTRIES 3 +#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8) +#endif
include/asm-x86/segment_32.h +0 -22
@@ -45,12 +45,9 @@* 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)
@@ -87,7 +84,6 @@* The GDT has 32 entries */ #define GDT_ENTRIES 32 -#define GDT_SIZE (GDT_ENTRIES * 8)/* Simple and small GDT entries for booting only */
@@ -112,24 +108,6 @@#define PNP_TS2 (GDT_ENTRY_PNPBIOS_TS2 * 8)/* another data segment */ /* -* 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 - -/* Bottom two bits of selector give the ring privilege level */ -#define SEGMENT_RPL_MASK 0x3 -/* Bit 2 is table indicator (LDT/GDT) */ -#define SEGMENT_TI_MASK 0x4 - -/* User mode is privilege level 3 */ -#define USER_RPL 0x3 -/* LDT segment has TI set, GDT has it cleared */ -#define SEGMENT_LDT 0x4 -#define SEGMENT_GDT 0x0 - -/* * Matching rules for certain types of segments. */
include/asm-x86/segment_64.h +0 -17
@@ -33,8 +33,6 @@#define GDT_ENTRY_TLS_MIN 12#define GDT_ENTRY_TLS_MAX 14 -#define GDT_ENTRY_TLS_ENTRIES 3 -#define GDT_ENTRY_PER_CPU 15/* Abused to load per CPU data from limit */ #define __PER_CPU_SEG (GDT_ENTRY_PER_CPU * 8 + 3)
@@ -45,20 +43,5 @@#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) - -/* Bottom two bits of selector give the ring privilege level */ -#define SEGMENT_RPL_MASK 0x3 -/* Bit 2 is table indicator (LDT/GDT) */ -#define SEGMENT_TI_MASK 0x4 - -/* User mode is privilege level 3 */ -#define USER_RPL 0x3 -/* LDT segment has TI set, GDT has it cleared */ -#define SEGMENT_LDT 0x4 -#define SEGMENT_GDT 0x0 -#endif
Signature · 1 line
1.4.4.2
PATCH 3/3 remove arch specific segment headers
This file puts the remainder of the arch specificic segment headers in segment.h.
--- include/asm-x86/segment.h | 177 +++++++++++++++++++++++++++++++++++++++++- include/asm-x86/segment_32.h | 122 ----------------------------- include/asm-x86/segment_64.h | 47 ----------- 3 files changed, 175 insertions(+), 171 deletions(-)
include/asm-x86/segment.h +175 -2
@@ -2,9 +2,182 @@#define _ASM_X86_SEGMENT_H_#ifdef CONFIG_X86_32 -# include "segment_32.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 - per-cpu [ offset to per-cpu data area ] +* 28 - unused +* 29 - unused +* 30 - unused +* 31 - TSS for double fault handler +*/ +#define GDT_ENTRY_TLS_MIN 6 +#define GDT_ENTRY_TLS_MAX (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1) + +#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) + +#define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1) +#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8) + +#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_PERCPU (GDT_ENTRY_KERNEL_BASE + 15) +#ifdef CONFIG_SMP +#define __KERNEL_PERCPU (GDT_ENTRY_PERCPU * 8) +#else +#define __KERNEL_PERCPU 0 +#endif + +#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) + +/* The PnP BIOS entries in the GDT */ +#define GDT_ENTRY_PNPBIOS_CS32 (GDT_ENTRY_PNPBIOS_BASE + 0) +#define GDT_ENTRY_PNPBIOS_CS16 (GDT_ENTRY_PNPBIOS_BASE + 1) +#define GDT_ENTRY_PNPBIOS_DS (GDT_ENTRY_PNPBIOS_BASE + 2) +#define GDT_ENTRY_PNPBIOS_TS1 (GDT_ENTRY_PNPBIOS_BASE + 3) +#define GDT_ENTRY_PNPBIOS_TS2 (GDT_ENTRY_PNPBIOS_BASE + 4) + +/* The PnP BIOS selectors */ +#define PNP_CS32 (GDT_ENTRY_PNPBIOS_CS32 * 8)/* segment for calling fn */ +#define PNP_CS16 (GDT_ENTRY_PNPBIOS_CS16 * 8)/* code segment for BIOS */ +#define PNP_DS (GDT_ENTRY_PNPBIOS_DS * 8)/* data segment for BIOS */ +#define PNP_TS1 (GDT_ENTRY_PNPBIOS_TS1 * 8)/* transfer data segment */ +#define PNP_TS2 (GDT_ENTRY_PNPBIOS_TS2 * 8)/* another data segment */ + +/* Bottom two bits of selector give the ring privilege level */ +#define SEGMENT_RPL_MASK 0x3 +/* Bit 2 is table indicator (LDT/GDT) */ +#define SEGMENT_TI_MASK 0x4 + +/* User mode is privilege level 3 */ +#define USER_RPL 0x3 +/* LDT segment has TI set, GDT has it cleared */ +#define SEGMENT_LDT 0x4 +#define SEGMENT_GDT 0x0 + +/* +* Matching rules for certain types of segments. +*/ + +/* Matches only __KERNEL_CS, ignoring PnP / USER / APM segments */ +#define SEGMENT_IS_KERNEL_CODE (x) (((x) & 0xfc) == GDT_ENTRY_KERNEL_CS * 8) + +/* Matches __KERNEL_CS and __USER_CS (they must be 2 entries apart) */ +#define SEGMENT_IS_FLAT_CODE (x) (((x) & 0xec) == GDT_ENTRY_KERNEL_CS * 8) + +/* Matches PNP_CS32 and PNP_CS16 (they must be consecutive) */ +#define SEGMENT_IS_PNP_CODE (x) (((x) & 0xf4) == GDT_ENTRY_PNPBIOS_BASE * 8) + +#else -# include "segment_64.h" +#include <asm/cache.h> + +/* 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) + +#define __KERNEL_CS 0x10 +#define __KERNEL_DS 0x18 + +#define __KERNEL32_CS 0x08 + +/* +* 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 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_PER_CPU 15/* Abused to load per CPU data from limit */ +#define __PER_CPU_SEG (GDT_ENTRY_PER_CPU * 8 + 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 GDT_ENTRIES 16 +#endif #ifndef CONFIG_PARAVIRT
include/asm-x86/segment_32.h +0 -122
123 lines not on this page · raw message
include/asm-x86/segment_64.h deleted +0 -47
47 lines not on this page · raw message
Signature · 1 line
1.4.4.2
PATCH 3/3 remove arch specific segment headers
In reply to Glauber de Oliveira CostaThis file puts the remainder of the arch specificic segment headers in segment.h.
--- include/asm-x86/segment.h | 177 +++++++++++++++++++++++++++++++++++++++++- include/asm-x86/segment_32.h | 122 ----------------------------- include/asm-x86/segment_64.h | 47 ----------- 3 files changed, 175 insertions(+), 171 deletions(-)
include/asm-x86/segment.h +175 -2
@@ -2,9 +2,182 @@#define _ASM_X86_SEGMENT_H_#ifdef CONFIG_X86_32 -# include "segment_32.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 - per-cpu [ offset to per-cpu data area ] +* 28 - unused +* 29 - unused +* 30 - unused +* 31 - TSS for double fault handler +*/ +#define GDT_ENTRY_TLS_MIN 6 +#define GDT_ENTRY_TLS_MAX (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1) + +#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) + +#define GDT_ENTRY_KERNEL_DS (GDT_ENTRY_KERNEL_BASE + 1) +#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8) + +#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_PERCPU (GDT_ENTRY_KERNEL_BASE + 15) +#ifdef CONFIG_SMP +#define __KERNEL_PERCPU (GDT_ENTRY_PERCPU * 8) +#else +#define __KERNEL_PERCPU 0 +#endif + +#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) + +/* The PnP BIOS entries in the GDT */ +#define GDT_ENTRY_PNPBIOS_CS32 (GDT_ENTRY_PNPBIOS_BASE + 0) +#define GDT_ENTRY_PNPBIOS_CS16 (GDT_ENTRY_PNPBIOS_BASE + 1) +#define GDT_ENTRY_PNPBIOS_DS (GDT_ENTRY_PNPBIOS_BASE + 2) +#define GDT_ENTRY_PNPBIOS_TS1 (GDT_ENTRY_PNPBIOS_BASE + 3) +#define GDT_ENTRY_PNPBIOS_TS2 (GDT_ENTRY_PNPBIOS_BASE + 4) + +/* The PnP BIOS selectors */ +#define PNP_CS32 (GDT_ENTRY_PNPBIOS_CS32 * 8)/* segment for calling fn */ +#define PNP_CS16 (GDT_ENTRY_PNPBIOS_CS16 * 8)/* code segment for BIOS */ +#define PNP_DS (GDT_ENTRY_PNPBIOS_DS * 8)/* data segment for BIOS */ +#define PNP_TS1 (GDT_ENTRY_PNPBIOS_TS1 * 8)/* transfer data segment */ +#define PNP_TS2 (GDT_ENTRY_PNPBIOS_TS2 * 8)/* another data segment */ + +/* Bottom two bits of selector give the ring privilege level */ +#define SEGMENT_RPL_MASK 0x3 +/* Bit 2 is table indicator (LDT/GDT) */ +#define SEGMENT_TI_MASK 0x4 + +/* User mode is privilege level 3 */ +#define USER_RPL 0x3 +/* LDT segment has TI set, GDT has it cleared */ +#define SEGMENT_LDT 0x4 +#define SEGMENT_GDT 0x0 + +/* +* Matching rules for certain types of segments. +*/ + +/* Matches only __KERNEL_CS, ignoring PnP / USER / APM segments */ +#define SEGMENT_IS_KERNEL_CODE (x) (((x) & 0xfc) == GDT_ENTRY_KERNEL_CS * 8) + +/* Matches __KERNEL_CS and __USER_CS (they must be 2 entries apart) */ +#define SEGMENT_IS_FLAT_CODE (x) (((x) & 0xec) == GDT_ENTRY_KERNEL_CS * 8) + +/* Matches PNP_CS32 and PNP_CS16 (they must be consecutive) */ +#define SEGMENT_IS_PNP_CODE (x) (((x) & 0xf4) == GDT_ENTRY_PNPBIOS_BASE * 8) + +#else -# include "segment_64.h" +#include <asm/cache.h> + +/* 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) + +#define __KERNEL_CS 0x10 +#define __KERNEL_DS 0x18 + +#define __KERNEL32_CS 0x08 + +/* +* 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 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_PER_CPU 15/* Abused to load per CPU data from limit */ +#define __PER_CPU_SEG (GDT_ENTRY_PER_CPU * 8 + 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 GDT_ENTRIES 16 +#endif #ifndef CONFIG_PARAVIRT
include/asm-x86/segment_32.h +0 -122
123 lines not on this page · raw message
include/asm-x86/segment_64.h deleted +0 -47
47 lines not on this page · raw message
Signature · 1 line
1.4.4.2
Quoted 9 lines · Glauber de Oliveira Costa
Hi,
In this patch, I unify
segment_32.handsegment_64.hintosegment.hThey have some common parts, but a considerable ammount of code still has to be around ifdefs.The only patch that is really important to paravirt is the first one, that moves a paravirt definition into the common header. The other two are just normal integration, and pretty much independent
thanks, i've picked them up for x86.git.
Ingo
Quoted 9 lines · Glauber de Oliveira Costa
Hi,
In this patch, I unify
segment_32.handsegment_64.hintosegment.hThey have some common parts, but a considerable ammount of code still has to be around ifdefs.The only patch that is really important to paravirt is the first one, that moves a paravirt definition into the common header. The other two are just normal integration, and pretty much independent
thanks, i've picked them up for x86.git.
Ingo