Commit 7a61d35d authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Andi Kleen

[PATCH] i386: Page-align the GDT

Xen wants a dedicated page for the GDT.  I believe VMI likes it too.
lguest, KVM and native don't care.

Simple transformation to page-aligned "struct gdt_page".
Signed-off-by: default avatarRusty Russell <rusty@rustcorp.com.au>
Signed-off-by: default avatarAndi Kleen <ak@suse.de>
Acked-by: default avatarJeremy Fitzhardinge <jeremy@xensource.com>
parent 39b7ee06
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include "cpu.h" #include "cpu.h"
DEFINE_PER_CPU(struct desc_struct, cpu_gdt[GDT_ENTRIES]) = { DEFINE_PER_CPU(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 },
[GDT_ENTRY_DEFAULT_USER_CS] = { 0x0000ffff, 0x00cffa00 }, [GDT_ENTRY_DEFAULT_USER_CS] = { 0x0000ffff, 0x00cffa00 },
...@@ -48,8 +48,8 @@ DEFINE_PER_CPU(struct desc_struct, cpu_gdt[GDT_ENTRIES]) = { ...@@ -48,8 +48,8 @@ DEFINE_PER_CPU(struct desc_struct, cpu_gdt[GDT_ENTRIES]) = {
[GDT_ENTRY_ESPFIX_SS] = { 0x00000000, 0x00c09200 }, [GDT_ENTRY_ESPFIX_SS] = { 0x00000000, 0x00c09200 },
[GDT_ENTRY_PDA] = { 0x00000000, 0x00c09200 }, /* set in setup_pda */ [GDT_ENTRY_PDA] = { 0x00000000, 0x00c09200 }, /* set in setup_pda */
}; } };
EXPORT_PER_CPU_SYMBOL_GPL(cpu_gdt); EXPORT_PER_CPU_SYMBOL_GPL(gdt_page);
DEFINE_PER_CPU(struct i386_pda, _cpu_pda); DEFINE_PER_CPU(struct i386_pda, _cpu_pda);
EXPORT_PER_CPU_SYMBOL(_cpu_pda); EXPORT_PER_CPU_SYMBOL(_cpu_pda);
......
...@@ -557,7 +557,7 @@ END(syscall_badsys) ...@@ -557,7 +557,7 @@ END(syscall_badsys)
#define FIXUP_ESPFIX_STACK \ #define FIXUP_ESPFIX_STACK \
/* since we are on a wrong stack, we cant make it a C code :( */ \ /* since we are on a wrong stack, we cant make it a C code :( */ \
movl %fs:PDA_cpu, %ebx; \ movl %fs:PDA_cpu, %ebx; \
PER_CPU(cpu_gdt, %ebx); \ PER_CPU(gdt_page, %ebx); \
GET_DESC_BASE(GDT_ENTRY_ESPFIX_SS, %ebx, %eax, %ax, %al, %ah); \ GET_DESC_BASE(GDT_ENTRY_ESPFIX_SS, %ebx, %eax, %ax, %al, %ah); \
addl %esp, %eax; \ addl %esp, %eax; \
pushl $__KERNEL_DS; \ pushl $__KERNEL_DS; \
......
...@@ -598,7 +598,7 @@ idt_descr: ...@@ -598,7 +598,7 @@ idt_descr:
.word 0 # 32 bit align gdt_desc.address .word 0 # 32 bit align gdt_desc.address
ENTRY(early_gdt_descr) ENTRY(early_gdt_descr)
.word GDT_ENTRIES*8-1 .word GDT_ENTRIES*8-1
.long per_cpu__cpu_gdt /* Overwritten for secondary CPUs */ .long per_cpu__gdt_page /* Overwritten for secondary CPUs */
/* /*
* The boot_gdt must mirror the equivalent in setup.S and is * The boot_gdt must mirror the equivalent in setup.S and is
......
...@@ -1030,7 +1030,7 @@ fastcall void do_spurious_interrupt_bug(struct pt_regs * regs, ...@@ -1030,7 +1030,7 @@ fastcall void do_spurious_interrupt_bug(struct pt_regs * regs,
fastcall unsigned long patch_espfix_desc(unsigned long uesp, fastcall unsigned long patch_espfix_desc(unsigned long uesp,
unsigned long kesp) unsigned long kesp)
{ {
struct desc_struct *gdt = __get_cpu_var(cpu_gdt); struct desc_struct *gdt = __get_cpu_var(gdt_page).gdt;
unsigned long base = (kesp - uesp) & -THREAD_SIZE; unsigned long base = (kesp - uesp) & -THREAD_SIZE;
unsigned long new_kesp = kesp - base; unsigned long new_kesp = kesp - base;
unsigned long lim_pages = (new_kesp | (THREAD_SIZE - 1)) >> PAGE_SHIFT; unsigned long lim_pages = (new_kesp | (THREAD_SIZE - 1)) >> PAGE_SHIFT;
......
...@@ -18,10 +18,15 @@ struct Xgt_desc_struct { ...@@ -18,10 +18,15 @@ struct Xgt_desc_struct {
unsigned short pad; unsigned short pad;
} __attribute__ ((packed)); } __attribute__ ((packed));
DECLARE_PER_CPU(struct desc_struct, cpu_gdt[GDT_ENTRIES]); struct gdt_page
{
struct desc_struct gdt[GDT_ENTRIES];
} __attribute__((aligned(PAGE_SIZE)));
DECLARE_PER_CPU(struct gdt_page, gdt_page);
static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu) static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
{ {
return per_cpu(cpu_gdt, cpu); return per_cpu(gdt_page, cpu).gdt;
} }
extern struct Xgt_desc_struct idt_descr; extern struct Xgt_desc_struct idt_descr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment