x86: fix EFI mapping

The patch updates EFI runtime memory mapping code, by making EFI
areas explicitly executable.

Signed-off-by: Huang Ying <ying.huang@intel.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
Huang, Ying
2008-02-04 16:48:06 +01:00
committed by Ingo Molnar
parent f56d005d30
commit 1c083eb2cb
3 changed files with 43 additions and 40 deletions

View File

@@ -54,10 +54,10 @@ static void __init early_mapping_set_exec(unsigned long start,
else
set_pte(kpte, __pte((pte_val(*kpte) | _PAGE_NX) & \
__supported_pte_mask));
if (level == 4)
start = (start + PMD_SIZE) & PMD_MASK;
else
if (level == PG_LEVEL_4K)
start = (start + PAGE_SIZE) & PAGE_MASK;
else
start = (start + PMD_SIZE) & PMD_MASK;
}
}
@@ -109,23 +109,23 @@ void __init efi_reserve_bootmem(void)
memmap.nr_map * memmap.desc_size);
}
void __iomem * __init efi_ioremap(unsigned long offset,
unsigned long size)
void __iomem * __init efi_ioremap(unsigned long phys_addr, unsigned long size)
{
static unsigned pages_mapped;
unsigned long last_addr;
unsigned i, pages;
last_addr = offset + size - 1;
offset &= PAGE_MASK;
pages = (PAGE_ALIGN(last_addr) - offset) >> PAGE_SHIFT;
/* phys_addr and size must be page aligned */
if ((phys_addr & ~PAGE_MASK) || (size & ~PAGE_MASK))
return NULL;
pages = size >> PAGE_SHIFT;
if (pages_mapped + pages > MAX_EFI_IO_PAGES)
return NULL;
for (i = 0; i < pages; i++) {
__set_fixmap(FIX_EFI_IO_MAP_FIRST_PAGE - pages_mapped,
offset, PAGE_KERNEL_EXEC_NOCACHE);
offset += PAGE_SIZE;
phys_addr, PAGE_KERNEL);
phys_addr += PAGE_SIZE;
pages_mapped++;
}