mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-26 00:51:33 +00:00
x86: Add GDT descriptors for option ROMs
Option ROMs require a few additional descriptors. Add these, and remove the enum since we now have to access several descriptors from assembler. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
176bf4ce0c
commit
e34aef1de3
2 changed files with 17 additions and 21 deletions
|
@ -124,7 +124,7 @@ static void load_gdt(const u64 *boot_gdt, u16 num_entries)
|
||||||
{
|
{
|
||||||
struct gdt_ptr gdt;
|
struct gdt_ptr gdt;
|
||||||
|
|
||||||
gdt.len = (num_entries * 8) - 1;
|
gdt.len = (num_entries * X86_GDT_ENTRY_SIZE) - 1;
|
||||||
gdt.ptr = (u32)boot_gdt;
|
gdt.ptr = (u32)boot_gdt;
|
||||||
|
|
||||||
asm volatile("lgdtl %0\n" : : "m" (gdt));
|
asm volatile("lgdtl %0\n" : : "m" (gdt));
|
||||||
|
@ -144,10 +144,13 @@ void setup_gdt(gd_t *id, u64 *gdt_addr)
|
||||||
(ulong)&id->arch.gd_addr, 0xfffff);
|
(ulong)&id->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(0x109b, 0, 0x0ffff);
|
gdt_addr[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x009b, 0, 0x0ffff);
|
||||||
|
|
||||||
/* 16-bit DS: data, read/write, 64 kB, base 0 */
|
/* 16-bit DS: data, read/write, 64 kB, base 0 */
|
||||||
gdt_addr[X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff);
|
gdt_addr[X86_GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x0093, 0, 0x0ffff);
|
||||||
|
|
||||||
|
gdt_addr[X86_GDT_ENTRY_16BIT_FLAT_CS] = GDT_ENTRY(0x809b, 0, 0xfffff);
|
||||||
|
gdt_addr[X86_GDT_ENTRY_16BIT_FLAT_DS] = GDT_ENTRY(0x8093, 0, 0xfffff);
|
||||||
|
|
||||||
load_gdt(gdt_addr, X86_GDT_NUM_ENTRIES);
|
load_gdt(gdt_addr, X86_GDT_NUM_ENTRIES);
|
||||||
load_ds(X86_GDT_ENTRY_32BIT_DS);
|
load_ds(X86_GDT_ENTRY_32BIT_DS);
|
||||||
|
|
|
@ -10,23 +10,16 @@
|
||||||
|
|
||||||
#define X86_GDT_ENTRY_SIZE 8
|
#define X86_GDT_ENTRY_SIZE 8
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#define X86_GDT_ENTRY_NULL 0
|
||||||
|
#define X86_GDT_ENTRY_UNUSED 1
|
||||||
enum {
|
#define X86_GDT_ENTRY_32BIT_CS 2
|
||||||
X86_GDT_ENTRY_NULL = 0,
|
|
||||||
X86_GDT_ENTRY_UNUSED,
|
|
||||||
X86_GDT_ENTRY_32BIT_CS,
|
|
||||||
X86_GDT_ENTRY_32BIT_DS,
|
|
||||||
X86_GDT_ENTRY_32BIT_FS,
|
|
||||||
X86_GDT_ENTRY_16BIT_CS,
|
|
||||||
X86_GDT_ENTRY_16BIT_DS,
|
|
||||||
X86_GDT_NUM_ENTRIES
|
|
||||||
};
|
|
||||||
#else
|
|
||||||
/* NOTE: If the above enum is modified, this define must be checked */
|
|
||||||
#define X86_GDT_ENTRY_32BIT_DS 3
|
#define X86_GDT_ENTRY_32BIT_DS 3
|
||||||
#define X86_GDT_NUM_ENTRIES 7
|
#define X86_GDT_ENTRY_32BIT_FS 4
|
||||||
#endif
|
#define X86_GDT_ENTRY_16BIT_CS 5
|
||||||
|
#define X86_GDT_ENTRY_16BIT_DS 6
|
||||||
|
#define X86_GDT_ENTRY_16BIT_FLAT_CS 7
|
||||||
|
#define X86_GDT_ENTRY_16BIT_FLAT_DS 8
|
||||||
|
#define X86_GDT_NUM_ENTRIES 9
|
||||||
|
|
||||||
#define X86_GDT_SIZE (X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE)
|
#define X86_GDT_SIZE (X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue