mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-29 08:01:08 +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;
|
||||
|
||||
gdt.len = (num_entries * 8) - 1;
|
||||
gdt.len = (num_entries * X86_GDT_ENTRY_SIZE) - 1;
|
||||
gdt.ptr = (u32)boot_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);
|
||||
|
||||
/* 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 */
|
||||
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_ds(X86_GDT_ENTRY_32BIT_DS);
|
||||
|
|
|
@ -8,25 +8,18 @@
|
|||
#ifndef __ASM_PROCESSOR_H_
|
||||
#define __ASM_PROCESSOR_H_ 1
|
||||
|
||||
#define X86_GDT_ENTRY_SIZE 8
|
||||
#define X86_GDT_ENTRY_SIZE 8
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
enum {
|
||||
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_NUM_ENTRIES 7
|
||||
#endif
|
||||
#define X86_GDT_ENTRY_NULL 0
|
||||
#define X86_GDT_ENTRY_UNUSED 1
|
||||
#define X86_GDT_ENTRY_32BIT_CS 2
|
||||
#define X86_GDT_ENTRY_32BIT_DS 3
|
||||
#define X86_GDT_ENTRY_32BIT_FS 4
|
||||
#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)
|
||||
|
||||
|
|
Loading…
Reference in a new issue