x86: same gdt_page with macro
Move the 32-bit and 64-bit gdt_page definitions next to each other, separated with an #ifdef. Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
f0fc4aff1f
commit
950ad7ff6e
2 changed files with 54 additions and 0 deletions
|
@ -40,6 +40,22 @@
|
||||||
|
|
||||||
static struct cpu_dev *this_cpu __cpuinitdata;
|
static struct cpu_dev *this_cpu __cpuinitdata;
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
/* We need valid kernel segments for data and code in long mode too
|
||||||
|
* IRET will check the segment types kkeil 2000/10/28
|
||||||
|
* Also sysret mandates a special GDT layout
|
||||||
|
*/
|
||||||
|
/* The TLS descriptors are currently at a different place compared to i386.
|
||||||
|
Hopefully nobody expects them at a fixed place (Wine?) */
|
||||||
|
DEFINE_PER_CPU(struct gdt_page, gdt_page) = { .gdt = {
|
||||||
|
[GDT_ENTRY_KERNEL32_CS] = { { { 0x0000ffff, 0x00cf9b00 } } },
|
||||||
|
[GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00af9b00 } } },
|
||||||
|
[GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9300 } } },
|
||||||
|
[GDT_ENTRY_DEFAULT_USER32_CS] = { { { 0x0000ffff, 0x00cffb00 } } },
|
||||||
|
[GDT_ENTRY_DEFAULT_USER_DS] = { { { 0x0000ffff, 0x00cff300 } } },
|
||||||
|
[GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00affb00 } } },
|
||||||
|
} };
|
||||||
|
#else
|
||||||
DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {
|
DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {
|
||||||
[GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00cf9a00 } } },
|
[GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00cf9a00 } } },
|
||||||
[GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9200 } } },
|
[GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9200 } } },
|
||||||
|
@ -74,6 +90,7 @@ DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {
|
||||||
[GDT_ENTRY_ESPFIX_SS] = { { { 0x00000000, 0x00c09200 } } },
|
[GDT_ENTRY_ESPFIX_SS] = { { { 0x00000000, 0x00c09200 } } },
|
||||||
[GDT_ENTRY_PERCPU] = { { { 0x00000000, 0x00000000 } } },
|
[GDT_ENTRY_PERCPU] = { { { 0x00000000, 0x00000000 } } },
|
||||||
} };
|
} };
|
||||||
|
#endif
|
||||||
EXPORT_PER_CPU_SYMBOL_GPL(gdt_page);
|
EXPORT_PER_CPU_SYMBOL_GPL(gdt_page);
|
||||||
|
|
||||||
static int cachesize_override __cpuinitdata = -1;
|
static int cachesize_override __cpuinitdata = -1;
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
|
|
||||||
static struct cpu_dev *this_cpu __cpuinitdata;
|
static struct cpu_dev *this_cpu __cpuinitdata;
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
/* We need valid kernel segments for data and code in long mode too
|
/* We need valid kernel segments for data and code in long mode too
|
||||||
* IRET will check the segment types kkeil 2000/10/28
|
* IRET will check the segment types kkeil 2000/10/28
|
||||||
* Also sysret mandates a special GDT layout
|
* Also sysret mandates a special GDT layout
|
||||||
|
@ -53,6 +54,42 @@ DEFINE_PER_CPU(struct gdt_page, gdt_page) = { .gdt = {
|
||||||
[GDT_ENTRY_DEFAULT_USER_DS] = { { { 0x0000ffff, 0x00cff300 } } },
|
[GDT_ENTRY_DEFAULT_USER_DS] = { { { 0x0000ffff, 0x00cff300 } } },
|
||||||
[GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00affb00 } } },
|
[GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00affb00 } } },
|
||||||
} };
|
} };
|
||||||
|
#else
|
||||||
|
DEFINE_PER_CPU_PAGE_ALIGNED(struct gdt_page, gdt_page) = { .gdt = {
|
||||||
|
[GDT_ENTRY_KERNEL_CS] = { { { 0x0000ffff, 0x00cf9a00 } } },
|
||||||
|
[GDT_ENTRY_KERNEL_DS] = { { { 0x0000ffff, 0x00cf9200 } } },
|
||||||
|
[GDT_ENTRY_DEFAULT_USER_CS] = { { { 0x0000ffff, 0x00cffa00 } } },
|
||||||
|
[GDT_ENTRY_DEFAULT_USER_DS] = { { { 0x0000ffff, 0x00cff200 } } },
|
||||||
|
/*
|
||||||
|
* Segments used for calling PnP BIOS have byte granularity.
|
||||||
|
* They code segments and data segments have fixed 64k limits,
|
||||||
|
* the transfer segment sizes are set at run time.
|
||||||
|
*/
|
||||||
|
/* 32-bit code */
|
||||||
|
[GDT_ENTRY_PNPBIOS_CS32] = { { { 0x0000ffff, 0x00409a00 } } },
|
||||||
|
/* 16-bit code */
|
||||||
|
[GDT_ENTRY_PNPBIOS_CS16] = { { { 0x0000ffff, 0x00009a00 } } },
|
||||||
|
/* 16-bit data */
|
||||||
|
[GDT_ENTRY_PNPBIOS_DS] = { { { 0x0000ffff, 0x00009200 } } },
|
||||||
|
/* 16-bit data */
|
||||||
|
[GDT_ENTRY_PNPBIOS_TS1] = { { { 0x00000000, 0x00009200 } } },
|
||||||
|
/* 16-bit data */
|
||||||
|
[GDT_ENTRY_PNPBIOS_TS2] = { { { 0x00000000, 0x00009200 } } },
|
||||||
|
/*
|
||||||
|
* The APM segments have byte granularity and their bases
|
||||||
|
* are set at run time. All have 64k limits.
|
||||||
|
*/
|
||||||
|
/* 32-bit code */
|
||||||
|
[GDT_ENTRY_APMBIOS_BASE] = { { { 0x0000ffff, 0x00409a00 } } },
|
||||||
|
/* 16-bit code */
|
||||||
|
[GDT_ENTRY_APMBIOS_BASE+1] = { { { 0x0000ffff, 0x00009a00 } } },
|
||||||
|
/* data */
|
||||||
|
[GDT_ENTRY_APMBIOS_BASE+2] = { { { 0x0000ffff, 0x00409200 } } },
|
||||||
|
|
||||||
|
[GDT_ENTRY_ESPFIX_SS] = { { { 0x00000000, 0x00c09200 } } },
|
||||||
|
[GDT_ENTRY_PERCPU] = { { { 0x00000000, 0x00000000 } } },
|
||||||
|
} };
|
||||||
|
#endif
|
||||||
EXPORT_PER_CPU_SYMBOL_GPL(gdt_page);
|
EXPORT_PER_CPU_SYMBOL_GPL(gdt_page);
|
||||||
|
|
||||||
__u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata;
|
__u32 cleared_cpu_caps[NCAPINTS] __cpuinitdata;
|
||||||
|
|
Loading…
Reference in a new issue