1 /* 2 * This file contains the routines setting up the linux page tables. 3 * -- paulus 4 * 5 * Derived from arch/ppc/mm/init.c: 6 * Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org) 7 * 8 * Modifications by Paul Mackerras (PowerMac) (paulus@cs.anu.edu.au) 9 * and Cort Dougan (PReP) (cort@cs.nmt.edu) 10 * Copyright (C) 1996 Paul Mackerras 11 * 12 * Derived from "arch/i386/mm/init.c" 13 * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds 14 * 15 * This program is free software; you can redistribute it and/or 16 * modify it under the terms of the GNU General Public License 17 * as published by the Free Software Foundation; either version 18 * 2 of the License, or (at your option) any later version. 19 * 20 */ 21 22 #include <linux/kernel.h> 23 #include <linux/module.h> 24 #include <linux/types.h> 25 #include <linux/mm.h> 26 #include <linux/vmalloc.h> 27 #include <linux/init.h> 28 #include <linux/highmem.h> 29 #include <linux/memblock.h> 30 #include <linux/slab.h> 31 32 #include <asm/pgtable.h> 33 #include <asm/pgalloc.h> 34 #include <asm/fixmap.h> 35 #include <asm/io.h> 36 #include <asm/setup.h> 37 #include <asm/sections.h> 38 39 #include "mmu_decl.h" 40 41 unsigned long ioremap_bot; 42 EXPORT_SYMBOL(ioremap_bot); /* aka VMALLOC_END */ 43 44 extern char etext[], _stext[], _sinittext[], _einittext[]; 45 46 __ref pte_t *pte_alloc_one_kernel(struct mm_struct *mm) 47 { 48 if (!slab_is_available()) 49 return memblock_alloc(PTE_FRAG_SIZE, PTE_FRAG_SIZE); 50 51 return (pte_t *)pte_fragment_alloc(mm, 1); 52 } 53 54 pgtable_t pte_alloc_one(struct mm_struct *mm) 55 { 56 return (pgtable_t)pte_fragment_alloc(mm, 0); 57 } 58 59 void __iomem * 60 ioremap(phys_addr_t addr, unsigned long size) 61 { 62 pgprot_t prot = pgprot_noncached(PAGE_KERNEL); 63 64 return __ioremap_caller(addr, size, prot, __builtin_return_address(0)); 65 } 66 EXPORT_SYMBOL(ioremap); 67 68 void __iomem * 69 ioremap_wc(phys_addr_t addr, unsigned long size) 70 { 71 pgprot_t prot = pgprot_noncached_wc(PAGE_KERNEL); 72 73 return __ioremap_caller(addr, size, prot, __builtin_return_address(0)); 74 } 75 EXPORT_SYMBOL(ioremap_wc); 76 77 void __iomem * 78 ioremap_wt(phys_addr_t addr, unsigned long size) 79 { 80 pgprot_t prot = pgprot_cached_wthru(PAGE_KERNEL); 81 82 return __ioremap_caller(addr, size, prot, __builtin_return_address(0)); 83 } 84 EXPORT_SYMBOL(ioremap_wt); 85 86 void __iomem * 87 ioremap_coherent(phys_addr_t addr, unsigned long size) 88 { 89 pgprot_t prot = pgprot_cached(PAGE_KERNEL); 90 91 return __ioremap_caller(addr, size, prot, __builtin_return_address(0)); 92 } 93 EXPORT_SYMBOL(ioremap_coherent); 94 95 void __iomem * 96 ioremap_prot(phys_addr_t addr, unsigned long size, unsigned long flags) 97 { 98 pte_t pte = __pte(flags); 99 100 /* writeable implies dirty for kernel addresses */ 101 if (pte_write(pte)) 102 pte = pte_mkdirty(pte); 103 104 /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */ 105 pte = pte_exprotect(pte); 106 pte = pte_mkprivileged(pte); 107 108 return __ioremap_caller(addr, size, pte_pgprot(pte), __builtin_return_address(0)); 109 } 110 EXPORT_SYMBOL(ioremap_prot); 111 112 void __iomem * 113 __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) 114 { 115 return __ioremap_caller(addr, size, __pgprot(flags), __builtin_return_address(0)); 116 } 117 118 void __iomem * 119 __ioremap_caller(phys_addr_t addr, unsigned long size, pgprot_t prot, void *caller) 120 { 121 unsigned long v, i; 122 phys_addr_t p; 123 int err; 124 125 /* 126 * Choose an address to map it to. 127 * Once the vmalloc system is running, we use it. 128 * Before then, we use space going down from IOREMAP_TOP 129 * (ioremap_bot records where we're up to). 130 */ 131 p = addr & PAGE_MASK; 132 size = PAGE_ALIGN(addr + size) - p; 133 134 /* 135 * If the address lies within the first 16 MB, assume it's in ISA 136 * memory space 137 */ 138 if (p < 16*1024*1024) 139 p += _ISA_MEM_BASE; 140 141 #ifndef CONFIG_CRASH_DUMP 142 /* 143 * Don't allow anybody to remap normal RAM that we're using. 144 * mem_init() sets high_memory so only do the check after that. 145 */ 146 if (slab_is_available() && p <= virt_to_phys(high_memory - 1) && 147 page_is_ram(__phys_to_pfn(p))) { 148 printk("__ioremap(): phys addr 0x%llx is RAM lr %ps\n", 149 (unsigned long long)p, __builtin_return_address(0)); 150 return NULL; 151 } 152 #endif 153 154 if (size == 0) 155 return NULL; 156 157 /* 158 * Is it already mapped? Perhaps overlapped by a previous 159 * mapping. 160 */ 161 v = p_block_mapped(p); 162 if (v) 163 goto out; 164 165 if (slab_is_available()) { 166 struct vm_struct *area; 167 area = get_vm_area_caller(size, VM_IOREMAP, caller); 168 if (area == 0) 169 return NULL; 170 area->phys_addr = p; 171 v = (unsigned long) area->addr; 172 } else { 173 v = (ioremap_bot -= size); 174 } 175 176 /* 177 * Should check if it is a candidate for a BAT mapping 178 */ 179 180 err = 0; 181 for (i = 0; i < size && err == 0; i += PAGE_SIZE) 182 err = map_kernel_page(v + i, p + i, prot); 183 if (err) { 184 if (slab_is_available()) 185 vunmap((void *)v); 186 return NULL; 187 } 188 189 out: 190 return (void __iomem *) (v + ((unsigned long)addr & ~PAGE_MASK)); 191 } 192 EXPORT_SYMBOL(__ioremap); 193 194 void iounmap(volatile void __iomem *addr) 195 { 196 /* 197 * If mapped by BATs then there is nothing to do. 198 * Calling vfree() generates a benign warning. 199 */ 200 if (v_block_mapped((unsigned long)addr)) 201 return; 202 203 if (addr > high_memory && (unsigned long) addr < ioremap_bot) 204 vunmap((void *) (PAGE_MASK & (unsigned long)addr)); 205 } 206 EXPORT_SYMBOL(iounmap); 207 208 int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot) 209 { 210 pmd_t *pd; 211 pte_t *pg; 212 int err = -ENOMEM; 213 214 /* Use upper 10 bits of VA to index the first level map */ 215 pd = pmd_offset(pud_offset(pgd_offset_k(va), va), va); 216 /* Use middle 10 bits of VA to index the second-level map */ 217 pg = pte_alloc_kernel(pd, va); 218 if (pg != 0) { 219 err = 0; 220 /* The PTE should never be already set nor present in the 221 * hash table 222 */ 223 BUG_ON((pte_present(*pg) | pte_hashpte(*pg)) && pgprot_val(prot)); 224 set_pte_at(&init_mm, va, pg, pfn_pte(pa >> PAGE_SHIFT, prot)); 225 } 226 smp_wmb(); 227 return err; 228 } 229 230 /* 231 * Map in a chunk of physical memory starting at start. 232 */ 233 static void __init __mapin_ram_chunk(unsigned long offset, unsigned long top) 234 { 235 unsigned long v, s; 236 phys_addr_t p; 237 int ktext; 238 239 s = offset; 240 v = PAGE_OFFSET + s; 241 p = memstart_addr + s; 242 for (; s < top; s += PAGE_SIZE) { 243 ktext = ((char *)v >= _stext && (char *)v < etext) || 244 ((char *)v >= _sinittext && (char *)v < _einittext); 245 map_kernel_page(v, p, ktext ? PAGE_KERNEL_TEXT : PAGE_KERNEL); 246 #ifdef CONFIG_PPC_BOOK3S_32 247 if (ktext) 248 hash_preload(&init_mm, v, false, 0x300); 249 #endif 250 v += PAGE_SIZE; 251 p += PAGE_SIZE; 252 } 253 } 254 255 void __init mapin_ram(void) 256 { 257 unsigned long s, top; 258 259 #ifndef CONFIG_WII 260 top = total_lowmem; 261 s = mmu_mapin_ram(top); 262 __mapin_ram_chunk(s, top); 263 #else 264 if (!wii_hole_size) { 265 s = mmu_mapin_ram(total_lowmem); 266 __mapin_ram_chunk(s, total_lowmem); 267 } else { 268 top = wii_hole_start; 269 s = mmu_mapin_ram(top); 270 __mapin_ram_chunk(s, top); 271 272 top = memblock_end_of_DRAM(); 273 s = wii_mmu_mapin_mem2(top); 274 __mapin_ram_chunk(s, top); 275 } 276 #endif 277 } 278 279 /* Scan the real Linux page tables and return a PTE pointer for 280 * a virtual address in a context. 281 * Returns true (1) if PTE was found, zero otherwise. The pointer to 282 * the PTE pointer is unmodified if PTE is not found. 283 */ 284 static int 285 get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep, pmd_t **pmdp) 286 { 287 pgd_t *pgd; 288 pud_t *pud; 289 pmd_t *pmd; 290 pte_t *pte; 291 int retval = 0; 292 293 pgd = pgd_offset(mm, addr & PAGE_MASK); 294 if (pgd) { 295 pud = pud_offset(pgd, addr & PAGE_MASK); 296 if (pud && pud_present(*pud)) { 297 pmd = pmd_offset(pud, addr & PAGE_MASK); 298 if (pmd_present(*pmd)) { 299 pte = pte_offset_map(pmd, addr & PAGE_MASK); 300 if (pte) { 301 retval = 1; 302 *ptep = pte; 303 if (pmdp) 304 *pmdp = pmd; 305 /* XXX caller needs to do pte_unmap, yuck */ 306 } 307 } 308 } 309 } 310 return(retval); 311 } 312 313 static int __change_page_attr_noflush(struct page *page, pgprot_t prot) 314 { 315 pte_t *kpte; 316 pmd_t *kpmd; 317 unsigned long address; 318 319 BUG_ON(PageHighMem(page)); 320 address = (unsigned long)page_address(page); 321 322 if (v_block_mapped(address)) 323 return 0; 324 if (!get_pteptr(&init_mm, address, &kpte, &kpmd)) 325 return -EINVAL; 326 __set_pte_at(&init_mm, address, kpte, mk_pte(page, prot), 0); 327 pte_unmap(kpte); 328 329 return 0; 330 } 331 332 /* 333 * Change the page attributes of an page in the linear mapping. 334 * 335 * THIS DOES NOTHING WITH BAT MAPPINGS, DEBUG USE ONLY 336 */ 337 static int change_page_attr(struct page *page, int numpages, pgprot_t prot) 338 { 339 int i, err = 0; 340 unsigned long flags; 341 struct page *start = page; 342 343 local_irq_save(flags); 344 for (i = 0; i < numpages; i++, page++) { 345 err = __change_page_attr_noflush(page, prot); 346 if (err) 347 break; 348 } 349 wmb(); 350 local_irq_restore(flags); 351 flush_tlb_kernel_range((unsigned long)page_address(start), 352 (unsigned long)page_address(page)); 353 return err; 354 } 355 356 void mark_initmem_nx(void) 357 { 358 struct page *page = virt_to_page(_sinittext); 359 unsigned long numpages = PFN_UP((unsigned long)_einittext) - 360 PFN_DOWN((unsigned long)_sinittext); 361 362 change_page_attr(page, numpages, PAGE_KERNEL); 363 } 364 365 #ifdef CONFIG_STRICT_KERNEL_RWX 366 void mark_rodata_ro(void) 367 { 368 struct page *page; 369 unsigned long numpages; 370 371 page = virt_to_page(_stext); 372 numpages = PFN_UP((unsigned long)_etext) - 373 PFN_DOWN((unsigned long)_stext); 374 375 change_page_attr(page, numpages, PAGE_KERNEL_ROX); 376 /* 377 * mark .rodata as read only. Use __init_begin rather than __end_rodata 378 * to cover NOTES and EXCEPTION_TABLE. 379 */ 380 page = virt_to_page(__start_rodata); 381 numpages = PFN_UP((unsigned long)__init_begin) - 382 PFN_DOWN((unsigned long)__start_rodata); 383 384 change_page_attr(page, numpages, PAGE_KERNEL_RO); 385 } 386 #endif 387 388 #ifdef CONFIG_DEBUG_PAGEALLOC 389 void __kernel_map_pages(struct page *page, int numpages, int enable) 390 { 391 if (PageHighMem(page)) 392 return; 393 394 change_page_attr(page, numpages, enable ? PAGE_KERNEL : __pgprot(0)); 395 } 396 #endif /* CONFIG_DEBUG_PAGEALLOC */ 397