Merge tag 'riscv-for-linus-6.4-mw1' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 28 Apr 2023 23:55:39 +0000 (16:55 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 28 Apr 2023 23:55:39 +0000 (16:55 -0700)
Pull RISC-V updates from Palmer Dabbelt:

 - Support for runtime detection of the Svnapot extension

 - Support for Zicboz when clearing pages

 - We've moved to GENERIC_ENTRY

 - Support for !MMU on rv32 systems

 - The linear region is now mapped via huge pages

 - Support for building relocatable kernels

 - Support for the hwprobe interface

 - Various fixes and cleanups throughout the tree

* tag 'riscv-for-linus-6.4-mw1' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: (57 commits)
  RISC-V: hwprobe: Explicity check for -1 in vdso init
  RISC-V: hwprobe: There can only be one first
  riscv: Allow to downgrade paging mode from the command line
  dt-bindings: riscv: add sv57 mmu-type
  RISC-V: hwprobe: Remove __init on probe_vendor_features()
  riscv: Use --emit-relocs in order to move .rela.dyn in init
  riscv: Check relocations at compile time
  powerpc: Move script to check relocations at compile time in scripts/
  riscv: Introduce CONFIG_RELOCATABLE
  riscv: Move .rela.dyn outside of init to avoid empty relocations
  riscv: Prepare EFI header for relocatable kernels
  riscv: Unconditionnally select KASAN_VMALLOC if KASAN
  riscv: Fix ptdump when KASAN is enabled
  riscv: Fix EFI stub usage of KASAN instrumented strcmp function
  riscv: Move DTB_EARLY_BASE_VA to the kernel address space
  riscv: Rework kasan population functions
  riscv: Split early and final KASAN population functions
  riscv: Use PUD/P4D/PGD pages for the linear mapping
  riscv: Move the linear mapping creation in its own function
  riscv: Get rid of riscv_pfn_base variable
  ...

17 files changed:
1  2 
Documentation/admin-guide/kernel-parameters.txt
Documentation/devicetree/bindings/riscv/cpus.yaml
arch/riscv/Kconfig
arch/riscv/Makefile
arch/riscv/errata/sifive/errata.c
arch/riscv/include/asm/pgtable.h
arch/riscv/kernel/Makefile
arch/riscv/kernel/cacheinfo.c
arch/riscv/kernel/compat_vdso/Makefile
arch/riscv/kernel/setup.c
arch/riscv/kernel/signal.c
arch/riscv/kernel/smpboot.c
arch/riscv/kernel/vdso/Makefile
arch/riscv/mm/cacheflush.c
arch/riscv/mm/fault.c
arch/riscv/mm/init.c
tools/testing/selftests/Makefile

                        emulation library even if a 387 maths coprocessor
                        is present.
  
-       no5lvl          [X86-64] Disable 5-level paging mode. Forces
+       no4lvl          [RISCV] Disable 4-level and 5-level paging modes. Forces
+                       kernel to use 3-level paging instead.
+       no5lvl          [X86-64,RISCV] Disable 5-level paging mode. Forces
                        kernel to use 4-level paging instead.
  
 -      nofsgsbase      [X86] Disables FSGSBASE instructions.
 +      noaliencache    [MM, NUMA, SLAB] Disables the allocation of alien
 +                      caches in the slab allocator.  Saves per-node memory,
 +                      but will impact performance.
 +
 +      noalign         [KNL,ARM]
 +
 +      noaltinstr      [S390] Disables alternative instructions patching
 +                      (CPU alternatives feature).
 +
 +      noapic          [SMP,APIC] Tells the kernel to not make use of any
 +                      IOAPICs that may be present in the system.
 +
 +      noautogroup     Disable scheduler automatic task group creation.
 +
 +      nocache         [ARM]
  
        no_console_suspend
                        [HW] Never suspend the console
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1070,23 -1188,63 +1168,73 @@@ asmlinkage void __init setup_vm(uintptr
        pt_ops_set_fixmap();
  }
  
- static void __init setup_vm_final(void)
+ static void __init create_linear_mapping_range(phys_addr_t start,
+                                              phys_addr_t end)
  {
+       phys_addr_t pa;
        uintptr_t va, map_size;
-       phys_addr_t pa, start, end;
+       for (pa = start; pa < end; pa += map_size) {
+               va = (uintptr_t)__va(pa);
+               map_size = best_map_size(pa, end - pa);
+               create_pgd_mapping(swapper_pg_dir, va, pa, map_size,
+                                  pgprot_from_va(va));
+       }
+ }
+ static void __init create_linear_mapping_page_table(void)
+ {
+       phys_addr_t start, end;
        u64 i;
  
+ #ifdef CONFIG_STRICT_KERNEL_RWX
+       phys_addr_t ktext_start = __pa_symbol(_start);
+       phys_addr_t ktext_size = __init_data_begin - _start;
+       phys_addr_t krodata_start = __pa_symbol(__start_rodata);
+       phys_addr_t krodata_size = _data - __start_rodata;
+       /* Isolate kernel text and rodata so they don't get mapped with a PUD */
+       memblock_mark_nomap(ktext_start,  ktext_size);
+       memblock_mark_nomap(krodata_start, krodata_size);
+ #endif
+       /* Map all memory banks in the linear mapping */
+       for_each_mem_range(i, &start, &end) {
+               if (start >= end)
+                       break;
+               if (start <= __pa(PAGE_OFFSET) &&
+                   __pa(PAGE_OFFSET) < end)
+                       start = __pa(PAGE_OFFSET);
+               if (end >= __pa(PAGE_OFFSET) + memory_limit)
+                       end = __pa(PAGE_OFFSET) + memory_limit;
+               create_linear_mapping_range(start, end);
+       }
+ #ifdef CONFIG_STRICT_KERNEL_RWX
+       create_linear_mapping_range(ktext_start, ktext_start + ktext_size);
+       create_linear_mapping_range(krodata_start,
+                                   krodata_start + krodata_size);
+       memblock_clear_nomap(ktext_start,  ktext_size);
+       memblock_clear_nomap(krodata_start, krodata_size);
+ #endif
+ }
+ static void __init setup_vm_final(void)
+ {
        /* Setup swapper PGD for fixmap */
 +#if !defined(CONFIG_64BIT)
 +      /*
 +       * In 32-bit, the device tree lies in a pgd entry, so it must be copied
 +       * directly in swapper_pg_dir in addition to the pgd entry that points
 +       * to fixmap_pte.
 +       */
 +      unsigned long idx = pgd_index(__fix_to_virt(FIX_FDT));
 +
 +      set_pgd(&swapper_pg_dir[idx], early_pg_dir[idx]);
 +#endif
        create_pgd_mapping(swapper_pg_dir, FIXADDR_START,
                           __pa_symbol(fixmap_pgd_next),
                           PGDIR_SIZE, PAGE_TABLE);
Simple merge