]> Git Repo - J-linux.git/commitdiff
Merge tag 'riscv-for-linus-6.8-mw1' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <[email protected]>
Wed, 17 Jan 2024 18:50:46 +0000 (10:50 -0800)
committerLinus Torvalds <[email protected]>
Wed, 17 Jan 2024 18:50:46 +0000 (10:50 -0800)
Pull RISC-V updates from Palmer Dabbelt:

 - Support for many new extensions in hwprobe, along with a handful of
   cleanups

 - Various cleanups to our page table handling code, so we alwayse use
   {READ,WRITE}_ONCE

 - Support for the which-cpus flavor of hwprobe

 - Support for XIP kernels has been resurrected

* tag 'riscv-for-linus-6.8-mw1' of git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux: (52 commits)
  riscv: hwprobe: export Zicond extension
  riscv: hwprobe: export Zacas ISA extension
  riscv: add ISA extension parsing for Zacas
  dt-bindings: riscv: add Zacas ISA extension description
  riscv: hwprobe: export Ztso ISA extension
  riscv: add ISA extension parsing for Ztso
  use linux/export.h rather than asm-generic/export.h
  riscv: Remove SHADOW_OVERFLOW_STACK_SIZE macro
  riscv; fix __user annotation in save_v_state()
  riscv: fix __user annotation in traps_misaligned.c
  riscv: Select ARCH_WANTS_NO_INSTR
  riscv: Remove obsolete rv32_defconfig file
  riscv: Allow disabling of BUILTIN_DTB for XIP
  riscv: Fixed wrong register in XIP_FIXUP_FLASH_OFFSET macro
  riscv: Make XIP bootable again
  riscv: Fix set_direct_map_default_noflush() to reset _PAGE_EXEC
  riscv: Fix module_alloc() that did not reset the linear mapping permissions
  riscv: Fix wrong usage of lm_alias() when splitting a huge linear mapping
  riscv: Check if the code to patch lies in the exit section
  riscv: Use the same CPU operations for all CPUs
  ...

1  2 
arch/riscv/Kconfig
arch/riscv/include/asm/pgtable.h
arch/riscv/kernel/Makefile
arch/riscv/mm/fault.c
include/linux/pgtable.h

diff --combined arch/riscv/Kconfig
index cd4c9a204d08c93453543021a01f5fa82b7168c3,19dfd521a52a490f9a80b48224d63c289f4086af..dcb50071b91ae7333bf795c8aa30b18b2e820a7c
@@@ -59,6 -59,7 +59,7 @@@ config RISC
        select ARCH_WANT_HUGE_PMD_SHARE if 64BIT
        select ARCH_WANT_LD_ORPHAN_WARN if !XIP_KERNEL
        select ARCH_WANT_OPTIMIZE_HUGETLB_VMEMMAP
+       select ARCH_WANTS_NO_INSTR
        select ARCH_WANTS_THP_SWAP if HAVE_ARCH_TRANSPARENT_HUGEPAGE
        select BINFMT_FLAT_NO_DATA_START_OFFSET if !MMU
        select BUILDTIME_TABLE_SORT if MMU
@@@ -685,7 -686,7 +686,7 @@@ config RISCV_BOOT_SPINWAI
          If unsure what to do here, say N.
  
  config ARCH_SUPPORTS_KEXEC
 -      def_bool MMU
 +      def_bool y
  
  config ARCH_SELECTS_KEXEC
        def_bool y
        select HOTPLUG_CPU if SMP
  
  config ARCH_SUPPORTS_KEXEC_FILE
 -      def_bool 64BIT && MMU
 +      def_bool 64BIT
  
  config ARCH_SELECTS_KEXEC_FILE
        def_bool y
        select KEXEC_ELF
  
  config ARCH_SUPPORTS_KEXEC_PURGATORY
 -      def_bool KEXEC_FILE
 -      depends on CRYPTO=y
 -      depends on CRYPTO_SHA256=y
 +      def_bool ARCH_SUPPORTS_KEXEC_FILE
  
  config ARCH_SUPPORTS_CRASH_DUMP
        def_bool y
@@@ -902,13 -905,13 +903,13 @@@ config RISCV_ISA_FALLBAC
          on the replacement properties, "riscv,isa-base" and
          "riscv,isa-extensions".
  
- endmenu # "Boot options"
  config BUILTIN_DTB
