57
58static void __init early_runtime_code_mapping_set_exec(int executable)
59{
60 efi_memory_desc_t *md;
61 void *p;
62
63 if (!(__supported_pte_mask & _PAGE_NX))
64 return;
65
66
67 for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
68 md = p;
69 if (md->type == EFI_RUNTIME_SERVICES_CODE) {
70 unsigned long end;
71 end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT);
72 early_mapping_set_exec(md->phys_addr, end, executable);
73 }
74 }
75}
76
77void __init efi_call_phys_prelog(void)
78{
79 unsigned long vaddress;
80
81 early_runtime_code_mapping_set_exec(1);
82 local_irq_save(efi_flags);
83 vaddress = (unsigned long)__va(0x0UL);
84 save_pgd = *pgd_offset_k(0x0UL);
85 set_pgd(pgd_offset_k(0x0UL), *pgd_offset_k(vaddress));
86 __flush_tlb_all();
87}
88
89void __init efi_call_phys_epilog(void)
90{
91
92
93
94 set_pgd(pgd_offset_k(0x0UL), save_pgd);
95 __flush_tlb_all();
96 local_irq_restore(efi_flags);
97 early_runtime_code_mapping_set_exec(0);