Re: [PATCH] Fix left over EFI cache mapping problems

From: Huang, Ying
Date: Thu Feb 14 2008 - 23:48:53 EST


On Thu, 2008-02-14 at 17:12 +0100, Ingo Molnar wrote:
> this is indeed a bug (we change the attributes for a larger area than
> needed), but your fix is unclean. Find below a cleaner solution.
>
> Ying, if you agree with this fix could you please test and ACK it before
> we push it to Linus? (this fix is also in the latest x86.git#mm)

I think the patch following may be better, because it is possible that
the EFI_PAGE_SHIFT and PAGE_SHIFT are different.

Best Regards,
Huang Ying

------------------------->
The EFI-runtime mapping code changed a larger memory area than it
should have, due to a pages/bytes parameter mixup.

noticed by Andi Kleen.

This patch has been tested on Intel x86 platform with EFI 32/64.

Signed-off-by: Huang Ying <ying.huang@xxxxxxxxx>

---
arch/x86/kernel/efi.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)

--- a/arch/x86/kernel/efi.c
+++ b/arch/x86/kernel/efi.c
@@ -386,12 +386,13 @@ static void __init runtime_code_page_mke

/* Make EFI runtime service code area executable */
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
- md = p;
+ unsigned long num_pages;

+ md = p;
if (md->type != EFI_RUNTIME_SERVICES_CODE)
continue;
-
- set_memory_x(md->virt_addr, md->num_pages << EFI_PAGE_SHIFT);
+ num_pages = (md->num_pages << EFI_PAGE_SHIFT) >> PAGE_SHIFT;
+ set_memory_x(md->virt_addr, num_pages);
}
}

@@ -434,7 +435,7 @@ void __init efi_enter_virtual_mode(void)
}

if (!(md->attribute & EFI_MEMORY_WB))
- set_memory_uc(md->virt_addr, size);
+ set_memory_uc(md->virt_addr, size >> PAGE_SHIFT);

systab = (u64) (unsigned long) efi_phys.systab;
if (md->phys_addr <= systab && systab < end) {

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/