From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Fri, 28 Apr 2023 23:55:39 +0000 (-0700)
Subject: Merge tag 'riscv-for-linus-6.4-mw1' of git://git.kernel.org/pub/scm/linux/kernel... 
X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=89d77f71f493a3663b10fa812d17f472935d24be;p=linux.git

Merge tag 'riscv-for-linus-6.4-mw1' of git://git./linux/kernel/git/riscv/linux

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
  ...
---

89d77f71f493a3663b10fa812d17f472935d24be
diff --cc Documentation/admin-guide/kernel-parameters.txt
index b1453e0e3c955,accc400b43f1d..9e5bab29685ff
--- a/Documentation/admin-guide/kernel-parameters.txt
+++ b/Documentation/admin-guide/kernel-parameters.txt
@@@ -3612,24 -3576,13 +3612,27 @@@
  			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
diff --cc arch/riscv/mm/init.c
index 0f14f4a8d179a,3ad771571c2d0..a39fe42baf55f
--- a/arch/riscv/mm/init.c
+++ b/arch/riscv/mm/init.c
@@@ -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);