|
@@ -39,43 +39,14 @@
|
|
*/
|
|
*/
|
|
|
|
|
|
static unsigned long efi_rt_eflags;
|
|
static unsigned long efi_rt_eflags;
|
|
-static pgd_t efi_bak_pg_dir_pointer[2];
|
|
|
|
|
|
|
|
void efi_call_phys_prelog(void)
|
|
void efi_call_phys_prelog(void)
|
|
{
|
|
{
|
|
- unsigned long cr4;
|
|
|
|
- unsigned long temp;
|
|
|
|
struct desc_ptr gdt_descr;
|
|
struct desc_ptr gdt_descr;
|
|
|
|
|
|
local_irq_save(efi_rt_eflags);
|
|
local_irq_save(efi_rt_eflags);
|
|
|
|
|
|
- /*
|
|
|
|
- * If I don't have PAE, I should just duplicate two entries in page
|
|
|
|
- * directory. If I have PAE, I just need to duplicate one entry in
|
|
|
|
- * page directory.
|
|
|
|
- */
|
|
|
|
- cr4 = read_cr4_safe();
|
|
|
|
-
|
|
|
|
- if (cr4 & X86_CR4_PAE) {
|
|
|
|
- efi_bak_pg_dir_pointer[0].pgd =
|
|
|
|
- swapper_pg_dir[pgd_index(0)].pgd;
|
|
|
|
- swapper_pg_dir[0].pgd =
|
|
|
|
- swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
|
|
|
|
- } else {
|
|
|
|
- efi_bak_pg_dir_pointer[0].pgd =
|
|
|
|
- swapper_pg_dir[pgd_index(0)].pgd;
|
|
|
|
- efi_bak_pg_dir_pointer[1].pgd =
|
|
|
|
- swapper_pg_dir[pgd_index(0x400000)].pgd;
|
|
|
|
- swapper_pg_dir[pgd_index(0)].pgd =
|
|
|
|
- swapper_pg_dir[pgd_index(PAGE_OFFSET)].pgd;
|
|
|
|
- temp = PAGE_OFFSET + 0x400000;
|
|
|
|
- swapper_pg_dir[pgd_index(0x400000)].pgd =
|
|
|
|
- swapper_pg_dir[pgd_index(temp)].pgd;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * After the lock is released, the original page table is restored.
|
|
|
|
- */
|
|
|
|
|
|
+ load_cr3(initial_page_table);
|
|
__flush_tlb_all();
|
|
__flush_tlb_all();
|
|
|
|
|
|
gdt_descr.address = __pa(get_cpu_gdt_table(0));
|
|
gdt_descr.address = __pa(get_cpu_gdt_table(0));
|
|
@@ -85,28 +56,13 @@ void efi_call_phys_prelog(void)
|
|
|
|
|
|
void efi_call_phys_epilog(void)
|
|
void efi_call_phys_epilog(void)
|
|
{
|
|
{
|
|
- unsigned long cr4;
|
|
|
|
struct desc_ptr gdt_descr;
|
|
struct desc_ptr gdt_descr;
|
|
|
|
|
|
gdt_descr.address = (unsigned long)get_cpu_gdt_table(0);
|
|
gdt_descr.address = (unsigned long)get_cpu_gdt_table(0);
|
|
gdt_descr.size = GDT_SIZE - 1;
|
|
gdt_descr.size = GDT_SIZE - 1;
|
|
load_gdt(&gdt_descr);
|
|
load_gdt(&gdt_descr);
|
|
|
|
|
|
- cr4 = read_cr4_safe();
|
|
|
|
-
|
|
|
|
- if (cr4 & X86_CR4_PAE) {
|
|
|
|
- swapper_pg_dir[pgd_index(0)].pgd =
|
|
|
|
- efi_bak_pg_dir_pointer[0].pgd;
|
|
|
|
- } else {
|
|
|
|
- swapper_pg_dir[pgd_index(0)].pgd =
|
|
|
|
- efi_bak_pg_dir_pointer[0].pgd;
|
|
|
|
- swapper_pg_dir[pgd_index(0x400000)].pgd =
|
|
|
|
- efi_bak_pg_dir_pointer[1].pgd;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * After the lock is released, the original page table is restored.
|
|
|
|
- */
|
|
|
|
|
|
+ load_cr3(swapper_pg_dir);
|
|
__flush_tlb_all();
|
|
__flush_tlb_all();
|
|
|
|
|
|
local_irq_restore(efi_rt_eflags);
|
|
local_irq_restore(efi_rt_eflags);
|