-       bool
+       bool "Built-in device tree"
        depends on OF && NONPORTABLE
        default y if XIP_KERNEL
  
+ endmenu # "Boot options"
  config PORTABLE
        bool
        default !NONPORTABLE
index 7b4287f360547e32a9fbe70cf76d47659b77c214,3773f454f0fa059c0c87d240e339ef2d7d8a8485..e3ffef1c61193228c3b2f72794bb6289c188f57d
@@@ -248,7 -248,7 +248,7 @@@ static inline int pmd_leaf(pmd_t pmd
  
  static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)
  {
-       *pmdp = pmd;
+       WRITE_ONCE(*pmdp, pmd);
  }
  
  static inline void pmd_clear(pmd_t *pmdp)
@@@ -510,7 -510,7 +510,7 @@@ static inline int pte_same(pte_t pte_a
   */
  static inline void set_pte(pte_t *ptep, pte_t pteval)
  {
-       *ptep = pteval;
+       WRITE_ONCE(*ptep, pteval);
  }
  
  void flush_icache_pte(pte_t pte);
@@@ -544,19 -544,12 +544,12 @@@ static inline void pte_clear(struct mm_
        __set_pte_at(ptep, __pte(0));
  }
  
- #define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
- static inline int ptep_set_access_flags(struct vm_area_struct *vma,
-                                       unsigned long address, pte_t *ptep,
-                                       pte_t entry, int dirty)
- {
-       if (!pte_same(*ptep, entry))
-               __set_pte_at(ptep, entry);
-       /*
-        * update_mmu_cache will unconditionally execute, handling both
-        * the case that the PTE changed and the spurious fault case.
-        */
-       return true;
- }
+ #define __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS     /* defined in mm/pgtable.c */
+ extern int ptep_set_access_flags(struct vm_area_struct *vma, unsigned long address,
+                                pte_t *ptep, pte_t entry, int dirty);
+ #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG /* defined in mm/pgtable.c */
+ extern int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned long address,
+                                    pte_t *ptep);
  
  #define __HAVE_ARCH_PTEP_GET_AND_CLEAR
  static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
        return pte;
  }
  
- #define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
- static inline int ptep_test_and_clear_young(struct vm_area_struct *vma,
-                                           unsigned long address,
-                                           pte_t *ptep)
- {
-       if (!pte_young(*ptep))
-               return 0;
-       return test_and_clear_bit(_PAGE_ACCESSED_OFFSET, &pte_val(*ptep));
- }
  #define __HAVE_ARCH_PTEP_SET_WRPROTECT
  static inline void ptep_set_wrprotect(struct mm_struct *mm,
                                      unsigned long address, pte_t *ptep)
