[GIT PULL] RISC-V Patches for the 6.3 Merge Window, Part 1

Palmer Dabbelt palmer at rivosinc.com
Fri Feb 24 10:32:00 PST 2023


The following changes since commit c1d6105869464635d8a2bcf87a43c05f4c0cfca4:

  riscv: Move call to init_cpu_topology() to later initialization stage (2023-01-25 07:20:00 -0800)

are available in the Git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/riscv/linux.git tags/riscv-for-linus-6.3-mw1

for you to fetch changes up to eb9be8310c58c166f9fae3b71c0ad9d6741b4897:

  RISC-V: add a spin_shadow_stack declaration (2023-02-22 06:48:30 -0800)

----------------------------------------------------------------
RISC-V Patches for the 6.3 Merge Window, Part 1

There's a bunch of fixes/cleanups throughout the tree as usual, but we
also have a handful of new features.

* Various improvements to the extension detection and alternative
  patching infrastructure.
* Zbb-optimized string routines.
* Support for cpu-capacity in the RISC-V DT bindings.
* Zicbom no longer depends on toolchain support.
* Some performance and code size improvements to ftrace.
* Support for ARCH_WANT_LD_ORPHAN_WARN.
* Oops now contain the faulting instruction.

----------------------------------------------------------------
This is passing my tests, but there's already some fixes on the list so
there'll almost certainly be a part 2.  There are also some patches with
dependencies that might still be candidates for the merge window, depending on
how things go.

I have a somewhat ugly merge conflict this time between my fixes and for-next,
as there were some fixes to the extension handling code at the same time it was
being refactored.  Here's my resolution, if that helps any -- essentially we're
just moving away from the enums in hwcap so we can use these in assembly, and
have inlined the check in cpu_relax():

diff --cc arch/riscv/include/asm/hwcap.h
index 8f3994a7f0ca,64ad1937e714..000000000000
--- a/arch/riscv/include/asm/hwcap.h
+++ b/arch/riscv/include/asm/hwcap.h
@@@ -24,36 -37,43 +24,32 @@@
  #define RISCV_ISA_EXT_u		('u' - 'a')

  /*
 - * Increse this to higher value as kernel support more ISA extensions.
 + * These macros represent the logical IDs of each multi-letter RISC-V ISA
 + * extension and are used in the ISA bitmap. The logical IDs start from
 + * RISCV_ISA_EXT_BASE, which allows the 0-25 range to be reserved for single
 + * letter extensions. The maximum, RISCV_ISA_EXT_MAX, is defined in order
 + * to allocate the bitmap and may be increased when necessary.
 + *
 + * New extensions should just be added to the bottom, rather than added
 + * alphabetically, in order to avoid unnecessary shuffling.
   */
 -#define RISCV_ISA_EXT_MAX	64
 -#define RISCV_ISA_EXT_NAME_LEN_MAX 32
 +#define RISCV_ISA_EXT_BASE		26

 -/* The base ID for multi-letter ISA extensions */
 -#define RISCV_ISA_EXT_BASE 26
 +#define RISCV_ISA_EXT_SSCOFPMF		26
 +#define RISCV_ISA_EXT_SSTC		27
 +#define RISCV_ISA_EXT_SVINVAL		28
 +#define RISCV_ISA_EXT_SVPBMT		29
 +#define RISCV_ISA_EXT_ZBB		30
 +#define RISCV_ISA_EXT_ZICBOM		31
 +#define RISCV_ISA_EXT_ZIHINTPAUSE	32

 -/*
 - * This enum represent the logical ID for each multi-letter RISC-V ISA extension.
 - * The logical ID should start from RISCV_ISA_EXT_BASE and must not exceed
 - * RISCV_ISA_EXT_MAX. 0-25 range is reserved for single letter
 - * extensions while all the multi-letter extensions should define the next
 - * available logical extension id.
 - */
 -enum riscv_isa_ext_id {
 -	RISCV_ISA_EXT_SSCOFPMF = RISCV_ISA_EXT_BASE,
 -	RISCV_ISA_EXT_SVPBMT,
 -	RISCV_ISA_EXT_ZICBOM,
 -	RISCV_ISA_EXT_ZIHINTPAUSE,
 -	RISCV_ISA_EXT_SSTC,
 -	RISCV_ISA_EXT_SVINVAL,
 -	RISCV_ISA_EXT_ID_MAX
 -};
 -static_assert(RISCV_ISA_EXT_ID_MAX <= RISCV_ISA_EXT_MAX);
 +#define RISCV_ISA_EXT_MAX		64
 +#define RISCV_ISA_EXT_NAME_LEN_MAX	32

 -/*
 - * This enum represents the logical ID for each RISC-V ISA extension static
 - * keys. We can use static key to optimize code path if some ISA extensions
 - * are available.
 - */
 -enum riscv_isa_ext_key {
 -	RISCV_ISA_EXT_KEY_FPU,		/* For 'F' and 'D' */
 -	RISCV_ISA_EXT_KEY_SVINVAL,
 -	RISCV_ISA_EXT_KEY_MAX,
 -};
 +#ifndef __ASSEMBLY__
 +
 +#include <linux/jump_label.h>

