x86: ia32: load GDT in virtual memory after loading page table
This reverts commit d40e8ede8e
.
This fixes triple faults after wiping the identity mapping of
physical memory when running entering userspace.
Signed-off-by: Daniel Leung <daniel.leung@intel.com>
This commit is contained in:
parent
348d1315d2
commit
9109fbb1a2
2 changed files with 10 additions and 27 deletions
|
@ -213,9 +213,15 @@ __csSet:
|
|||
call z_data_copy
|
||||
#endif
|
||||
|
||||
/* Note that installing page tables must be done after
|
||||
* z_data_copy() as the page tables are being copied into
|
||||
* RAM there.
|
||||
*/
|
||||
install_page_tables
|
||||
|
||||
#ifdef CONFIG_GDT_DYNAMIC
|
||||
/* activate RAM-based Global Descriptor Table (GDT) */
|
||||
lgdt %ds:Z_MEM_PHYS_ADDR(_gdt)
|
||||
lgdt %ds:_gdt
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_X86_ENABLE_TSS)
|
||||
|
@ -223,12 +229,6 @@ __csSet:
|
|||
ltr %ax
|
||||
#endif
|
||||
|
||||
/* Note that installing page tables must be done after
|
||||
* z_data_copy() as the page tables are being copied into
|
||||
* RAM there.
|
||||
*/
|
||||
install_page_tables
|
||||
|
||||
/* Clear BSS */
|
||||
call z_bss_zero
|
||||
|
||||
|
|
|
@ -197,24 +197,7 @@ def main():
|
|||
# x86_64 does not use descriptor for thread local storage
|
||||
num_entries += 1
|
||||
|
||||
if "CONFIG_X86_MMU" in syms:
|
||||
vm_base = syms["CONFIG_KERNEL_VM_BASE"]
|
||||
vm_offset = syms["CONFIG_KERNEL_VM_OFFSET"]
|
||||
|
||||
sram_base = syms["CONFIG_SRAM_BASE_ADDRESS"]
|
||||
|
||||
if "CONFIG_SRAM_OFFSET" in syms:
|
||||
sram_offset = syms["CONFIG_SRAM_OFFSET"]
|
||||
else:
|
||||
sram_offset = 0
|
||||
|
||||
# Figure out if there is any need to do virtual-to-physical
|
||||
# address translation
|
||||
virt_to_phys_offset = (sram_base + sram_offset) - (vm_base + vm_offset)
|
||||
else:
|
||||
virt_to_phys_offset = 0
|
||||
|
||||
gdt_base = syms["_gdt"] + virt_to_phys_offset
|
||||
gdt_base = syms["_gdt"]
|
||||
|
||||
with open(args.output_gdt, "wb") as output_fp:
|
||||
# The pseudo descriptor is stuffed into the NULL descriptor
|
||||
|
@ -230,8 +213,8 @@ def main():
|
|||
FLAGS_GRAN, ACCESS_RW))
|
||||
|
||||
if num_entries >= 5:
|
||||
main_tss = syms["_main_tss"] + virt_to_phys_offset
|
||||
df_tss = syms["_df_tss"] + virt_to_phys_offset
|
||||
main_tss = syms["_main_tss"]
|
||||
df_tss = syms["_df_tss"]
|
||||
|
||||
# Selector 0x18: main TSS
|
||||
output_fp.write(create_tss_entry(main_tss, 0x67, 0))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue