Takao Indoh <indou.takao at jp.fujitsu.com> writes: > On Tue, 14 Dec 2010 12:43:58 +0900, Kenji Kaneshige wrote: > >>Hi, >> >>I tested this patch on the system that has large amount of memory (1TB), >>and I encountered the immediate system reset problem that happens every >>time I modify the EFI boot entry using efibootmgr command. It seems that >>triple fault happens due to the incorrect page table setup. >> >>> +void __init efi_pagetable_init(void) >>> +{ >>(snip.) >>> + pgd = efi_pgd + pgd_index(PAGE_OFFSET); >>> + set_pgd(pgd, *pgd_offset_k(PAGE_OFFSET)); >>> + pgd = efi_pgd + pgd_index(__START_KERNEL_map); >>> + set_pgd(pgd, *pgd_offset_k(__START_KERNEL_map)); >>> +} >> >>Maybe we need to map whole kernel address space. The problem doesn't >>happen by modifying as follows. >> >> clone_pgd_range(efi_pgd + KERNEL_PGD_BOUNDARY, >> swapper_pg_dir + KERNEL_PGD_BOUNDARY, >>KERNEL_PGD_PTRS); > > > Besides this bug, I'm thinking that we need global TLB flush after > restoring cr3 because EFI code page is mapped with PAGE_KERNEL_EXEC. > > void efi_call_phys_epilog_in_physmode(void) > { > write_cr3(get_cpu_var(save_cr3)); > + if (cpu_has_pge) > + __flush_tlb_global(); > local_irq_restore(get_cpu_var(efi_flags)); > } > > Somethinkg like this. Anybody comments? If only one cpu runs efi we shouldn't need a global flush. I presume you aren't modifying the kernel's global page table? If we are giving the entire machine to efi then yes we would need to set cr3 on all machines. Eric