diff options
| -rw-r--r-- | arch/x86/mm/ioremap.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 597ac155c91c..bc7527e109c8 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
| @@ -50,6 +50,21 @@ int ioremap_change_attr(unsigned long vaddr, unsigned long size, | |||
| 50 | return err; | 50 | return err; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | static int __ioremap_check_ram(unsigned long start_pfn, unsigned long nr_pages, | ||
| 54 | void *arg) | ||
| 55 | { | ||
| 56 | unsigned long i; | ||
| 57 | |||
| 58 | for (i = 0; i < nr_pages; ++i) | ||
| 59 | if (pfn_valid(start_pfn + i) && | ||
| 60 | !PageReserved(pfn_to_page(start_pfn + i))) | ||
| 61 | return 1; | ||
| 62 | |||
| 63 | WARN_ONCE(1, "ioremap on RAM pfn 0x%lx\n", start_pfn); | ||
| 64 | |||
| 65 | return 0; | ||
| 66 | } | ||
| 67 | |||
| 53 | /* | 68 | /* |
| 54 | * Remap an arbitrary physical address space into the kernel virtual | 69 | * Remap an arbitrary physical address space into the kernel virtual |
| 55 | * address space. Needed when the kernel wants to access high addresses | 70 | * address space. Needed when the kernel wants to access high addresses |
| @@ -93,14 +108,11 @@ static void __iomem *__ioremap_caller(resource_size_t phys_addr, | |||
| 93 | /* | 108 | /* |
| 94 | * Don't allow anybody to remap normal RAM that we're using.. | 109 | * Don't allow anybody to remap normal RAM that we're using.. |
| 95 | */ | 110 | */ |
| 111 | pfn = phys_addr >> PAGE_SHIFT; | ||
| 96 | last_pfn = last_addr >> PAGE_SHIFT; | 112 | last_pfn = last_addr >> PAGE_SHIFT; |
| 97 | for (pfn = phys_addr >> PAGE_SHIFT; pfn <= last_pfn; pfn++) { | 113 | if (walk_system_ram_range(pfn, last_pfn - pfn + 1, NULL, |
| 98 | int is_ram = page_is_ram(pfn); | 114 | __ioremap_check_ram) == 1) |
| 99 | 115 | return NULL; | |
| 100 | if (is_ram && pfn_valid(pfn) && !PageReserved(pfn_to_page(pfn))) | ||
| 101 | return NULL; | ||
| 102 | WARN_ON_ONCE(is_ram); | ||
| 103 | } | ||
| 104 | 116 | ||
| 105 | /* | 117 | /* |
| 106 | * Mappings have to be page-aligned | 118 | * Mappings have to be page-aligned |
