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 struct memblock_region *reg; 258 259 for_each_memblock(memory, reg) { 260 phys_addr_t base = reg->base; 261 phys_addr_t top = min(base + reg->size, total_lowmem); 262 263 if (base >= top) 264 continue; 265 base = mmu_mapin_ram(base, top); 266 if (IS_ENABLED(CONFIG_BDI_SWITCH)) 267 __mapin_ram_chunk(reg->base, top); 268 else 269 __mapin_ram_chunk(base, top); 270 } 271 } 272 273 /* Scan the real Linux page tables and return a PTE pointer for 274 * a virtual address in a context. 275 * Returns true (1) if PTE was found, zero otherwise. The pointer to 276 * the PTE pointer is unmodified if PTE is not found. 277 */ 278 static int 279 get_pteptr(struct mm_struct *mm, unsigned long addr, pte_t **ptep, pmd_t **pmdp) 280 { 281 pgd_t *pgd; 282 pud_t *pud; 283 pmd_t *pmd; 284 pte_t *pte; 285 int retval = 0; 286 287 pgd = pgd_offset(mm, addr & PAGE_MASK); 288 if (pgd) { 289 pud = pud_offset(pgd, addr & PAGE_MASK); 290 if (pud && pud_present(*pud)) { 291 pmd = pmd_offset(pud, addr & PAGE_MASK); 292 if (pmd_present(*pmd)) { 293 pte = pte_offset_map(pmd, addr & PAGE_MASK); 294 if (pte) { 295 retval = 1; 296 *ptep = pte; 297 if (pmdp) 298 *pmdp = pmd; 299 /* XXX caller needs to do pte_unmap, yuck */ 300 } 301 } 302 } 303 } 304 return(retval); 305 } 306 307 static int __change_page_attr_noflush(struct page *page, pgprot_t prot) 308 { 309 pte_t *kpte; 310 pmd_t *kpmd; 311 unsigned long address; 312 313 BUG_ON(PageHighMem(page)); 314 address = (unsigned long)page_address(page); 315 316 if (v_block_mapped(address)) 317 return 0; 318 if (!get_pteptr(&init_mm, address, &kpte, &kpmd)) 319 return -EINVAL; 320 __set_pte_at(&init_mm, address, kpte, mk_pte(page, prot), 0); 321 pte_unmap(kpte); 322 323 return 0; 324 } 325 326 /* 327 * Change the page attributes of an page in the linear mapping. 328 * 329 * THIS DOES NOTHING WITH BAT MAPPINGS, DEBUG USE ONLY 330 */ 331 static int change_page_attr(struct page *page, int numpages, pgprot_t prot) 332 { 333 int i, err = 0; 334 unsigned long flags; 335 struct page *start = page; 336 337 local_irq_save(flags); 338 for (i = 0; i < numpages; i++, page++) { 339 err = __change_page_attr_noflush(page, prot); 340 if (err) 341 break; 342 } 343 wmb(); 344 local_irq_restore(flags); 345 flush_tlb_kernel_range((unsigned long)page_address(start), 346 (unsigned long)page_address(page)); 347 return err; 348 } 349 350 void mark_initmem_nx(void) 351 { 352 struct page *page = virt_to_page(_sinittext); 353 unsigned long numpages = PFN_UP((unsigned long)_einittext) - 354 PFN_DOWN((unsigned long)_sinittext); 355 356 if (v_block_mapped((unsigned long)_stext) + 1) 357 mmu_mark_initmem_nx(); 358 else 359 change_page_attr(page, numpages, PAGE_KERNEL); 360 } 361 362 #ifdef CONFIG_STRICT_KERNEL_RWX 363 void mark_rodata_ro(void) 364 { 365 struct page *page; 366 unsigned long numpages; 367 368 if (v_block_mapped((unsigned long)_sinittext)) { 369 mmu_mark_rodata_ro(); 370 return; 371 } 372 373 page = virt_to_page(_stext); 374 numpages = PFN_UP((unsigned long)_etext) - 375 PFN_DOWN((unsigned long)_stext); 376 377 change_page_attr(page, numpages, PAGE_KERNEL_ROX); 378 /* 379 * mark .rodata as read only. Use __init_begin rather than __end_rodata 380 * to cover NOTES and EXCEPTION_TABLE. 381 */ 382 page = virt_to_page(__start_rodata); 383 numpages = PFN_UP((unsigned long)__init_begin) - 384 PFN_DOWN((unsigned long)__start_rodata); 385 386 change_page_attr(page, numpages, PAGE_KERNEL_RO); 387 } 388 #endif 389 390 #ifdef CONFIG_DEBUG_PAGEALLOC 391 void __kernel_map_pages(struct page *page, int numpages, int enable) 392 { 393 if (PageHighMem(page)) 394 return; 395 396 change_page_attr(page, numpages, enable ? PAGE_KERNEL : __pgprot(0)); 397 } 398 #endif /* CONFIG_DEBUG_PAGEALLOC */ 399