diff options
Diffstat (limited to 'src/cpu/x86/lapic/lapic_cpu_init.c')
-rw-r--r-- | src/cpu/x86/lapic/lapic_cpu_init.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/cpu/x86/lapic/lapic_cpu_init.c b/src/cpu/x86/lapic/lapic_cpu_init.c index 9a00b8289f..69430d551f 100644 --- a/src/cpu/x86/lapic/lapic_cpu_init.c +++ b/src/cpu/x86/lapic/lapic_cpu_init.c @@ -52,12 +52,30 @@ int lowmem_backup_size; #endif extern char _secondary_start[]; +extern char _secondary_gdt_addr[]; +extern char gdt[]; +extern char gdt_end[]; + +static inline void setup_secondary_gdt(void) +{ + u16 *gdt_limit; + u32 *gdt_base; + + gdt_limit = (void *)&_secondary_gdt_addr; + gdt_base = (void *)&gdt_limit[1]; + + *gdt_limit = (u32)&gdt_end - (u32)&gdt - 1; + *gdt_base = (u32)&gdt; +} static void copy_secondary_start_to_lowest_1M(void) { extern char _secondary_start_end[]; unsigned long code_size; + /* Fill in secondary_start's local gdt. */ + setup_secondary_gdt(); + code_size = (unsigned long)_secondary_start_end - (unsigned long)_secondary_start; #if CONFIG_HAVE_ACPI_RESUME |