Relocate the GDT to reserved memory, so it won't get clobbered by elfboot(), etc.
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2024 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
9b945c7cd8
commit
d94e1d6e9d
|
@ -7,6 +7,32 @@
|
||||||
#include <arch/acpi.h>
|
#include <arch/acpi.h>
|
||||||
#include "linuxbios_table.h"
|
#include "linuxbios_table.h"
|
||||||
|
|
||||||
|
// Global Descriptor Table, defined in c_start.S
|
||||||
|
extern uint8_t gdt;
|
||||||
|
extern uint8_t gdt_end;
|
||||||
|
|
||||||
|
/* i386 lgdt argument */
|
||||||
|
struct gdtarg {
|
||||||
|
unsigned short limit;
|
||||||
|
unsigned int base;
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
// Copy GDT to new location and reload it
|
||||||
|
// 2003-07 by SONE Takeshi
|
||||||
|
// Ported from Etherboot to LinuxBIOS 2005-08 by Steve Magnani
|
||||||
|
void move_gdt(unsigned long newgdt)
|
||||||
|
{
|
||||||
|
uint16_t num_gdt_bytes = &gdt_end - &gdt;
|
||||||
|
struct gdtarg gdtarg;
|
||||||
|
|
||||||
|
printk_debug("Moving GDT to %#lx...", newgdt);
|
||||||
|
memcpy((void*)newgdt, &gdt, num_gdt_bytes);
|
||||||
|
gdtarg.base = newgdt;
|
||||||
|
gdtarg.limit = num_gdt_bytes - 1;
|
||||||
|
__asm__ __volatile__ ("lgdt %0\n\t" : : "m" (gdtarg));
|
||||||
|
printk_debug("ok\n");
|
||||||
|
}
|
||||||
|
|
||||||
struct lb_memory *write_tables(void)
|
struct lb_memory *write_tables(void)
|
||||||
{
|
{
|
||||||
unsigned long low_table_start, low_table_end;
|
unsigned long low_table_start, low_table_end;
|
||||||
|
@ -45,6 +71,10 @@ struct lb_memory *write_tables(void)
|
||||||
low_table_end = 0x500;
|
low_table_end = 0x500;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Relocate the GDT to reserved memory, so it won't get clobbered
|
||||||
|
move_gdt(low_table_end);
|
||||||
|
low_table_end += &gdt_end - &gdt;
|
||||||
|
|
||||||
/* The linuxbios table must be in 0-4K or 960K-1M */
|
/* The linuxbios table must be in 0-4K or 960K-1M */
|
||||||
write_linuxbios_table(
|
write_linuxbios_table(
|
||||||
low_table_start, low_table_end,
|
low_table_start, low_table_end,
|
||||||
|
|
Loading…
Reference in New Issue