init.c (38c87827ffd3c7e1dd61eee9a7dea13d487dc2ed) | init.c (26e7aacb83dfd04330673c5c9ac336560da52bb3) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2012 Regents of the University of California 4 * Copyright (C) 2019 Western Digital Corporation or its affiliates. 5 * Copyright (C) 2020 FORTH-ICS/CARV 6 * Nick Kossifidis <mick@ics.forth.gr> 7 */ 8 --- 6 unchanged lines hidden (view full) --- 15#include <linux/sizes.h> 16#include <linux/of_fdt.h> 17#include <linux/of_reserved_mem.h> 18#include <linux/libfdt.h> 19#include <linux/set_memory.h> 20#include <linux/dma-map-ops.h> 21#include <linux/crash_dump.h> 22#include <linux/hugetlb.h> | 1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Copyright (C) 2012 Regents of the University of California 4 * Copyright (C) 2019 Western Digital Corporation or its affiliates. 5 * Copyright (C) 2020 FORTH-ICS/CARV 6 * Nick Kossifidis <mick@ics.forth.gr> 7 */ 8 --- 6 unchanged lines hidden (view full) --- 15#include <linux/sizes.h> 16#include <linux/of_fdt.h> 17#include <linux/of_reserved_mem.h> 18#include <linux/libfdt.h> 19#include <linux/set_memory.h> 20#include <linux/dma-map-ops.h> 21#include <linux/crash_dump.h> 22#include <linux/hugetlb.h> |
23#ifdef CONFIG_RELOCATABLE 24#include <linux/elf.h> 25#endif |
|
23 24#include <asm/fixmap.h> 25#include <asm/tlbflush.h> 26#include <asm/sections.h> 27#include <asm/soc.h> 28#include <asm/io.h> 29#include <asm/ptdump.h> 30#include <asm/numa.h> --- 21 unchanged lines hidden (view full) --- 52phys_addr_t phys_ram_base __ro_after_init; 53EXPORT_SYMBOL(phys_ram_base); 54 55unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] 56 __page_aligned_bss; 57EXPORT_SYMBOL(empty_zero_page); 58 59extern char _start[]; | 26 27#include <asm/fixmap.h> 28#include <asm/tlbflush.h> 29#include <asm/sections.h> 30#include <asm/soc.h> 31#include <asm/io.h> 32#include <asm/ptdump.h> 33#include <asm/numa.h> --- 21 unchanged lines hidden (view full) --- 55phys_addr_t phys_ram_base __ro_after_init; 56EXPORT_SYMBOL(phys_ram_base); 57 58unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)] 59 __page_aligned_bss; 60EXPORT_SYMBOL(empty_zero_page); 61 62extern char _start[]; |
63#define DTB_EARLY_BASE_VA (ADDRESS_SPACE_END - (PTRS_PER_PGD / 2 * PGDIR_SIZE) + 1) |
|
60void *_dtb_early_va __initdata; 61uintptr_t _dtb_early_pa __initdata; 62 63static phys_addr_t dma32_phys_limit __initdata; 64 65static void __init zone_sizes_init(void) 66{ 67 unsigned long max_zone_pfns[MAX_NR_ZONES] = { 0, }; --- 72 unchanged lines hidden (view full) --- 140#endif 141 print_ml("lowmem", (unsigned long)PAGE_OFFSET, 142 (unsigned long)high_memory); 143 if (IS_ENABLED(CONFIG_64BIT)) { 144#ifdef CONFIG_KASAN 145 print_ml("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END); 146#endif 147 | 64void *_dtb_early_va __initdata; 65uintptr_t _dtb_early_pa __initdata; 66 67static phys_addr_t dma32_phys_limit __initdata; 68 69static void __init zone_sizes_init(void) 70{ 71 unsigned long max_zone_pfns[MAX_NR_ZONES] = { 0, }; --- 72 unchanged lines hidden (view full) --- 144#endif 145 print_ml("lowmem", (unsigned long)PAGE_OFFSET, 146 (unsigned long)high_memory); 147 if (IS_ENABLED(CONFIG_64BIT)) { 148#ifdef CONFIG_KASAN 149 print_ml("kasan", KASAN_SHADOW_START, KASAN_SHADOW_END); 150#endif 151 |
148 print_ml("kernel", (unsigned long)KERNEL_LINK_ADDR, | 152 print_ml("kernel", (unsigned long)kernel_map.virt_addr, |
149 (unsigned long)ADDRESS_SPACE_END); 150 } 151} 152#else 153static void print_vm_layout(void) { } 154#endif /* CONFIG_DEBUG_VM */ 155 156void __init mem_init(void) --- 50 unchanged lines hidden (view full) --- 207 /* 208 * Reserve from the start of the kernel to the end of the kernel 209 */ 210 memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start); 211 212 phys_ram_end = memblock_end_of_DRAM(); 213 if (!IS_ENABLED(CONFIG_XIP_KERNEL)) 214 phys_ram_base = memblock_start_of_DRAM(); | 153 (unsigned long)ADDRESS_SPACE_END); 154 } 155} 156#else 157static void print_vm_layout(void) { } 158#endif /* CONFIG_DEBUG_VM */ 159 160void __init mem_init(void) --- 50 unchanged lines hidden (view full) --- 211 /* 212 * Reserve from the start of the kernel to the end of the kernel 213 */ 214 memblock_reserve(vmlinux_start, vmlinux_end - vmlinux_start); 215 216 phys_ram_end = memblock_end_of_DRAM(); 217 if (!IS_ENABLED(CONFIG_XIP_KERNEL)) 218 phys_ram_base = memblock_start_of_DRAM(); |
219 |
|
215 /* | 220 /* |
221 * In 64-bit, any use of __va/__pa before this point is wrong as we 222 * did not know the start of DRAM before. 223 */ 224 if (IS_ENABLED(CONFIG_64BIT)) 225 kernel_map.va_pa_offset = PAGE_OFFSET - phys_ram_base; 226 227 /* |
|
216 * memblock allocator is not aware of the fact that last 4K bytes of 217 * the addressable memory can not be mapped because of IS_ERR_VALUE 218 * macro. Make sure that last 4k bytes are not usable by memblock 219 * if end of dram is equal to maximum addressable memory. For 64-bit 220 * kernel, this problem can't happen here as the end of the virtual 221 * address space is occupied by the kernel mapping then this check must 222 * be done as soon as the kernel mapping base address is determined. 223 */ --- 6 unchanged lines hidden (view full) --- 230 min_low_pfn = PFN_UP(phys_ram_base); 231 max_low_pfn = max_pfn = PFN_DOWN(phys_ram_end); 232 high_memory = (void *)(__va(PFN_PHYS(max_low_pfn))); 233 234 dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn)); 235 set_max_mapnr(max_low_pfn - ARCH_PFN_OFFSET); 236 237 reserve_initrd_mem(); | 228 * memblock allocator is not aware of the fact that last 4K bytes of 229 * the addressable memory can not be mapped because of IS_ERR_VALUE 230 * macro. Make sure that last 4k bytes are not usable by memblock 231 * if end of dram is equal to maximum addressable memory. For 64-bit 232 * kernel, this problem can't happen here as the end of the virtual 233 * address space is occupied by the kernel mapping then this check must 234 * be done as soon as the kernel mapping base address is determined. 235 */ --- 6 unchanged lines hidden (view full) --- 242 min_low_pfn = PFN_UP(phys_ram_base); 243 max_low_pfn = max_pfn = PFN_DOWN(phys_ram_end); 244 high_memory = (void *)(__va(PFN_PHYS(max_low_pfn))); 245 246 dma32_phys_limit = min(4UL * SZ_1G, (unsigned long)PFN_PHYS(max_low_pfn)); 247 set_max_mapnr(max_low_pfn - ARCH_PFN_OFFSET); 248 249 reserve_initrd_mem(); |
238 | |
239 /* | 250 /* |
240 * No allocation should be done before reserving the memory as defined 241 * in the device tree, otherwise the allocation could end up in a 242 * reserved region. 243 */ 244 early_init_fdt_scan_reserved_mem(); 245 246 /* | |
247 * If DTB is built in, no need to reserve its memblock. 248 * Otherwise, do reserve it but avoid using 249 * early_init_fdt_reserve_self() since __pa() does 250 * not work for DTB pointers that are fixmap addresses 251 */ | 251 * If DTB is built in, no need to reserve its memblock. 252 * Otherwise, do reserve it but avoid using 253 * early_init_fdt_reserve_self() since __pa() does 254 * not work for DTB pointers that are fixmap addresses 255 */ |
252 if (!IS_ENABLED(CONFIG_BUILTIN_DTB)) 253 memblock_reserve(dtb_early_pa, fdt_totalsize(dtb_early_va)); | 256 if (!IS_ENABLED(CONFIG_BUILTIN_DTB)) { 257 /* 258 * In case the DTB is not located in a memory region we won't 259 * be able to locate it later on via the linear mapping and 260 * get a segfault when accessing it via __va(dtb_early_pa). 261 * To avoid this situation copy DTB to a memory region. 262 * Note that memblock_phys_alloc will also reserve DTB region. 263 */ 264 if (!memblock_is_memory(dtb_early_pa)) { 265 size_t fdt_size = fdt_totalsize(dtb_early_va); 266 phys_addr_t new_dtb_early_pa = memblock_phys_alloc(fdt_size, PAGE_SIZE); 267 void *new_dtb_early_va = early_memremap(new_dtb_early_pa, fdt_size); |
254 | 268 |
269 memcpy(new_dtb_early_va, dtb_early_va, fdt_size); 270 early_memunmap(new_dtb_early_va, fdt_size); 271 _dtb_early_pa = new_dtb_early_pa; 272 } else 273 memblock_reserve(dtb_early_pa, fdt_totalsize(dtb_early_va)); 274 } 275 |
|
255 dma_contiguous_reserve(dma32_phys_limit); 256 if (IS_ENABLED(CONFIG_64BIT)) 257 hugetlb_cma_reserve(PUD_SHIFT - PAGE_SHIFT); 258 memblock_allow_resize(); 259} 260 261#ifdef CONFIG_MMU 262struct pt_alloc_ops pt_ops __initdata; 263 | 276 dma_contiguous_reserve(dma32_phys_limit); 277 if (IS_ENABLED(CONFIG_64BIT)) 278 hugetlb_cma_reserve(PUD_SHIFT - PAGE_SHIFT); 279 memblock_allow_resize(); 280} 281 282#ifdef CONFIG_MMU 283struct pt_alloc_ops pt_ops __initdata; 284 |
264unsigned long riscv_pfn_base __ro_after_init; 265EXPORT_SYMBOL(riscv_pfn_base); 266 | |
267pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_bss; 268pgd_t trampoline_pg_dir[PTRS_PER_PGD] __page_aligned_bss; 269static pte_t fixmap_pte[PTRS_PER_PTE] __page_aligned_bss; 270 271pgd_t early_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE); | 285pgd_t swapper_pg_dir[PTRS_PER_PGD] __page_aligned_bss; 286pgd_t trampoline_pg_dir[PTRS_PER_PGD] __page_aligned_bss; 287static pte_t fixmap_pte[PTRS_PER_PTE] __page_aligned_bss; 288 289pgd_t early_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE); |
290static p4d_t __maybe_unused early_dtb_p4d[PTRS_PER_P4D] __initdata __aligned(PAGE_SIZE); 291static pud_t __maybe_unused early_dtb_pud[PTRS_PER_PUD] __initdata __aligned(PAGE_SIZE); 292static pmd_t __maybe_unused early_dtb_pmd[PTRS_PER_PMD] __initdata __aligned(PAGE_SIZE); |
|
272 273#ifdef CONFIG_XIP_KERNEL 274#define pt_ops (*(struct pt_alloc_ops *)XIP_FIXUP(&pt_ops)) | 293 294#ifdef CONFIG_XIP_KERNEL 295#define pt_ops (*(struct pt_alloc_ops *)XIP_FIXUP(&pt_ops)) |
275#define riscv_pfn_base (*(unsigned long *)XIP_FIXUP(&riscv_pfn_base)) | |
276#define trampoline_pg_dir ((pgd_t *)XIP_FIXUP(trampoline_pg_dir)) 277#define fixmap_pte ((pte_t *)XIP_FIXUP(fixmap_pte)) 278#define early_pg_dir ((pgd_t *)XIP_FIXUP(early_pg_dir)) 279#endif /* CONFIG_XIP_KERNEL */ 280 281static const pgprot_t protection_map[16] = { 282 [VM_NONE] = PAGE_NONE, 283 [VM_READ] = PAGE_READ, --- 324 unchanged lines hidden (view full) --- 608 create_pud_mapping((pud_t *)__nextp, __va, __pa, __sz, __prot) : \ 609 create_pmd_mapping((pmd_t *)__nextp, __va, __pa, __sz, __prot))) 610#define fixmap_pgd_next (pgtable_l5_enabled ? \ 611 (uintptr_t)fixmap_p4d : (pgtable_l4_enabled ? \ 612 (uintptr_t)fixmap_pud : (uintptr_t)fixmap_pmd)) 613#define trampoline_pgd_next (pgtable_l5_enabled ? \ 614 (uintptr_t)trampoline_p4d : (pgtable_l4_enabled ? \ 615 (uintptr_t)trampoline_pud : (uintptr_t)trampoline_pmd)) | 296#define trampoline_pg_dir ((pgd_t *)XIP_FIXUP(trampoline_pg_dir)) 297#define fixmap_pte ((pte_t *)XIP_FIXUP(fixmap_pte)) 298#define early_pg_dir ((pgd_t *)XIP_FIXUP(early_pg_dir)) 299#endif /* CONFIG_XIP_KERNEL */ 300 301static const pgprot_t protection_map[16] = { 302 [VM_NONE] = PAGE_NONE, 303 [VM_READ] = PAGE_READ, --- 324 unchanged lines hidden (view full) --- 628 create_pud_mapping((pud_t *)__nextp, __va, __pa, __sz, __prot) : \ 629 create_pmd_mapping((pmd_t *)__nextp, __va, __pa, __sz, __prot))) 630#define fixmap_pgd_next (pgtable_l5_enabled ? \ 631 (uintptr_t)fixmap_p4d : (pgtable_l4_enabled ? \ 632 (uintptr_t)fixmap_pud : (uintptr_t)fixmap_pmd)) 633#define trampoline_pgd_next (pgtable_l5_enabled ? \ 634 (uintptr_t)trampoline_p4d : (pgtable_l4_enabled ? \ 635 (uintptr_t)trampoline_pud : (uintptr_t)trampoline_pmd)) |
636#define early_dtb_pgd_next (pgtable_l5_enabled ? \ 637 (uintptr_t)early_dtb_p4d : (pgtable_l4_enabled ? \ 638 (uintptr_t)early_dtb_pud : (uintptr_t)early_dtb_pmd)) |
|
616#else 617#define pgd_next_t pte_t 618#define alloc_pgd_next(__va) pt_ops.alloc_pte(__va) 619#define get_pgd_next_virt(__pa) pt_ops.get_pte_virt(__pa) 620#define create_pgd_next_mapping(__nextp, __va, __pa, __sz, __prot) \ 621 create_pte_mapping(__nextp, __va, __pa, __sz, __prot) 622#define fixmap_pgd_next ((uintptr_t)fixmap_pte) | 639#else 640#define pgd_next_t pte_t 641#define alloc_pgd_next(__va) pt_ops.alloc_pte(__va) 642#define get_pgd_next_virt(__pa) pt_ops.get_pte_virt(__pa) 643#define create_pgd_next_mapping(__nextp, __va, __pa, __sz, __prot) \ 644 create_pte_mapping(__nextp, __va, __pa, __sz, __prot) 645#define fixmap_pgd_next ((uintptr_t)fixmap_pte) |
646#define early_dtb_pgd_next ((uintptr_t)early_dtb_pmd) |
|
623#define create_p4d_mapping(__pmdp, __va, __pa, __sz, __prot) do {} while(0) 624#define create_pud_mapping(__pmdp, __va, __pa, __sz, __prot) do {} while(0) 625#define create_pmd_mapping(__pmdp, __va, __pa, __sz, __prot) do {} while(0) 626#endif /* __PAGETABLE_PMD_FOLDED */ 627 628void __init create_pgd_mapping(pgd_t *pgdp, 629 uintptr_t va, phys_addr_t pa, 630 phys_addr_t sz, pgprot_t prot) --- 18 unchanged lines hidden (view full) --- 649 nextp = get_pgd_next_virt(next_phys); 650 } 651 652 create_pgd_next_mapping(nextp, va, pa, sz, prot); 653} 654 655static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size) 656{ | 647#define create_p4d_mapping(__pmdp, __va, __pa, __sz, __prot) do {} while(0) 648#define create_pud_mapping(__pmdp, __va, __pa, __sz, __prot) do {} while(0) 649#define create_pmd_mapping(__pmdp, __va, __pa, __sz, __prot) do {} while(0) 650#endif /* __PAGETABLE_PMD_FOLDED */ 651 652void __init create_pgd_mapping(pgd_t *pgdp, 653 uintptr_t va, phys_addr_t pa, 654 phys_addr_t sz, pgprot_t prot) --- 18 unchanged lines hidden (view full) --- 673 nextp = get_pgd_next_virt(next_phys); 674 } 675 676 create_pgd_next_mapping(nextp, va, pa, sz, prot); 677} 678 679static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size) 680{ |
657 /* Upgrade to PMD_SIZE mappings whenever possible */ 658 base &= PMD_SIZE - 1; 659 if (!base && size >= PMD_SIZE) | 681 if (!(base & (PGDIR_SIZE - 1)) && size >= PGDIR_SIZE) 682 return PGDIR_SIZE; 683 684 if (!(base & (P4D_SIZE - 1)) && size >= P4D_SIZE) 685 return P4D_SIZE; 686 687 if (!(base & (PUD_SIZE - 1)) && size >= PUD_SIZE) 688 return PUD_SIZE; 689 690 if (!(base & (PMD_SIZE - 1)) && size >= PMD_SIZE) |
660 return PMD_SIZE; 661 662 return PAGE_SIZE; 663} 664 665#ifdef CONFIG_XIP_KERNEL 666#define phys_ram_base (*(phys_addr_t *)XIP_FIXUP(&phys_ram_base)) 667extern char _xiprom[], _exiprom[], __data_loc; --- 42 unchanged lines hidden (view full) --- 710 if (IS_ENABLED(CONFIG_64BIT) && !is_kernel_mapping(va)) 711 return PAGE_KERNEL; 712 713 return PAGE_KERNEL_EXEC; 714} 715#endif /* CONFIG_STRICT_KERNEL_RWX */ 716 717#if defined(CONFIG_64BIT) && !defined(CONFIG_XIP_KERNEL) | 691 return PMD_SIZE; 692 693 return PAGE_SIZE; 694} 695 696#ifdef CONFIG_XIP_KERNEL 697#define phys_ram_base (*(phys_addr_t *)XIP_FIXUP(&phys_ram_base)) 698extern char _xiprom[], _exiprom[], __data_loc; --- 42 unchanged lines hidden (view full) --- 741 if (IS_ENABLED(CONFIG_64BIT) && !is_kernel_mapping(va)) 742 return PAGE_KERNEL; 743 744 return PAGE_KERNEL_EXEC; 745} 746#endif /* CONFIG_STRICT_KERNEL_RWX */ 747 748#if defined(CONFIG_64BIT) && !defined(CONFIG_XIP_KERNEL) |
749u64 __pi_set_satp_mode_from_cmdline(uintptr_t dtb_pa); 750 |
|
718static void __init disable_pgtable_l5(void) 719{ 720 pgtable_l5_enabled = false; 721 kernel_map.page_offset = PAGE_OFFSET_L4; 722 satp_mode = SATP_MODE_48; 723} 724 725static void __init disable_pgtable_l4(void) 726{ 727 pgtable_l4_enabled = false; 728 kernel_map.page_offset = PAGE_OFFSET_L3; 729 satp_mode = SATP_MODE_39; 730} 731 | 751static void __init disable_pgtable_l5(void) 752{ 753 pgtable_l5_enabled = false; 754 kernel_map.page_offset = PAGE_OFFSET_L4; 755 satp_mode = SATP_MODE_48; 756} 757 758static void __init disable_pgtable_l4(void) 759{ 760 pgtable_l4_enabled = false; 761 kernel_map.page_offset = PAGE_OFFSET_L3; 762 satp_mode = SATP_MODE_39; 763} 764 |
765static int __init print_no4lvl(char *p) 766{ 767 pr_info("Disabled 4-level and 5-level paging"); 768 return 0; 769} 770early_param("no4lvl", print_no4lvl); 771 772static int __init print_no5lvl(char *p) 773{ 774 pr_info("Disabled 5-level paging"); 775 return 0; 776} 777early_param("no5lvl", print_no5lvl); 778 |
|
732/* 733 * There is a simple way to determine if 4-level is supported by the 734 * underlying hardware: establish 1:1 mapping in 4-level page table mode 735 * then read SATP to see if the configuration was taken into account 736 * meaning sv48 is supported. 737 */ | 779/* 780 * There is a simple way to determine if 4-level is supported by the 781 * underlying hardware: establish 1:1 mapping in 4-level page table mode 782 * then read SATP to see if the configuration was taken into account 783 * meaning sv48 is supported. 784 */ |
738static __init void set_satp_mode(void) | 785static __init void set_satp_mode(uintptr_t dtb_pa) |
739{ 740 u64 identity_satp, hw_satp; 741 uintptr_t set_satp_mode_pmd = ((unsigned long)set_satp_mode) & PMD_MASK; | 786{ 787 u64 identity_satp, hw_satp; 788 uintptr_t set_satp_mode_pmd = ((unsigned long)set_satp_mode) & PMD_MASK; |
742 bool check_l4 = false; | 789 u64 satp_mode_cmdline = __pi_set_satp_mode_from_cmdline(dtb_pa); |
743 | 790 |
791 if (satp_mode_cmdline == SATP_MODE_57) { 792 disable_pgtable_l5(); 793 } else if (satp_mode_cmdline == SATP_MODE_48) { 794 disable_pgtable_l5(); 795 disable_pgtable_l4(); 796 return; 797 } 798 |
|
744 create_p4d_mapping(early_p4d, 745 set_satp_mode_pmd, (uintptr_t)early_pud, 746 P4D_SIZE, PAGE_TABLE); 747 create_pud_mapping(early_pud, 748 set_satp_mode_pmd, (uintptr_t)early_pmd, 749 PUD_SIZE, PAGE_TABLE); 750 /* Handle the case where set_satp_mode straddles 2 PMDs */ 751 create_pmd_mapping(early_pmd, 752 set_satp_mode_pmd, set_satp_mode_pmd, 753 PMD_SIZE, PAGE_KERNEL_EXEC); 754 create_pmd_mapping(early_pmd, 755 set_satp_mode_pmd + PMD_SIZE, 756 set_satp_mode_pmd + PMD_SIZE, 757 PMD_SIZE, PAGE_KERNEL_EXEC); 758retry: 759 create_pgd_mapping(early_pg_dir, 760 set_satp_mode_pmd, | 799 create_p4d_mapping(early_p4d, 800 set_satp_mode_pmd, (uintptr_t)early_pud, 801 P4D_SIZE, PAGE_TABLE); 802 create_pud_mapping(early_pud, 803 set_satp_mode_pmd, (uintptr_t)early_pmd, 804 PUD_SIZE, PAGE_TABLE); 805 /* Handle the case where set_satp_mode straddles 2 PMDs */ 806 create_pmd_mapping(early_pmd, 807 set_satp_mode_pmd, set_satp_mode_pmd, 808 PMD_SIZE, PAGE_KERNEL_EXEC); 809 create_pmd_mapping(early_pmd, 810 set_satp_mode_pmd + PMD_SIZE, 811 set_satp_mode_pmd + PMD_SIZE, 812 PMD_SIZE, PAGE_KERNEL_EXEC); 813retry: 814 create_pgd_mapping(early_pg_dir, 815 set_satp_mode_pmd, |
761 check_l4 ? (uintptr_t)early_pud : (uintptr_t)early_p4d, | 816 pgtable_l5_enabled ? 817 (uintptr_t)early_p4d : (uintptr_t)early_pud, |
762 PGDIR_SIZE, PAGE_TABLE); 763 764 identity_satp = PFN_DOWN((uintptr_t)&early_pg_dir) | satp_mode; 765 766 local_flush_tlb_all(); 767 csr_write(CSR_SATP, identity_satp); 768 hw_satp = csr_swap(CSR_SATP, 0ULL); 769 local_flush_tlb_all(); 770 771 if (hw_satp != identity_satp) { | 818 PGDIR_SIZE, PAGE_TABLE); 819 820 identity_satp = PFN_DOWN((uintptr_t)&early_pg_dir) | satp_mode; 821 822 local_flush_tlb_all(); 823 csr_write(CSR_SATP, identity_satp); 824 hw_satp = csr_swap(CSR_SATP, 0ULL); 825 local_flush_tlb_all(); 826 827 if (hw_satp != identity_satp) { |
772 if (!check_l4) { | 828 if (pgtable_l5_enabled) { |
773 disable_pgtable_l5(); | 829 disable_pgtable_l5(); |
774 check_l4 = true; | |
775 memset(early_pg_dir, 0, PAGE_SIZE); 776 goto retry; 777 } 778 disable_pgtable_l4(); 779 } 780 781 memset(early_pg_dir, 0, PAGE_SIZE); 782 memset(early_p4d, 0, PAGE_SIZE); --- 15 unchanged lines hidden (view full) --- 798 * Currently, the above requirements are honoured by using custom CFLAGS 799 * for init.o in mm/Makefile. 800 */ 801 802#ifndef __riscv_cmodel_medany 803#error "setup_vm() is called from head.S before relocate so it should not use absolute addressing." 804#endif 805 | 830 memset(early_pg_dir, 0, PAGE_SIZE); 831 goto retry; 832 } 833 disable_pgtable_l4(); 834 } 835 836 memset(early_pg_dir, 0, PAGE_SIZE); 837 memset(early_p4d, 0, PAGE_SIZE); --- 15 unchanged lines hidden (view full) --- 853 * Currently, the above requirements are honoured by using custom CFLAGS 854 * for init.o in mm/Makefile. 855 */ 856 857#ifndef __riscv_cmodel_medany 858#error "setup_vm() is called from head.S before relocate so it should not use absolute addressing." 859#endif 860 |
861#ifdef CONFIG_RELOCATABLE 862extern unsigned long __rela_dyn_start, __rela_dyn_end; 863 864static void __init relocate_kernel(void) 865{ 866 Elf64_Rela *rela = (Elf64_Rela *)&__rela_dyn_start; 867 /* 868 * This holds the offset between the linked virtual address and the 869 * relocated virtual address. 870 */ 871 uintptr_t reloc_offset = kernel_map.virt_addr - KERNEL_LINK_ADDR; 872 /* 873 * This holds the offset between kernel linked virtual address and 874 * physical address. 875 */ 876 uintptr_t va_kernel_link_pa_offset = KERNEL_LINK_ADDR - kernel_map.phys_addr; 877 878 for ( ; rela < (Elf64_Rela *)&__rela_dyn_end; rela++) { 879 Elf64_Addr addr = (rela->r_offset - va_kernel_link_pa_offset); 880 Elf64_Addr relocated_addr = rela->r_addend; 881 882 if (rela->r_info != R_RISCV_RELATIVE) 883 continue; 884 885 /* 886 * Make sure to not relocate vdso symbols like rt_sigreturn 887 * which are linked from the address 0 in vmlinux since 888 * vdso symbol addresses are actually used as an offset from 889 * mm->context.vdso in VDSO_OFFSET macro. 890 */ 891 if (relocated_addr >= KERNEL_LINK_ADDR) 892 relocated_addr += reloc_offset; 893 894 *(Elf64_Addr *)addr = relocated_addr; 895 } 896} 897#endif /* CONFIG_RELOCATABLE */ 898 |
|
806#ifdef CONFIG_XIP_KERNEL 807static void __init create_kernel_page_table(pgd_t *pgdir, 808 __always_unused bool early) 809{ 810 uintptr_t va, end_va; 811 812 /* Map the flash resident part */ 813 end_va = kernel_map.virt_addr + kernel_map.xiprom_sz; --- 24 unchanged lines hidden (view full) --- 838} 839#endif 840 841/* 842 * Setup a 4MB mapping that encompasses the device tree: for 64-bit kernel, 843 * this means 2 PMD entries whereas for 32-bit kernel, this is only 1 PGDIR 844 * entry. 845 */ | 899#ifdef CONFIG_XIP_KERNEL 900static void __init create_kernel_page_table(pgd_t *pgdir, 901 __always_unused bool early) 902{ 903 uintptr_t va, end_va; 904 905 /* Map the flash resident part */ 906 end_va = kernel_map.virt_addr + kernel_map.xiprom_sz; --- 24 unchanged lines hidden (view full) --- 931} 932#endif 933 934/* 935 * Setup a 4MB mapping that encompasses the device tree: for 64-bit kernel, 936 * this means 2 PMD entries whereas for 32-bit kernel, this is only 1 PGDIR 937 * entry. 938 */ |
846static void __init create_fdt_early_page_table(pgd_t *pgdir, 847 uintptr_t fix_fdt_va, 848 uintptr_t dtb_pa) | 939static void __init create_fdt_early_page_table(pgd_t *pgdir, uintptr_t dtb_pa) |
849{ | 940{ |
941#ifndef CONFIG_BUILTIN_DTB |
|
850 uintptr_t pa = dtb_pa & ~(PMD_SIZE - 1); 851 | 942 uintptr_t pa = dtb_pa & ~(PMD_SIZE - 1); 943 |
852#ifndef CONFIG_BUILTIN_DTB 853 /* Make sure the fdt fixmap address is always aligned on PMD size */ 854 BUILD_BUG_ON(FIX_FDT % (PMD_SIZE / PAGE_SIZE)); | 944 create_pgd_mapping(early_pg_dir, DTB_EARLY_BASE_VA, 945 IS_ENABLED(CONFIG_64BIT) ? early_dtb_pgd_next : pa, 946 PGDIR_SIZE, 947 IS_ENABLED(CONFIG_64BIT) ? PAGE_TABLE : PAGE_KERNEL); |
855 | 948 |
856 /* In 32-bit only, the fdt lies in its own PGD */ 857 if (!IS_ENABLED(CONFIG_64BIT)) { 858 create_pgd_mapping(early_pg_dir, fix_fdt_va, 859 pa, MAX_FDT_SIZE, PAGE_KERNEL); 860 } else { 861 create_pmd_mapping(fixmap_pmd, fix_fdt_va, | 949 if (pgtable_l5_enabled) 950 create_p4d_mapping(early_dtb_p4d, DTB_EARLY_BASE_VA, 951 (uintptr_t)early_dtb_pud, P4D_SIZE, PAGE_TABLE); 952 953 if (pgtable_l4_enabled) 954 create_pud_mapping(early_dtb_pud, DTB_EARLY_BASE_VA, 955 (uintptr_t)early_dtb_pmd, PUD_SIZE, PAGE_TABLE); 956 957 if (IS_ENABLED(CONFIG_64BIT)) { 958 create_pmd_mapping(early_dtb_pmd, DTB_EARLY_BASE_VA, |
862 pa, PMD_SIZE, PAGE_KERNEL); | 959 pa, PMD_SIZE, PAGE_KERNEL); |
863 create_pmd_mapping(fixmap_pmd, fix_fdt_va + PMD_SIZE, | 960 create_pmd_mapping(early_dtb_pmd, DTB_EARLY_BASE_VA + PMD_SIZE, |
864 pa + PMD_SIZE, PMD_SIZE, PAGE_KERNEL); 865 } 866 | 961 pa + PMD_SIZE, PMD_SIZE, PAGE_KERNEL); 962 } 963 |
867 dtb_early_va = (void *)fix_fdt_va + (dtb_pa & (PMD_SIZE - 1)); | 964 dtb_early_va = (void *)DTB_EARLY_BASE_VA + (dtb_pa & (PMD_SIZE - 1)); |
868#else 869 /* 870 * For 64-bit kernel, __va can't be used since it would return a linear 871 * mapping address whereas dtb_early_va will be used before 872 * setup_vm_final installs the linear mapping. For 32-bit kernel, as the 873 * kernel is mapped in the linear mapping, that makes no difference. 874 */ 875 dtb_early_va = kernel_mapping_pa_to_va(XIP_FIXUP(dtb_pa)); --- 77 unchanged lines hidden (view full) --- 953 954 kernel_map.va_kernel_xip_pa_offset = kernel_map.virt_addr - kernel_map.xiprom; 955#else 956 kernel_map.phys_addr = (uintptr_t)(&_start); 957 kernel_map.size = (uintptr_t)(&_end) - kernel_map.phys_addr; 958#endif 959 960#if defined(CONFIG_64BIT) && !defined(CONFIG_XIP_KERNEL) | 965#else 966 /* 967 * For 64-bit kernel, __va can't be used since it would return a linear 968 * mapping address whereas dtb_early_va will be used before 969 * setup_vm_final installs the linear mapping. For 32-bit kernel, as the 970 * kernel is mapped in the linear mapping, that makes no difference. 971 */ 972 dtb_early_va = kernel_mapping_pa_to_va(XIP_FIXUP(dtb_pa)); --- 77 unchanged lines hidden (view full) --- 1050 1051 kernel_map.va_kernel_xip_pa_offset = kernel_map.virt_addr - kernel_map.xiprom; 1052#else 1053 kernel_map.phys_addr = (uintptr_t)(&_start); 1054 kernel_map.size = (uintptr_t)(&_end) - kernel_map.phys_addr; 1055#endif 1056 1057#if defined(CONFIG_64BIT) && !defined(CONFIG_XIP_KERNEL) |
961 set_satp_mode(); | 1058 set_satp_mode(dtb_pa); |
962#endif 963 | 1059#endif 1060 |
964 kernel_map.va_pa_offset = PAGE_OFFSET - kernel_map.phys_addr; | 1061 /* 1062 * In 64-bit, we defer the setup of va_pa_offset to setup_bootmem, 1063 * where we have the system memory layout: this allows us to align 1064 * the physical and virtual mappings and then make use of PUD/P4D/PGD 1065 * for the linear mapping. This is only possible because the kernel 1066 * mapping lies outside the linear mapping. 1067 * In 32-bit however, as the kernel resides in the linear mapping, 1068 * setup_vm_final can not change the mapping established here, 1069 * otherwise the same kernel addresses would get mapped to different 1070 * physical addresses (if the start of dram is different from the 1071 * kernel physical address start). 1072 */ 1073 kernel_map.va_pa_offset = IS_ENABLED(CONFIG_64BIT) ? 1074 0UL : PAGE_OFFSET - kernel_map.phys_addr; |
965 kernel_map.va_kernel_pa_offset = kernel_map.virt_addr - kernel_map.phys_addr; 966 | 1075 kernel_map.va_kernel_pa_offset = kernel_map.virt_addr - kernel_map.phys_addr; 1076 |
967 riscv_pfn_base = PFN_DOWN(kernel_map.phys_addr); 968 | |
969 /* 970 * The default maximal physical memory size is KERN_VIRT_SIZE for 32-bit 971 * kernel, whereas for 64-bit kernel, the end of the virtual address 972 * space is occupied by the modules/BPF/kernel mappings which reduces 973 * the available size of the linear mapping. 974 */ 975 memory_limit = KERN_VIRT_SIZE - (IS_ENABLED(CONFIG_64BIT) ? SZ_4G : 0); 976 --- 4 unchanged lines hidden (view full) --- 981#ifdef CONFIG_64BIT 982 /* 983 * The last 4K bytes of the addressable memory can not be mapped because 984 * of IS_ERR_VALUE macro. 985 */ 986 BUG_ON((kernel_map.virt_addr + kernel_map.size) > ADDRESS_SPACE_END - SZ_4K); 987#endif 988 | 1077 /* 1078 * The default maximal physical memory size is KERN_VIRT_SIZE for 32-bit 1079 * kernel, whereas for 64-bit kernel, the end of the virtual address 1080 * space is occupied by the modules/BPF/kernel mappings which reduces 1081 * the available size of the linear mapping. 1082 */ 1083 memory_limit = KERN_VIRT_SIZE - (IS_ENABLED(CONFIG_64BIT) ? SZ_4G : 0); 1084 --- 4 unchanged lines hidden (view full) --- 1089#ifdef CONFIG_64BIT 1090 /* 1091 * The last 4K bytes of the addressable memory can not be mapped because 1092 * of IS_ERR_VALUE macro. 1093 */ 1094 BUG_ON((kernel_map.virt_addr + kernel_map.size) > ADDRESS_SPACE_END - SZ_4K); 1095#endif 1096 |
1097#ifdef CONFIG_RELOCATABLE 1098 /* 1099 * Early page table uses only one PUD, which makes it possible 1100 * to map PUD_SIZE aligned on PUD_SIZE: if the relocation offset 1101 * makes the kernel cross over a PUD_SIZE boundary, raise a bug 1102 * since a part of the kernel would not get mapped. 1103 */ 1104 BUG_ON(PUD_SIZE - (kernel_map.virt_addr & (PUD_SIZE - 1)) < kernel_map.size); 1105 relocate_kernel(); 1106#endif 1107 |
|
989 apply_early_boot_alternatives(); 990 pt_ops_set_early(); 991 992 /* Setup early PGD for fixmap */ 993 create_pgd_mapping(early_pg_dir, FIXADDR_START, 994 fixmap_pgd_next, PGDIR_SIZE, PAGE_TABLE); 995 996#ifndef __PAGETABLE_PMD_FOLDED --- 32 unchanged lines hidden (view full) --- 1029 /* 1030 * Setup early PGD covering entire kernel which will allow 1031 * us to reach paging_init(). We map all memory banks later 1032 * in setup_vm_final() below. 1033 */ 1034 create_kernel_page_table(early_pg_dir, true); 1035 1036 /* Setup early mapping for FDT early scan */ | 1108 apply_early_boot_alternatives(); 1109 pt_ops_set_early(); 1110 1111 /* Setup early PGD for fixmap */ 1112 create_pgd_mapping(early_pg_dir, FIXADDR_START, 1113 fixmap_pgd_next, PGDIR_SIZE, PAGE_TABLE); 1114 1115#ifndef __PAGETABLE_PMD_FOLDED --- 32 unchanged lines hidden (view full) --- 1148 /* 1149 * Setup early PGD covering entire kernel which will allow 1150 * us to reach paging_init(). We map all memory banks later 1151 * in setup_vm_final() below. 1152 */ 1153 create_kernel_page_table(early_pg_dir, true); 1154 1155 /* Setup early mapping for FDT early scan */ |
1037 create_fdt_early_page_table(early_pg_dir, 1038 __fix_to_virt(FIX_FDT), dtb_pa); | 1156 create_fdt_early_page_table(early_pg_dir, dtb_pa); |
1039 1040 /* 1041 * Bootime fixmap only can handle PMD_SIZE mapping. Thus, boot-ioremap 1042 * range can not span multiple pmds. 1043 */ 1044 BUG_ON((__fix_to_virt(FIX_BTMAP_BEGIN) >> PMD_SHIFT) 1045 != (__fix_to_virt(FIX_BTMAP_END) >> PMD_SHIFT)); 1046 --- 18 unchanged lines hidden (view full) --- 1065 pr_warn("FIX_BTMAP_END: %d\n", FIX_BTMAP_END); 1066 pr_warn("FIX_BTMAP_BEGIN: %d\n", FIX_BTMAP_BEGIN); 1067 } 1068#endif 1069 1070 pt_ops_set_fixmap(); 1071} 1072 | 1157 1158 /* 1159 * Bootime fixmap only can handle PMD_SIZE mapping. Thus, boot-ioremap 1160 * range can not span multiple pmds. 1161 */ 1162 BUG_ON((__fix_to_virt(FIX_BTMAP_BEGIN) >> PMD_SHIFT) 1163 != (__fix_to_virt(FIX_BTMAP_END) >> PMD_SHIFT)); 1164 --- 18 unchanged lines hidden (view full) --- 1183 pr_warn("FIX_BTMAP_END: %d\n", FIX_BTMAP_END); 1184 pr_warn("FIX_BTMAP_BEGIN: %d\n", FIX_BTMAP_BEGIN); 1185 } 1186#endif 1187 1188 pt_ops_set_fixmap(); 1189} 1190 |
1073static void __init setup_vm_final(void) | 1191static void __init create_linear_mapping_range(phys_addr_t start, 1192 phys_addr_t end) |
1074{ | 1193{ |
1194 phys_addr_t pa; |
|
1075 uintptr_t va, map_size; | 1195 uintptr_t va, map_size; |
1076 phys_addr_t pa, start, end; | 1196 1197 for (pa = start; pa < end; pa += map_size) { 1198 va = (uintptr_t)__va(pa); 1199 map_size = best_map_size(pa, end - pa); 1200 1201 create_pgd_mapping(swapper_pg_dir, va, pa, map_size, 1202 pgprot_from_va(va)); 1203 } 1204} 1205 1206static void __init create_linear_mapping_page_table(void) 1207{ 1208 phys_addr_t start, end; |
1077 u64 i; 1078 | 1209 u64 i; 1210 |
1079 /* Setup swapper PGD for fixmap */ 1080#if !defined(CONFIG_64BIT) 1081 /* 1082 * In 32-bit, the device tree lies in a pgd entry, so it must be copied 1083 * directly in swapper_pg_dir in addition to the pgd entry that points 1084 * to fixmap_pte. 1085 */ 1086 unsigned long idx = pgd_index(__fix_to_virt(FIX_FDT)); | 1211#ifdef CONFIG_STRICT_KERNEL_RWX 1212 phys_addr_t ktext_start = __pa_symbol(_start); 1213 phys_addr_t ktext_size = __init_data_begin - _start; 1214 phys_addr_t krodata_start = __pa_symbol(__start_rodata); 1215 phys_addr_t krodata_size = _data - __start_rodata; |
1087 | 1216 |
1088 set_pgd(&swapper_pg_dir[idx], early_pg_dir[idx]); | 1217 /* Isolate kernel text and rodata so they don't get mapped with a PUD */ 1218 memblock_mark_nomap(ktext_start, ktext_size); 1219 memblock_mark_nomap(krodata_start, krodata_size); |
1089#endif | 1220#endif |
1090 create_pgd_mapping(swapper_pg_dir, FIXADDR_START, 1091 __pa_symbol(fixmap_pgd_next), 1092 PGDIR_SIZE, PAGE_TABLE); | |
1093 1094 /* Map all memory banks in the linear mapping */ 1095 for_each_mem_range(i, &start, &end) { 1096 if (start >= end) 1097 break; 1098 if (start <= __pa(PAGE_OFFSET) && 1099 __pa(PAGE_OFFSET) < end) 1100 start = __pa(PAGE_OFFSET); 1101 if (end >= __pa(PAGE_OFFSET) + memory_limit) 1102 end = __pa(PAGE_OFFSET) + memory_limit; 1103 | 1221 1222 /* Map all memory banks in the linear mapping */ 1223 for_each_mem_range(i, &start, &end) { 1224 if (start >= end) 1225 break; 1226 if (start <= __pa(PAGE_OFFSET) && 1227 __pa(PAGE_OFFSET) < end) 1228 start = __pa(PAGE_OFFSET); 1229 if (end >= __pa(PAGE_OFFSET) + memory_limit) 1230 end = __pa(PAGE_OFFSET) + memory_limit; 1231 |
1104 for (pa = start; pa < end; pa += map_size) { 1105 va = (uintptr_t)__va(pa); 1106 map_size = best_map_size(pa, end - pa); 1107 1108 create_pgd_mapping(swapper_pg_dir, va, pa, map_size, 1109 pgprot_from_va(va)); 1110 } | 1232 create_linear_mapping_range(start, end); |
1111 } 1112 | 1233 } 1234 |
1235#ifdef CONFIG_STRICT_KERNEL_RWX 1236 create_linear_mapping_range(ktext_start, ktext_start + ktext_size); 1237 create_linear_mapping_range(krodata_start, 1238 krodata_start + krodata_size); 1239 1240 memblock_clear_nomap(ktext_start, ktext_size); 1241 memblock_clear_nomap(krodata_start, krodata_size); 1242#endif 1243} 1244 1245static void __init setup_vm_final(void) 1246{ 1247 /* Setup swapper PGD for fixmap */ 1248 create_pgd_mapping(swapper_pg_dir, FIXADDR_START, 1249 __pa_symbol(fixmap_pgd_next), 1250 PGDIR_SIZE, PAGE_TABLE); 1251 1252 /* Map the linear mapping */ 1253 create_linear_mapping_page_table(); 1254 |
|
1113 /* Map the kernel */ 1114 if (IS_ENABLED(CONFIG_64BIT)) 1115 create_kernel_page_table(swapper_pg_dir, false); 1116 1117#ifdef CONFIG_KASAN 1118 kasan_swapper_init(); 1119#endif 1120 --- 115 unchanged lines hidden --- | 1255 /* Map the kernel */ 1256 if (IS_ENABLED(CONFIG_64BIT)) 1257 create_kernel_page_table(swapper_pg_dir, false); 1258 1259#ifdef CONFIG_KASAN 1260 kasan_swapper_init(); 1261#endif 1262 --- 115 unchanged lines hidden --- |