mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-10-03 10:00:42 +09:00
x86: Move the GDT into global_data
Rather than keeping track of the Global Descriptor Table in its own memory we may as well put it in global_data with everything else. As a first step, stop using the separately allocated GDT. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
1fed87db6a
commit
2db9374561
@ -136,9 +136,10 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
|
|||||||
asm volatile("lgdtl %0\n" : : "m" (gdt));
|
asm volatile("lgdtl %0\n" : : "m" (gdt));
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_gdt(gd_t *id, u64 *gdt_addr)
|
void setup_gdt(gd_t *new_gd, u64 *gdt_addr)
|
||||||
{
|
{
|
||||||
id->arch.gdt = gdt_addr;
|
gdt_addr = new_gd->arch.gdt;
|
||||||
|
|
||||||
/* CS: code, read/execute, 4 GB, base 0 */
|
/* CS: code, read/execute, 4 GB, base 0 */
|
||||||
gdt_addr[X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff);
|
gdt_addr[X86_GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff);
|
||||||
|
|
||||||
@ -146,9 +147,9 @@ void setup_gdt(gd_t *id, u64 *gdt_addr)
|
|||||||
gdt_addr[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff);
|
gdt_addr[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff);
|
||||||
|
|
||||||
/* FS: data, read/write, 4 GB, base (Global Data Pointer) */
|
/* FS: data, read/write, 4 GB, base (Global Data Pointer) */
|
||||||
id->arch.gd_addr = id;
|
new_gd->arch.gd_addr = new_gd;
|
||||||
gdt_addr[X86_GDT_ENTRY_32BIT_FS] = GDT_ENTRY(0xc093,
|
gdt_addr[X86_GDT_ENTRY_32BIT_FS] = GDT_ENTRY(0xc093,
|
||||||
(ulong)&id->arch.gd_addr, 0xfffff);
|
(ulong)&new_gd->arch.gd_addr, 0xfffff);
|
||||||
|
|
||||||
/* 16-bit CS: code, read/execute, 64 kB, base 0 */
|
/* 16-bit CS: code, read/execute, 64 kB, base 0 */
|
||||||
gdt_addr[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x009b, 0, 0x0ffff);
|
gdt_addr[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x009b, 0, 0x0ffff);
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#include <asm/processor.h>
|
||||||
|
|
||||||
enum pei_boot_mode_t {
|
enum pei_boot_mode_t {
|
||||||
PEI_BOOT_NONE = 0,
|
PEI_BOOT_NONE = 0,
|
||||||
PEI_BOOT_SOFT_RESET,
|
PEI_BOOT_SOFT_RESET,
|
||||||
@ -44,6 +46,7 @@ struct mtrr_request {
|
|||||||
|
|
||||||
/* Architecture-specific global data */
|
/* Architecture-specific global data */
|
||||||
struct arch_global_data {
|
struct arch_global_data {
|
||||||
|
u64 gdt[X86_GDT_NUM_ENTRIES] __aligned(16);
|
||||||
struct global_data *gd_addr; /* Location of Global Data */
|
struct global_data *gd_addr; /* Location of Global Data */
|
||||||
uint8_t x86; /* CPU family */
|
uint8_t x86; /* CPU family */
|
||||||
uint8_t x86_vendor; /* CPU vendor */
|
uint8_t x86_vendor; /* CPU vendor */
|
||||||
@ -68,7 +71,6 @@ struct arch_global_data {
|
|||||||
/* MRC training data to save for the next boot */
|
/* MRC training data to save for the next boot */
|
||||||
char *mrc_output;
|
char *mrc_output;
|
||||||
unsigned int mrc_output_len;
|
unsigned int mrc_output_len;
|
||||||
void *gdt; /* Global descriptor table */
|
|
||||||
ulong table; /* Table pointer from previous loader */
|
ulong table; /* Table pointer from previous loader */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user