- enum {
- 	CAP_HWCAP = 1,
- };
-
  struct riscv_isa_ext_data {
  	/* Name of the extension displayed to userspace via /proc/cpuinfo */
  	char uprop[RISCV_ISA_EXT_NAME_LEN_MAX];
diff --cc arch/riscv/include/asm/vdso/processor.h
index edf0e25e43d1,14f5d27783b8..000000000000
--- a/arch/riscv/include/asm/vdso/processor.h
+++ b/arch/riscv/include/asm/vdso/processor.h

----------------------------------------------------------------
Andrew Jones (4):
      riscv: module: Add ADD16 and SUB16 rela types
      riscv: KVM: Switch has_svinval() to riscv_has_extension_unlikely()
      RISC-V: insn-def: Add I-type insn-def
      riscv: hwcap: Don't alphabetize ISA extension IDs

Andy Chiu (2):
      riscv: ftrace: Fixup panic by disabling preemption
      riscv: jump_label: Fixup unaligned arch_static_branch function

Björn Töpel (3):
      riscv: Add instruction dump to RISC-V splats
      scripts/decodecode: Add support for RISC-V
      riscv, mm: Perform BPF exhandler fixup on page fault

Conor Dooley (12):
      RISC-V: fix incorrect type of ARCH_CANAAN_K210_DTB_SOURCE
      RISC-V: clarify ISA string ordering rules in cpu.c
      RISC-V: resort all extensions in consistent orders
      Documentation: riscv: add a section about ISA string ordering in /proc/cpuinfo
      Documentation: riscv: fix insufficient list item indent
      RISC-V: re-order Kconfig selects alphanumerically
      dt-bindings: arm: move cpu-capacity to a shared loation
      dt-bindings: riscv: add a capacity-dmips-mhz cpu property
      RISC-V: replace cbom instructions with an insn-def
      RISC-V: remove toolchain version checks for Zicbom
      RISC-V: take text_mutex during alternative patching
      RISC-V: add a spin_shadow_stack declaration

Geert Uytterhoeven (1):
      RISC-V: Kconfig: Remove trailing whitespace

Guo Ren (4):
      riscv: pgtable: Fixup comment for KERN_VIRT_SIZE
      riscv: ftrace: Remove wasted nops for !RISCV_ISA_C
      riscv: ftrace: Reduce the detour code size to half
      riscv: mm: hugetlb: Enable ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP

Heiko Stuebner (17):
      RISC-V: fix funct4 definition for c.jalr in parse_asm.h
      RISC-V: add prefix to all constants/macros in parse_asm.h
      RISC-V: detach funct-values from their offset
      RISC-V: add ebreak instructions to definitions
      RISC-V: add auipc elements to parse_asm header
      RISC-V: Move riscv_insn_is_* macros into a common header
      RISC-V: rename parse_asm.h to insn.h
      RISC-V: kprobes: use central defined funct3 constants
      RISC-V: add U-type imm parsing to insn.h header
      RISC-V: add rd reg parsing to insn.h header
      RISC-V: add helpers for handling immediates in U-type and I-type pairs
      RISC-V: fix auipc-jalr addresses in patched alternatives
      RISC-V: Fix do_notify_resume / do_work_pending prototype
      RISC-V: add infrastructure to allow different str* implementations
      RISC-V: add zbb support to string functions
      RISC-V: move some stray __RISCV_INSN_FUNCS definitions from kprobes
      RISC-V: fix ordering of Zbb extension

Jisheng Zhang (18):
      riscv: fix jal offsets in patched alternatives
      riscv: move riscv_noncoherent_supported() out of ZICBOM probe
      riscv: cpufeature: detect RISCV_ALTERNATIVES_EARLY_BOOT earlier
      riscv: hwcap: make ISA extension ids can be used in asm
      riscv: cpufeature: extend riscv_cpufeature_patch_func to all ISA extensions
      riscv: introduce riscv_has_extension_[un]likely()
      riscv: fpu: switch has_fpu() to riscv_has_extension_likely()
      riscv: module: move find_section to module.h
      riscv: switch to relative alternative entries
      riscv: alternative: patch alternatives in the vDSO
      riscv: cpu_relax: switch to riscv_has_extension_likely()
      riscv: remove riscv_isa_ext_keys[] array and related usage
      riscv: lds: define RUNTIME_DISCARD_EXIT
      riscv: vmlinux.lds.S: explicitly catch .rela.dyn symbols
      riscv: vmlinux.lds.S: explicitly catch .riscv.attributes sections
      riscv: vmlinux.lds.S: explicitly catch .init.bss sections from EFI stub
      riscv: select ARCH_WANT_LD_ORPHAN_WARN for !XIP_KERNEL
      riscv: alternative: proceed one more instruction for auipc/jalr pair

Liao Chang (1):
      riscv: Add header include guards to insn.h

Mattias Nissler (1):
      riscv: Avoid enabling interrupts in die()

Palmer Dabbelt (12):
      Merge tag 'soc2arch-immutable' of git://git.kernel.org/pub/scm/linux/kernel/git/conor/linux into for-next
      Merge patch series "Allow calls in alternatives"
      Merge patch "RISC-V: fix incorrect type of ARCH_CANAAN_K210_DTB_SOURCE"
      Merge patch series "Putting some basic order on isa extension lists"
      Merge patch series "Zbb string optimizations"
      Merge patch series "riscv: improve boot time isa extensions handling"
      Merge patch series "dt-bindings: Add a cpu-capacity property for RISC-V"
      Merge patch series "Remove toolchain dependencies for Zicbom"
      Merge patch series "riscv: Optimize function trace"
      RISC-V: Only provide the single-letter extensions in HWCAP
      Merge patch series "riscv: improve link and support ARCH_WANT_LD_ORPHAN_WARN"
      Merge patch series "riscv: Dump faulting instructions in oops handler"

Samuel Holland (2):
      riscv: Fix early alternative patching
      riscv: Fix Zbb alternative IDs

Sergey Matyukevich (1):
      riscv: mm: fix regression due to update_mmu_cache change

 Documentation/devicetree/bindings/arm/cpus.yaml    |   2 +-
 .../bindings/{arm => cpu}/cpu-capacity.txt         |   4 +-
 Documentation/devicetree/bindings/riscv/cpus.yaml  |   6 +
 Documentation/riscv/uabi.rst                       |  42 +++
 Documentation/scheduler/sched-capacity.rst         |   2 +-
 .../zh_CN/scheduler/sched-capacity.rst             |   2 +-
 arch/riscv/Kconfig                                 |  78 +++--
 arch/riscv/Kconfig.socs                            |  40 ++-
 arch/riscv/Makefile                                |  11 +-
 arch/riscv/boot/dts/Makefile                       |   2 +-
 arch/riscv/boot/dts/canaan/Makefile                |  14 +-
 arch/riscv/boot/dts/microchip/Makefile             |   8 +-
 arch/riscv/boot/dts/sifive/Makefile                |   4 +-
 arch/riscv/boot/dts/starfive/Makefile              |   2 +-
 arch/riscv/errata/sifive/errata.c                  |   6 +-
 arch/riscv/errata/thead/errata.c                   |  17 +-
 arch/riscv/include/asm/alternative-macros.h        |  20 +-
 arch/riscv/include/asm/alternative.h               |  20 +-
 arch/riscv/include/asm/elf.h                       |  10 +-
 arch/riscv/include/asm/errata_list.h               |  12 +-
 arch/riscv/include/asm/ftrace.h                    |  50 ++-
 arch/riscv/include/asm/hwcap.h                     | 117 +++----
 arch/riscv/include/asm/insn-def.h                  |  58 ++++
 arch/riscv/include/asm/insn.h                      | 381 +++++++++++++++++++++
 arch/riscv/include/asm/jump_label.h                |   2 +
 arch/riscv/include/asm/module.h                    |  16 +
 arch/riscv/include/asm/parse_asm.h                 | 219 ------------
 arch/riscv/include/asm/pgtable.h                   |   4 +-
 arch/riscv/include/asm/signal.h                    |   2 +-
 arch/riscv/include/asm/string.h                    |  10 +
 arch/riscv/include/asm/switch_to.h                 |   3 +-
 arch/riscv/include/asm/thread_info.h               |   1 +
 arch/riscv/include/asm/vdso.h                      |   4 +
 arch/riscv/include/asm/vdso/processor.h            |   2 +-
 arch/riscv/kernel/alternative.c                    | 113 ++++++
 arch/riscv/kernel/cpu.c                            |  54 ++-
 arch/riscv/kernel/cpufeature.c                     |  85 ++---
 arch/riscv/kernel/ftrace.c                         |  65 +---
 arch/riscv/kernel/kgdb.c                           |  63 ++--
 arch/riscv/kernel/mcount-dyn.S                     |  42 +--
 arch/riscv/kernel/module.c                         |  31 +-
 arch/riscv/kernel/probes/simulate-insn.c           |  19 +-
 arch/riscv/kernel/probes/simulate-insn.h           |  29 +-
 arch/riscv/kernel/riscv_ksyms.c                    |   3 +
 arch/riscv/kernel/setup.c                          |   3 +
 arch/riscv/kernel/traps.c                          |  30 +-
 arch/riscv/kernel/vdso.c                           |   5 -
 arch/riscv/kernel/vdso/vdso.lds.S                  |   7 +
 arch/riscv/kernel/vmlinux.lds.S                    |   9 +
 arch/riscv/kvm/tlb.c                               |   3 +-
 arch/riscv/lib/Makefile                            |   3 +
 arch/riscv/lib/strcmp.S                            | 121 +++++++
 arch/riscv/lib/strlen.S                            | 133 +++++++
 arch/riscv/lib/strncmp.S                           | 139 ++++++++
 arch/riscv/mm/fault.c                              |  10 +-
 arch/riscv/purgatory/Makefile                      |  13 +
 scripts/decodecode                                 |  12 +-
 57 files changed, 1507 insertions(+), 656 deletions(-)
 rename Documentation/devicetree/bindings/{arm => cpu}/cpu-capacity.txt (98%)
 create mode 100644 arch/riscv/include/asm/insn.h
 delete mode 100644 arch/riscv/include/asm/parse_asm.h
 create mode 100644 arch/riscv/lib/strcmp.S
 create mode 100644 arch/riscv/lib/strlen.S
 create mode 100644 arch/riscv/lib/strncmp.S



More information about the linux-riscv mailing list