@@@ -673,7 -656,6 +656,7 @@@ static inline int pmd_write(pmd_t pmd
        return pte_write(pmd_pte(pmd));
  }
  
 +#define pmd_dirty pmd_dirty
  static inline int pmd_dirty(pmd_t pmd)
  {
        return pte_dirty(pmd_pte(pmd));
@@@ -900,7 -882,7 +883,7 @@@ static inline pte_t pte_swp_clear_exclu
  #define PAGE_KERNEL           __pgprot(0)
  #define swapper_pg_dir                NULL
  #define TASK_SIZE             0xffffffffUL
 -#define VMALLOC_START         0
 +#define VMALLOC_START         _AC(0, UL)
  #define VMALLOC_END           TASK_SIZE
  
  #endif /* !CONFIG_MMU */
index 82940b6a79a2659320c172582e36c32111b997a6,a1f5dc145574018f6ffd3f5c331cde84ca95e995..757413d36c5e685d8bc68b00dbc5ccc04a0c89db
@@@ -11,7 -11,7 +11,7 @@@ endi
  CFLAGS_syscall_table.o        += $(call cc-option,-Wno-override-init,)
  CFLAGS_compat_syscall_table.o += $(call cc-option,-Wno-override-init,)
  
 -ifdef CONFIG_KEXEC
 +ifdef CONFIG_KEXEC_CORE
  AFLAGS_kexec_relocate.o := -mcmodel=medany $(call cc-option,-mno-relax)
  endif
  
@@@ -50,6 -50,7 +50,7 @@@ obj-y += setup.
  obj-y += signal.o
  obj-y += syscall_table.o
  obj-y += sys_riscv.o
+ obj-y += sys_hwprobe.o
  obj-y += time.o
  obj-y += traps.o
  obj-y += riscv_ksyms.o
diff --combined arch/riscv/mm/fault.c
index 081339ddf47ef4bae95f02f80c227318b869cd6e,76f1df709a21b456367991b407006386608ce11c..3ba1d4dde5dd1a27651c9fd10714e84761a30b53
@@@ -136,24 -136,24 +136,24 @@@ static inline void vmalloc_fault(struc
        pgd = (pgd_t *)pfn_to_virt(pfn) + index;
        pgd_k = init_mm.pgd + index;
  
-       if (!pgd_present(*pgd_k)) {
+       if (!pgd_present(pgdp_get(pgd_k))) {
                no_context(regs, addr);
                return;
        }
-       set_pgd(pgd, *pgd_k);
+       set_pgd(pgd, pgdp_get(pgd_k));
  
        p4d_k = p4d_offset(pgd_k, addr);
-       if (!p4d_present(*p4d_k)) {
+       if (!p4d_present(p4dp_get(p4d_k))) {
                no_context(regs, addr);
                return;
        }
  
        pud_k = pud_offset(p4d_k, addr);
-       if (!pud_present(*pud_k)) {
+       if (!pud_present(pudp_get(pud_k))) {
                no_context(regs, addr);
                return;
        }
-       if (pud_leaf(*pud_k))
+       if (pud_leaf(pudp_get(pud_k)))
                goto flush_tlb;
  
        /*
         * to copy individual PTEs
         */
        pmd_k = pmd_offset(pud_k, addr);
-       if (!pmd_present(*pmd_k)) {
+       if (!pmd_present(pmdp_get(pmd_k))) {
                no_context(regs, addr);
                return;
        }
-       if (pmd_leaf(*pmd_k))
+       if (pmd_leaf(pmdp_get(pmd_k)))
                goto flush_tlb;
  
        /*
         * silently loop forever.
         */
        pte_k = pte_offset_kernel(pmd_k, addr);
-       if (!pte_present(*pte_k)) {
+       if (!pte_present(ptep_get(pte_k))) {
                no_context(regs, addr);
                return;
        }
@@@ -304,8 -304,6 +304,8 @@@ void handle_page_fault(struct pt_regs *
                goto done;
        }
        count_vm_vma_lock_event(VMA_LOCK_RETRY);
 +      if (fault & VM_FAULT_MAJOR)
 +              flags |= FAULT_FLAG_TRIED;
  
        if (fault_signal_pending(fault, regs)) {
                if (!user_mode(regs))
diff --combined include/linux/pgtable.h
index 466cf477551a8c94de0a1c79a459e3ae74cde203,8b7daccd11bef242e9477687d04639f3f28ed893..f6d0e3513948ac4567a54a012d2517f4dcea7efe
@@@ -184,13 -184,6 +184,13 @@@ static inline int pmd_young(pmd_t pmd
  }
  #endif
  
 +#ifndef pmd_dirty
 +static inline int pmd_dirty(pmd_t pmd)
 +{
 +      return 0;
 +}
 +#endif
 +
  /*
   * A facility to provide lazy MMU batching.  This allows PTE updates and
   * page invalidations to be delayed until a call to leave lazy MMU mode
@@@ -299,6 -292,27 +299,27 @@@ static inline pmd_t pmdp_get(pmd_t *pmd
  }
  #endif
  
+ #ifndef pudp_get
+ static inline pud_t pudp_get(pud_t *pudp)
+ {
+       return READ_ONCE(*pudp);
+ }
+ #endif
+ #ifndef p4dp_get
+ static inline p4d_t p4dp_get(p4d_t *p4dp)
+ {
+       return READ_ONCE(*p4dp);
+ }
+ #endif
+ #ifndef pgdp_get
+ static inline pgd_t pgdp_get(pgd_t *pgdp)
+ {
+       return READ_ONCE(*pgdp);
+ }
+ #endif
  #ifndef __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
  static inline int ptep_test_and_clear_young(struct vm_area_struct *vma,
                                            unsigned long address,
@@@ -382,7 -396,7 +403,7 @@@ static inline bool arch_has_hw_nonleaf_
   */
  static inline bool arch_has_hw_pte_young(void)
  {
 -      return false;
 +      return IS_ENABLED(CONFIG_ARCH_HAS_HW_PTE_YOUNG);
  }
  #endif
  
This page took 0.117387 seconds and 4 git commands to generate.