mirror of
https://github.com/u-boot/u-boot.git
synced 2025-05-09 03:21:51 +00:00
x86: fsp: Load GDT before calling FspInitEntry
Currently the FSP execution environment GDT is setup by U-Boot in arch/x86/cpu/start16.S, which works pretty well. But if we try to move the FspInitEntry call a little bit later to better fit into U-Boot's initialization sequence, FSP will fail to bring up the AP due to #GP fault as AP's GDT is duplicated from BSP whose GDT is now moved into CAR, and unfortunately FSP calls AP initialization after it disables the CAR. So basically the BSP's GDT still refers to the one in the CAR, whose content is no longer available, so when AP starts up and loads its segment register, it blows up. To resolve this, we load GDT before calling into FspInitEntry. The GDT is the same one used in arch/x86/cpu/start16.S, which is in the ROM and exists forever. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Andrew Bradford <andrew.bradford@kodakalaris.com> Tested-by: Simon Glass <sjg@chromium.org> Acked-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
343fb99064
commit
002610f620
4 changed files with 33 additions and 2 deletions
|
@ -8,12 +8,19 @@
|
|||
#ifndef _U_BOOT_I386_H_
|
||||
#define _U_BOOT_I386_H_ 1
|
||||
|
||||
extern char gdt_rom[];
|
||||
|
||||
/* cpu/.../cpu.c */
|
||||
int arch_cpu_init(void);
|
||||
int x86_cpu_init_f(void);
|
||||
int cpu_init_f(void);
|
||||
void init_gd(gd_t *id, u64 *gdt_addr);
|
||||
void setup_gdt(gd_t *id, u64 *gdt_addr);
|
||||
/*
|
||||
* Setup FSP execution environment GDT to use the one we used in
|
||||
* arch/x86/cpu/start16.S and reload the segment registers.
|
||||
*/
|
||||
void setup_fsp_gdt(void);
|
||||
int init_cache(void);
|
||||
int cleanup_before_linux(void);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue