Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 90968
b: refs/heads/master
c: 4a3575f
h: refs/heads/master
v: v3
  • Loading branch information
Huang, Ying authored and Ingo Molnar committed Apr 19, 2008
1 parent 1a67323 commit 943b51a
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f8dfd5ed149ae340451f25847b434297c20d4645
refs/heads/master: 4a3575fd436aa98957184afd745e4ada8f1542d8
18 changes: 13 additions & 5 deletions trunk/arch/x86/kernel/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -383,6 +383,7 @@ static void __init runtime_code_page_mkexec(void)
{
efi_memory_desc_t *md;
void *p;
u64 addr, npages;

/* Make EFI runtime service code area executable */
for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
Expand All @@ -391,7 +392,10 @@ static void __init runtime_code_page_mkexec(void)
if (md->type != EFI_RUNTIME_SERVICES_CODE)
continue;

set_memory_x(md->virt_addr, md->num_pages);
addr = md->virt_addr;
npages = md->num_pages;
memrange_efi_to_native(&addr, &npages);
set_memory_x(addr, npages);
}
}

Expand All @@ -408,7 +412,7 @@ void __init efi_enter_virtual_mode(void)
efi_memory_desc_t *md;
efi_status_t status;
unsigned long size;
u64 end, systab;
u64 end, systab, addr, npages;
void *p, *va;

efi.systab = NULL;
Expand All @@ -420,7 +424,7 @@ void __init efi_enter_virtual_mode(void)
size = md->num_pages << EFI_PAGE_SHIFT;
end = md->phys_addr + size;

if ((end >> PAGE_SHIFT) <= max_pfn_mapped)
if (PFN_UP(end) <= max_pfn_mapped)
va = __va(md->phys_addr);
else
va = efi_ioremap(md->phys_addr, size);
Expand All @@ -433,8 +437,12 @@ void __init efi_enter_virtual_mode(void)
continue;
}

if (!(md->attribute & EFI_MEMORY_WB))
set_memory_uc(md->virt_addr, md->num_pages);
if (!(md->attribute & EFI_MEMORY_WB)) {
addr = md->virt_addr;
npages = md->num_pages;
memrange_efi_to_native(&addr, &npages);
set_memory_uc(addr, npages);
}

systab = (u64) (unsigned long) efi_phys.systab;
if (md->phys_addr <= systab && systab < end) {
Expand Down
12 changes: 6 additions & 6 deletions trunk/arch/x86/kernel/efi_64.c
Original file line number Diff line number Diff line change
Expand Up @@ -105,14 +105,14 @@ void __init efi_reserve_bootmem(void)

void __iomem * __init efi_ioremap(unsigned long phys_addr, unsigned long size)
{
static unsigned pages_mapped;
static unsigned pages_mapped __initdata;
unsigned i, pages;
unsigned long offset;

/* phys_addr and size must be page aligned */
if ((phys_addr & ~PAGE_MASK) || (size & ~PAGE_MASK))
return NULL;
pages = PFN_UP(phys_addr + size) - PFN_DOWN(phys_addr);
offset = phys_addr & ~PAGE_MASK;
phys_addr &= PAGE_MASK;

pages = size >> PAGE_SHIFT;
if (pages_mapped + pages > MAX_EFI_IO_PAGES)
return NULL;

Expand All @@ -124,5 +124,5 @@ void __iomem * __init efi_ioremap(unsigned long phys_addr, unsigned long size)
}

return (void __iomem *)__fix_to_virt(FIX_EFI_IO_MAP_FIRST_PAGE - \
(pages_mapped - pages));
(pages_mapped - pages)) + offset;
}
7 changes: 7 additions & 0 deletions trunk/include/linux/efi.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <linux/proc_fs.h>
#include <linux/rtc.h>
#include <linux/ioport.h>
#include <linux/pfn.h>

#include <asm/page.h>
#include <asm/system.h>
Expand Down Expand Up @@ -394,4 +395,10 @@ struct efi_generic_dev_path {
u16 length;
} __attribute ((packed));

static inline void memrange_efi_to_native(u64 *addr, u64 *npages)
{
*npages = PFN_UP(*addr + (*npages<<EFI_PAGE_SHIFT)) - PFN_DOWN(*addr);
*addr &= PAGE_MASK;
}

#endif /* _LINUX_EFI_H */

0 comments on commit 943b51a

Please sign in to comment.