diff mbox series

RISC-V: vDSO: Wire up getrandom() vDSO implementation

Message ID 20250224122541.65045-1-xry111@xry111.site (mailing list archive)
State New
Headers show
Series RISC-V: vDSO: Wire up getrandom() vDSO implementation | expand

Checks

Context Check Description
bjorn/pre-ci_am success Success
bjorn/build-rv32-defconfig fail build-rv32-defconfig
bjorn/build-rv64-clang-allmodconfig fail build-rv64-clang-allmodconfig
bjorn/build-rv64-gcc-allmodconfig fail build-rv64-gcc-allmodconfig
bjorn/build-rv64-nommu-k210-defconfig success build-rv64-nommu-k210-defconfig
bjorn/build-rv64-nommu-k210-virt success build-rv64-nommu-k210-virt
bjorn/checkpatch warning checkpatch
bjorn/dtb-warn-rv64 success dtb-warn-rv64
bjorn/header-inline success header-inline
bjorn/kdoc success kdoc
bjorn/module-param success module-param
bjorn/verify-fixes success verify-fixes
bjorn/verify-signedoff success verify-signedoff

Commit Message

Xi Ruoyao Feb. 24, 2025, 12:25 p.m. UTC
Hook up the generic vDSO implementation to the LoongArch vDSO data page
by providing the required __arch_chacha20_blocks_nostack,
__arch_get_k_vdso_rng_data, and getrandom_syscall implementations. Also
wire up the selftests.

The benchmark result:

	vdso: 25000000 times in 2.560024913 seconds
	libc: 25000000 times in 40.960524767 seconds
	syscall: 25000000 times in 40.380651864 seconds

	vdso: 25000000 x 256 times in 171.830655321 seconds
	libc: 25000000 x 256 times in 2913.107080132 seconds
	syscall: 25000000 x 256 times in 2692.084323377 seconds

Note that it depends on Thomas Weißschuh's vDSO generic data storage
implementation (now in the timers/vdso branch of tip).

Signed-off-by: Xi Ruoyao <xry111@xry111.site>
---
 arch/riscv/Kconfig                            |   1 +
 arch/riscv/include/asm/vdso/getrandom.h       |  30 +++
 arch/riscv/kernel/vdso/Makefile               |   7 +-
 arch/riscv/kernel/vdso/getrandom.c            |  10 +
 arch/riscv/kernel/vdso/vdso.lds.S             |   1 +
 arch/riscv/kernel/vdso/vgetrandom-chacha.S    | 244 ++++++++++++++++++
 .../selftests/vDSO/vgetrandom-chacha.S        |   2 +
 7 files changed, 294 insertions(+), 1 deletion(-)
 create mode 100644 arch/riscv/include/asm/vdso/getrandom.h
 create mode 100644 arch/riscv/kernel/vdso/getrandom.c
 create mode 100644 arch/riscv/kernel/vdso/vgetrandom-chacha.S

Comments

Thomas Weißschuh Feb. 24, 2025, 2:07 p.m. UTC | #1
Hi!

On Mon, Feb 24, 2025 at 08:25:41PM +0800, Xi Ruoyao wrote:
> Hook up the generic vDSO implementation to the LoongArch vDSO data page

LoongArch?

"to the generic vDSO getrandom implementation"

> by providing the required __arch_chacha20_blocks_nostack,
> __arch_get_k_vdso_rng_data, and getrandom_syscall implementations. Also
> wire up the selftests.
> 
> The benchmark result:
> 
> 	vdso: 25000000 times in 2.560024913 seconds
> 	libc: 25000000 times in 40.960524767 seconds
> 	syscall: 25000000 times in 40.380651864 seconds
> 
> 	vdso: 25000000 x 256 times in 171.830655321 seconds
> 	libc: 25000000 x 256 times in 2913.107080132 seconds
> 	syscall: 25000000 x 256 times in 2692.084323377 seconds
> 
> Note that it depends on Thomas Weißschuh's vDSO generic data storage
> implementation (now in the timers/vdso branch of tip).

The note should be below a "---" line, so it doesn't end up in the commit.

> Signed-off-by: Xi Ruoyao <xry111@xry111.site>
> ---
>  arch/riscv/Kconfig                            |   1 +
>  arch/riscv/include/asm/vdso/getrandom.h       |  30 +++
>  arch/riscv/kernel/vdso/Makefile               |   7 +-
>  arch/riscv/kernel/vdso/getrandom.c            |  10 +
>  arch/riscv/kernel/vdso/vdso.lds.S             |   1 +
>  arch/riscv/kernel/vdso/vgetrandom-chacha.S    | 244 ++++++++++++++++++
>  .../selftests/vDSO/vgetrandom-chacha.S        |   2 +
>  7 files changed, 294 insertions(+), 1 deletion(-)
>  create mode 100644 arch/riscv/include/asm/vdso/getrandom.h
>  create mode 100644 arch/riscv/kernel/vdso/getrandom.c
>  create mode 100644 arch/riscv/kernel/vdso/vgetrandom-chacha.S
> 
> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> index aa8ea53186c0..6fdd63e15fb4 100644
> --- a/arch/riscv/Kconfig
> +++ b/arch/riscv/Kconfig
> @@ -213,6 +213,7 @@ config RISCV
>  	select THREAD_INFO_IN_TASK
>  	select TRACE_IRQFLAGS_SUPPORT
>  	select UACCESS_MEMCPY if !MMU
> +	select VDSO_GETRANDOM if HAVE_GENERIC_VDSO

Broken alphabetical ordering.

>  	select USER_STACKTRACE_SUPPORT
>  	select ZONE_DMA32 if 64BIT

<snip>
Xi Ruoyao Feb. 24, 2025, 2:10 p.m. UTC | #2
On Mon, 2025-02-24 at 15:07 +0100, Thomas Weißschuh wrote:
> Hi!
> 
> On Mon, Feb 24, 2025 at 08:25:41PM +0800, Xi Ruoyao wrote:
> > Hook up the generic vDSO implementation to the LoongArch vDSO data
> > page
> 
> LoongArch?

Oops, pasto by "reusing" my own words in LoongArch commit :(.

> "to the generic vDSO getrandom implementation"
> 
> > by providing the required __arch_chacha20_blocks_nostack,
> > __arch_get_k_vdso_rng_data, and getrandom_syscall implementations.
> > Also
> > wire up the selftests.
> > 
> > The benchmark result:
> > 
> > 	vdso: 25000000 times in 2.560024913 seconds
> > 	libc: 25000000 times in 40.960524767 seconds
> > 	syscall: 25000000 times in 40.380651864 seconds
> > 
> > 	vdso: 25000000 x 256 times in 171.830655321 seconds
> > 	libc: 25000000 x 256 times in 2913.107080132 seconds
> > 	syscall: 25000000 x 256 times in 2692.084323377 seconds
> > 
> > Note that it depends on Thomas Weißschuh's vDSO generic data storage
> > implementation (now in the timers/vdso branch of tip).
> 
> The note should be below a "---" line, so it doesn't end up in the
> commit.

> 
> > Signed-off-by: Xi Ruoyao <xry111@xry111.site>
> > ---
> >  arch/riscv/Kconfig                            |   1 +
> >  arch/riscv/include/asm/vdso/getrandom.h       |  30 +++
> >  arch/riscv/kernel/vdso/Makefile               |   7 +-
> >  arch/riscv/kernel/vdso/getrandom.c            |  10 +
> >  arch/riscv/kernel/vdso/vdso.lds.S             |   1 +
> >  arch/riscv/kernel/vdso/vgetrandom-chacha.S    | 244
> > ++++++++++++++++++
> >  .../selftests/vDSO/vgetrandom-chacha.S        |   2 +
> >  7 files changed, 294 insertions(+), 1 deletion(-)
> >  create mode 100644 arch/riscv/include/asm/vdso/getrandom.h
> >  create mode 100644 arch/riscv/kernel/vdso/getrandom.c
> >  create mode 100644 arch/riscv/kernel/vdso/vgetrandom-chacha.S
> > 
> > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
> > index aa8ea53186c0..6fdd63e15fb4 100644
> > --- a/arch/riscv/Kconfig
> > +++ b/arch/riscv/Kconfig
> > @@ -213,6 +213,7 @@ config RISCV
> >  	select THREAD_INFO_IN_TASK
> >  	select TRACE_IRQFLAGS_SUPPORT
> >  	select UACCESS_MEMCPY if !MMU
> > +	select VDSO_GETRANDOM if HAVE_GENERIC_VDSO
> 
> Broken alphabetical ordering.

I'm still investigating some CI failures (at lease some of them seem not
just caused by missing the generic data storage implementation).  I'll
fix them and the errors you found in V2.
Jason A. Donenfeld Feb. 24, 2025, 4:57 p.m. UTC | #3
On Mon, Feb 24, 2025 at 1:26 PM Xi Ruoyao <xry111@xry111.site> wrote:
>
> Hook up the generic vDSO implementation to the LoongArch vDSO data page
> by providing the required __arch_chacha20_blocks_nostack,
> __arch_get_k_vdso_rng_data, and getrandom_syscall implementations. Also
> wire up the selftests.

Thomas noted the LoongArch copypasta, but also, there's no
__arch_get_k_vdso_rng_data implementation here, like the message says,
presumably because of the generic data storage work.
kernel test robot March 1, 2025, 7:21 p.m. UTC | #4
Hi Xi,

kernel test robot noticed the following build errors:

[auto build test ERROR on crng-random/master]
[also build test ERROR on shuah-kselftest/next shuah-kselftest/fixes linus/master v6.14-rc4 next-20250228]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Xi-Ruoyao/RISC-V-vDSO-Wire-up-getrandom-vDSO-implementation/20250224-203232
base:   https://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git master
patch link:    https://lore.kernel.org/r/20250224122541.65045-1-xry111%40xry111.site
patch subject: [PATCH] RISC-V: vDSO: Wire up getrandom() vDSO implementation
config: riscv-randconfig-001-20250302 (https://download.01.org/0day-ci/archive/20250302/202503020317.POudjwvT-lkp@intel.com/config)
compiler: clang version 21.0.0git (https://github.com/llvm/llvm-project 14170b16028c087ca154878f5ed93d3089a965c6)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250302/202503020317.POudjwvT-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503020317.POudjwvT-lkp@intel.com/

All errors (new ones prefixed by >>):

>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:92:2: error: instruction requires the following: RV64I Base Instruction Set
    ld t2, (a2)
    ^
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:118:15: error: immediate must be an integer in the range [0, 31]
    srli a6, t2, 32
                 ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   addw s0, s0, s4
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:127:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s4, s5, s6, s7
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s1, s1, s5
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:127:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s4, s5, s6, s7
    ^
   <instantiation>:3:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s2, s2, s6
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:127:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s4, s5, s6, s7
    ^
   <instantiation>:4:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s3, s3, s7
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:127:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s4, s5, s6, s7
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, a5, 32 - 16
   ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI a5, a5, 16
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 16, 16, 16, 16
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw a5, a5, 16
    ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI a5, a5, 16
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 16, 16, 16, 16
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, a6, 32 - 16
   ^
   <instantiation>:2:2: note: while in macro instantiation
    ROTRI a6, a6, 16
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 16, 16, 16, 16
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw a6, a6, 16
    ^
   <instantiation>:2:2: note: while in macro instantiation
    ROTRI a6, a6, 16
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 16, 16, 16, 16
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, a7, 32 - 16
   ^
   <instantiation>:3:2: note: while in macro instantiation
    ROTRI a7, a7, 16
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 16, 16, 16, 16
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw a7, a7, 16
    ^
   <instantiation>:3:2: note: while in macro instantiation
    ROTRI a7, a7, 16
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 16, 16, 16, 16
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, t1, 32 - 16
   ^
   <instantiation>:4:2: note: while in macro instantiation
    ROTRI t1, t1, 16
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 16, 16, 16, 16
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw t1, t1, 16
    ^
   <instantiation>:4:2: note: while in macro instantiation
    ROTRI t1, t1, 16
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 16, 16, 16, 16
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   addw s8, s8, a5
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:131:2: note: while in macro instantiation
    OP_4REG addw s8, s9, s10, s11, a5, a6, a7, t1
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s9, s9, a6
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:131:2: note: while in macro instantiation
    OP_4REG addw s8, s9, s10, s11, a5, a6, a7, t1
    ^
   <instantiation>:3:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s10, s10, a7
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:131:2: note: while in macro instantiation
    OP_4REG addw s8, s9, s10, s11, a5, a6, a7, t1
    ^
   <instantiation>:4:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s11, s11, t1
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:131:2: note: while in macro instantiation
    OP_4REG addw s8, s9, s10, s11, a5, a6, a7, t1
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, s4, 32 - 20
   ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI s4, s4, 20
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 20, 20, 20, 20
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw s4, s4, 20
    ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI s4, s4, 20
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 20, 20, 20, 20
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, s5, 32 - 20
   ^
   <instantiation>:2:2: note: while in macro instantiation
    ROTRI s5, s5, 20
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 20, 20, 20, 20
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw s5, s5, 20
    ^
   <instantiation>:2:2: note: while in macro instantiation
    ROTRI s5, s5, 20
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 20, 20, 20, 20
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, s6, 32 - 20
   ^
   <instantiation>:3:2: note: while in macro instantiation
    ROTRI s6, s6, 20
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 20, 20, 20, 20
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw s6, s6, 20
    ^
   <instantiation>:3:2: note: while in macro instantiation
    ROTRI s6, s6, 20
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 20, 20, 20, 20
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, s7, 32 - 20
   ^
   <instantiation>:4:2: note: while in macro instantiation
    ROTRI s7, s7, 20
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 20, 20, 20, 20
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw s7, s7, 20
    ^
   <instantiation>:4:2: note: while in macro instantiation
    ROTRI s7, s7, 20
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 20, 20, 20, 20
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   addw s0, s0, s4
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:135:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s4, s5, s6, s7
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s1, s1, s5
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:135:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s4, s5, s6, s7
    ^
   <instantiation>:3:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s2, s2, s6
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:135:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s4, s5, s6, s7
    ^
   <instantiation>:4:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s3, s3, s7
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:135:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s4, s5, s6, s7
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, a5, 32 - 24
   ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI a5, a5, 24
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 24, 24, 24, 24
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw a5, a5, 24
    ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI a5, a5, 24
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 24, 24, 24, 24
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, a6, 32 - 24
   ^
   <instantiation>:2:2: note: while in macro instantiation
    ROTRI a6, a6, 24
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 24, 24, 24, 24
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw a6, a6, 24
    ^
   <instantiation>:2:2: note: while in macro instantiation
    ROTRI a6, a6, 24
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 24, 24, 24, 24
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, a7, 32 - 24
   ^
   <instantiation>:3:2: note: while in macro instantiation
    ROTRI a7, a7, 24
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 24, 24, 24, 24
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw a7, a7, 24
    ^
   <instantiation>:3:2: note: while in macro instantiation
    ROTRI a7, a7, 24
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 24, 24, 24, 24
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, t1, 32 - 24
   ^
   <instantiation>:4:2: note: while in macro instantiation
    ROTRI t1, t1, 24
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 24, 24, 24, 24
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw t1, t1, 24
    ^
   <instantiation>:4:2: note: while in macro instantiation
    ROTRI t1, t1, 24
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:2: note: while in macro instantiation
    OP_4REG ROTRI a5, a6, a7, t1, 24, 24, 24, 24
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   addw s8, s8, a5
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:139:2: note: while in macro instantiation
    OP_4REG addw s8, s9, s10, s11, a5, a6, a7, t1
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s9, s9, a6
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:139:2: note: while in macro instantiation
    OP_4REG addw s8, s9, s10, s11, a5, a6, a7, t1
    ^
   <instantiation>:3:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s10, s10, a7
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:139:2: note: while in macro instantiation
    OP_4REG addw s8, s9, s10, s11, a5, a6, a7, t1
    ^
   <instantiation>:4:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s11, s11, t1
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:139:2: note: while in macro instantiation
    OP_4REG addw s8, s9, s10, s11, a5, a6, a7, t1
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, s4, 32 - 25
   ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI s4, s4, 25
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 25, 25, 25, 25
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw s4, s4, 25
    ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI s4, s4, 25
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 25, 25, 25, 25
    ^
>> <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, s5, 32 - 25
   ^
   <instantiation>:2:2: note: while in macro instantiation
    ROTRI s5, s5, 25
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 25, 25, 25, 25
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw s5, s5, 25
    ^
   <instantiation>:2:2: note: while in macro instantiation
    ROTRI s5, s5, 25
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 25, 25, 25, 25
    ^
   <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, s6, 32 - 25
   ^
   <instantiation>:3:2: note: while in macro instantiation
    ROTRI s6, s6, 25
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 25, 25, 25, 25
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw s6, s6, 25
    ^
   <instantiation>:3:2: note: while in macro instantiation
    ROTRI s6, s6, 25
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 25, 25, 25, 25
    ^
   <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, s7, 32 - 25
   ^
   <instantiation>:4:2: note: while in macro instantiation
    ROTRI s7, s7, 25
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 25, 25, 25, 25
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw s7, s7, 25
    ^
   <instantiation>:4:2: note: while in macro instantiation
    ROTRI s7, s7, 25
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:2: note: while in macro instantiation
    OP_4REG ROTRI s4, s5, s6, s7, 25, 25, 25, 25
    ^
   <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   addw s0, s0, s5
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:144:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s5, s6, s7, s4
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s1, s1, s6
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:144:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s5, s6, s7, s4
    ^
   <instantiation>:3:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s2, s2, s7
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:144:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s5, s6, s7, s4
    ^
   <instantiation>:4:2: error: instruction requires the following: RV64I Base Instruction Set
    addw s3, s3, s4
    ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:144:2: note: while in macro instantiation
    OP_4REG addw s0, s1, s2, s3, s5, s6, s7, s4
    ^
   <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, t1, 32 - 16
   ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI t1, t1, 16
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:146:2: note: while in macro instantiation
    OP_4REG ROTRI t1, a5, a6, a7, 16, 16, 16, 16
    ^
   <instantiation>:2:2: error: instruction requires the following: RV64I Base Instruction Set
    srliw t1, t1, 16
    ^
   <instantiation>:1:1: note: while in macro instantiation
   ROTRI t1, t1, 16
   ^
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:146:2: note: while in macro instantiation
    OP_4REG ROTRI t1, a5, a6, a7, 16, 16, 16, 16
    ^
   <instantiation>:1:1: error: instruction requires the following: RV64I Base Instruction Set
   slliw t0, a5, 32 - 16
   ^
   <instantiation>:2:2: note: while in macro instantiation
    ROTRI a5, a5, 16


vim +92 arch/riscv/kernel/vdso/vgetrandom-chacha.S

    77	
    78		addi		sp, sp, -12*SZREG
    79		REG_S		s0,         (sp)
    80		REG_S		s1,    SZREG(sp)
    81		REG_S		s2,  2*SZREG(sp)
    82		REG_S		s3,  3*SZREG(sp)
    83		REG_S		s4,  4*SZREG(sp)
    84		REG_S		s5,  5*SZREG(sp)
    85		REG_S		s6,  6*SZREG(sp)
    86		REG_S		s7,  7*SZREG(sp)
    87		REG_S		s8,  8*SZREG(sp)
    88		REG_S		s9,  9*SZREG(sp)
    89		REG_S		s10, 10*SZREG(sp)
    90		REG_S		s11, 11*SZREG(sp)
    91	
  > 92		ld		cnt, (counter)
    93	
    94		li		copy0, 0x61707865
    95		li		copy1, 0x3320646e
    96		li		copy2, 0x79622d32
    97		li		copy3, 0x6b206574
    98	
    99	.Lblock:
   100		/* state[0,1,2,3] = "expand 32-byte k" */
   101		mv		state0, copy0
   102		mv		state1, copy1
   103		mv		state2, copy2
   104		mv		state3, copy3
   105	
   106		/* state[4,5,..,11] = key */
   107		lw		state4,   (key)
   108		lw		state5,  4(key)
   109		lw		state6,  8(key)
   110		lw		state7,  12(key)
   111		lw		state8,  16(key)
   112		lw		state9,  20(key)
   113		lw		state10, 24(key)
   114		lw		state11, 28(key)
   115	
   116		/* state[12,13] = counter */
   117		mv		state12, cnt
 > 118		srli		state13, cnt, 32
kernel test robot March 2, 2025, 12:17 a.m. UTC | #5
Hi Xi,

kernel test robot noticed the following build errors:

[auto build test ERROR on crng-random/master]
[also build test ERROR on shuah-kselftest/next shuah-kselftest/fixes linus/master v6.14-rc4 next-20250228]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Xi-Ruoyao/RISC-V-vDSO-Wire-up-getrandom-vDSO-implementation/20250224-203232
base:   https://git.kernel.org/pub/scm/linux/kernel/git/crng/random.git master
patch link:    https://lore.kernel.org/r/20250224122541.65045-1-xry111%40xry111.site
patch subject: [PATCH] RISC-V: vDSO: Wire up getrandom() vDSO implementation
config: riscv-randconfig-r122-20250302 (https://download.01.org/0day-ci/archive/20250302/202503020759.lCd4bDgK-lkp@intel.com/config)
compiler: riscv32-linux-gcc (GCC) 14.2.0
reproduce: (https://download.01.org/0day-ci/archive/20250302/202503020759.lCd4bDgK-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202503020759.lCd4bDgK-lkp@intel.com/

All errors (new ones prefixed by >>):

   arch/riscv/kernel/vdso/getrandom.c:7:9: warning: no previous prototype for '__vdso_getrandom' [-Wmissing-prototypes]
       7 | ssize_t __vdso_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state, size_t opaque_len)
         |         ^~~~~~~~~~~~~~~~
   arch/riscv/kernel/vdso/getrandom.c: In function '__vdso_getrandom':
>> arch/riscv/kernel/vdso/getrandom.c:9:16: error: implicit declaration of function '__cvdso_getrandom'; did you mean '__vdso_getrandom'? [-Wimplicit-function-declaration]
       9 |         return __cvdso_getrandom(buffer, len, flags, opaque_state, opaque_len);
         |                ^~~~~~~~~~~~~~~~~
         |                __vdso_getrandom
   arch/riscv/kernel/vdso/vgetrandom-chacha.S: Assembler messages:
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:92: Error: unrecognized opcode `ld t2,(a2)'
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:118: Error: improper shift amount (32)
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:20: Error: unrecognized opcode `addw s0,s0,s4'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:127:  Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:21: Error: unrecognized opcode `addw s1,s1,s5'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:127:  Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:22: Error: unrecognized opcode `addw s2,s2,s6'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:127:  Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:23: Error: unrecognized opcode `addw s3,s3,s7'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:127:  Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,a5,32-16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:   Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw a5,a5,16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:   Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,a6,32-16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:   Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw a6,a6,16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:   Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,a7,32-16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:   Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw a7,a7,16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:   Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,t1,32-16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:   Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw t1,t1,16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:129:   Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:20: Error: unrecognized opcode `addw s8,s8,a5'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:131:  Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:21: Error: unrecognized opcode `addw s9,s9,a6'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:131:  Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:22: Error: unrecognized opcode `addw s10,s10,a7'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:131:  Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:23: Error: unrecognized opcode `addw s11,s11,t1'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:131:  Info: macro invoked from here
>> arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,s4,32-20'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw s4,s4,20'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,s5,32-20'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw s5,s5,20'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,s6,32-20'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw s6,s6,20'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,s7,32-20'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw s7,s7,20'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:133:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20: Error: unrecognized opcode `addw s0,s0,s4'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:135:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21: Error: unrecognized opcode `addw s1,s1,s5'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:135:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22: Error: unrecognized opcode `addw s2,s2,s6'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:135:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23: Error: unrecognized opcode `addw s3,s3,s7'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:135:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,a5,32-24'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw a5,a5,24'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,a6,32-24'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw a6,a6,24'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,a7,32-24'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw a7,a7,24'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,t1,32-24'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw t1,t1,24'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:137:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20: Error: unrecognized opcode `addw s8,s8,a5'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:139:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21: Error: unrecognized opcode `addw s9,s9,a6'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:139:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22: Error: unrecognized opcode `addw s10,s10,a7'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:139:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23: Error: unrecognized opcode `addw s11,s11,t1'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:139:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,s4,32-25'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw s4,s4,25'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,s5,32-25'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw s5,s5,25'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,s6,32-25'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw s6,s6,25'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,s7,32-25'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw s7,s7,25'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:141:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20: Error: unrecognized opcode `addw s0,s0,s5'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:144:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:21: Error: unrecognized opcode `addw s1,s1,s6'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:144:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:22: Error: unrecognized opcode `addw s2,s2,s7'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:144:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:23: Error: unrecognized opcode `addw s3,s3,s4'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:144:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:14: Error: unrecognized opcode `slliw t0,t1,32-16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:146:   Info: macro invoked from here
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:15: Error: unrecognized opcode `srliw t1,t1,16'
   arch/riscv/kernel/vdso/vgetrandom-chacha.S:20:  Info: macro invoked from here


vim +9 arch/riscv/kernel/vdso/getrandom.c

     6	
     7	ssize_t __vdso_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state, size_t opaque_len)
     8	{
   > 9		return __cvdso_getrandom(buffer, len, flags, opaque_state, opaque_len);
diff mbox series

Patch

diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig
index aa8ea53186c0..6fdd63e15fb4 100644
--- a/arch/riscv/Kconfig
+++ b/arch/riscv/Kconfig
@@ -213,6 +213,7 @@  config RISCV
 	select THREAD_INFO_IN_TASK
 	select TRACE_IRQFLAGS_SUPPORT
 	select UACCESS_MEMCPY if !MMU
+	select VDSO_GETRANDOM if HAVE_GENERIC_VDSO
 	select USER_STACKTRACE_SUPPORT
 	select ZONE_DMA32 if 64BIT
 
diff --git a/arch/riscv/include/asm/vdso/getrandom.h b/arch/riscv/include/asm/vdso/getrandom.h
new file mode 100644
index 000000000000..7d5e53e670bb
--- /dev/null
+++ b/arch/riscv/include/asm/vdso/getrandom.h
@@ -0,0 +1,30 @@ 
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2025 Xi Ruoyao <xry111@xry111.site>. All Rights Reserved.
+ */
+#ifndef __ASM_VDSO_GETRANDOM_H
+#define __ASM_VDSO_GETRANDOM_H
+
+#ifndef __ASSEMBLY__
+
+#include <asm/unistd.h>
+
+static __always_inline ssize_t getrandom_syscall(void *_buffer, size_t _len, unsigned int _flags)
+{
+	register long ret asm("a0");
+	register long nr asm("a7") = __NR_getrandom;
+	register void *buffer asm("a0") = _buffer;
+	register size_t len asm("a1") = _len;
+	register unsigned int flags asm("a2") = _flags;
+
+	asm volatile ("ecall\n"
+		      : "+r" (ret)
+		      : "r" (nr), "r" (buffer), "r" (len), "r" (flags)
+		      : "memory");
+
+	return ret;
+}
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* __ASM_VDSO_GETRANDOM_H */
diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile
index 4a5d131506fc..be068a50f671 100644
--- a/arch/riscv/kernel/vdso/Makefile
+++ b/arch/riscv/kernel/vdso/Makefile
@@ -12,9 +12,10 @@  vdso-syms += getcpu
 vdso-syms += flush_icache
 vdso-syms += hwprobe
 vdso-syms += sys_hwprobe
+vdso-syms += getrandom
 
 # Files to link into the vdso
-obj-vdso = $(patsubst %, %.o, $(vdso-syms)) note.o
+obj-vdso = $(patsubst %, %.o, $(vdso-syms)) note.o vgetrandom-chacha.o
 
 ccflags-y := -fno-stack-protector
 ccflags-y += -DDISABLE_BRANCH_PROFILING
@@ -24,6 +25,10 @@  ifneq ($(c-gettimeofday-y),)
   CFLAGS_vgettimeofday.o += -fPIC -include $(c-gettimeofday-y)
 endif
 
+ifneq ($(c-getrandom-y),)
+  CFLAGS_getrandom.o += -fPIC -include $(c-getrandom-y)
+endif
+
 CFLAGS_hwprobe.o += -fPIC
 
 # Build rules
diff --git a/arch/riscv/kernel/vdso/getrandom.c b/arch/riscv/kernel/vdso/getrandom.c
new file mode 100644
index 000000000000..f21922e8cebd
--- /dev/null
+++ b/arch/riscv/kernel/vdso/getrandom.c
@@ -0,0 +1,10 @@ 
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2025 Xi Ruoyao <xry111@xry111.site>. All Rights Reserved.
+ */
+#include <linux/types.h>
+
+ssize_t __vdso_getrandom(void *buffer, size_t len, unsigned int flags, void *opaque_state, size_t opaque_len)
+{
+	return __cvdso_getrandom(buffer, len, flags, opaque_state, opaque_len);
+}
diff --git a/arch/riscv/kernel/vdso/vdso.lds.S b/arch/riscv/kernel/vdso/vdso.lds.S
index 8e86965a8aae..abc69cda0445 100644
--- a/arch/riscv/kernel/vdso/vdso.lds.S
+++ b/arch/riscv/kernel/vdso/vdso.lds.S
@@ -80,6 +80,7 @@  VERSION
 #ifndef COMPAT_VDSO
 		__vdso_riscv_hwprobe;
 #endif
+		__vdso_getrandom;
 	local: *;
 	};
 }
diff --git a/arch/riscv/kernel/vdso/vgetrandom-chacha.S b/arch/riscv/kernel/vdso/vgetrandom-chacha.S
new file mode 100644
index 000000000000..29ec6525a257
--- /dev/null
+++ b/arch/riscv/kernel/vdso/vgetrandom-chacha.S
@@ -0,0 +1,244 @@ 
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2025 Xi Ruoyao <xry111@xry111.site>. All Rights Reserved.
+ *
+ * Based on arch/loongarch/vdso/vgetrandom-chacha.S.
+ */
+
+#include <asm/asm.h>
+#include <linux/linkage.h>
+
+.text
+
+.macro	ROTRI	rd rs imm
+	slliw	t0, \rs, 32 - \imm
+	srliw	\rd, \rs, \imm
+	or	\rd, \rd, t0
+.endm
+
+.macro	OP_4REG	op d0 d1 d2 d3 s0 s1 s2 s3
+	\op	\d0, \d0, \s0
+	\op	\d1, \d1, \s1
+	\op	\d2, \d2, \s2
+	\op	\d3, \d3, \s3
+.endm
+
+/*
+ *	a0: output bytes
+ * 	a1: 32-byte key input
+ *	a2: 8-byte counter input/output
+ *	a3: number of 64-byte blocks to write to output
+ */
+SYM_FUNC_START(__arch_chacha20_blocks_nostack)
+
+#define output		a0
+#define key		a1
+#define counter		a2
+#define nblocks		a3
+#define i		a4
+#define state0		s0
+#define state1		s1
+#define state2		s2
+#define state3		s3
+#define state4		s4
+#define state5		s5
+#define state6		s6
+#define state7		s7
+#define state8		s8
+#define state9		s9
+#define state10		s10
+#define state11		s11
+#define state12		a5
+#define state13		a6
+#define state14		a7
+#define state15		t1
+#define cnt		t2
+#define copy0		t3
+#define copy1		t4
+#define copy2		t5
+#define copy3		t6
+
+/* Packs to be used with OP_4REG */
+#define line0		state0, state1, state2, state3
+#define line1		state4, state5, state6, state7
+#define line2		state8, state9, state10, state11
+#define line3		state12, state13, state14, state15
+
+#define line1_perm	state5, state6, state7, state4
+#define line2_perm	state10, state11, state8, state9
+#define line3_perm	state15, state12, state13, state14
+
+#define copy            copy0, copy1, copy2, copy3
+
+#define _16		16, 16, 16, 16
+#define _20		20, 20, 20, 20
+#define _24		24, 24, 24, 24
+#define _25		25, 25, 25, 25
+
+	addi		sp, sp, -12*SZREG
+	REG_S		s0,         (sp)
+	REG_S		s1,    SZREG(sp)
+	REG_S		s2,  2*SZREG(sp)
+	REG_S		s3,  3*SZREG(sp)
+	REG_S		s4,  4*SZREG(sp)
+	REG_S		s5,  5*SZREG(sp)
+	REG_S		s6,  6*SZREG(sp)
+	REG_S		s7,  7*SZREG(sp)
+	REG_S		s8,  8*SZREG(sp)
+	REG_S		s9,  9*SZREG(sp)
+	REG_S		s10, 10*SZREG(sp)
+	REG_S		s11, 11*SZREG(sp)
+
+	ld		cnt, (counter)
+
+	li		copy0, 0x61707865
+	li		copy1, 0x3320646e
+	li		copy2, 0x79622d32
+	li		copy3, 0x6b206574
+
+.Lblock:
+	/* state[0,1,2,3] = "expand 32-byte k" */
+	mv		state0, copy0
+	mv		state1, copy1
+	mv		state2, copy2
+	mv		state3, copy3
+
+	/* state[4,5,..,11] = key */
+	lw		state4,   (key)
+	lw		state5,  4(key)
+	lw		state6,  8(key)
+	lw		state7,  12(key)
+	lw		state8,  16(key)
+	lw		state9,  20(key)
+	lw		state10, 24(key)
+	lw		state11, 28(key)
+
+	/* state[12,13] = counter */
+	mv		state12, cnt
+	srli		state13, cnt, 32
+
+	/* state[14,15] = 0 */
+	mv		state14, zero
+	mv		state15, zero
+
+	li		i, 10
+.Lpermute:
+	/* odd round */
+	OP_4REG	addw	line0, line1
+	OP_4REG	xor	line3, line0
+	OP_4REG	ROTRI	line3, _16
+
+	OP_4REG	addw	line2, line3
+	OP_4REG	xor	line1, line2
+	OP_4REG	ROTRI	line1, _20
+
+	OP_4REG	addw	line0, line1
+	OP_4REG	xor	line3, line0
+	OP_4REG	ROTRI	line3, _24
+
+	OP_4REG	addw	line2, line3
+	OP_4REG	xor	line1, line2
+	OP_4REG	ROTRI	line1, _25
+
+	/* even round */
+	OP_4REG	addw	line0, line1_perm
+	OP_4REG	xor	line3_perm, line0
+	OP_4REG	ROTRI	line3_perm, _16
+
+	OP_4REG	addw	line2_perm, line3_perm
+	OP_4REG	xor	line1_perm, line2_perm
+	OP_4REG	ROTRI	line1_perm, _20
+
+	OP_4REG	addw	line0, line1_perm
+	OP_4REG	xor	line3_perm, line0
+	OP_4REG	ROTRI	line3_perm, _24
+
+	OP_4REG	addw	line2_perm, line3_perm
+	OP_4REG	xor	line1_perm, line2_perm
+	OP_4REG	ROTRI	line1_perm, _25
+
+	addi		i, i, -1
+	bnez		i, .Lpermute
+
+	/* output[0,1,2,3] = copy[0,1,2,3] + state[0,1,2,3] */
+	OP_4REG	addw	line0, copy
+	sw		state0,   (output)
+	sw		state1,  4(output)
+	sw		state2,  8(output)
+	sw		state3, 12(output)
+
+	/* from now on state[0,1,2,3] are scratch registers  */
+
+	/* state[0,1,2,3] = lo(key) */
+	lw		state0,   (key)
+	lw		state1,  4(key)
+	lw		state2,  8(key)
+	lw		state3, 12(key)
+
+	/* output[4,5,6,7] = state[0,1,2,3] + state[4,5,6,7] */
+	OP_4REG	addw	line1, line0
+	sw		state4, 16(output)
+	sw		state5, 20(output)
+	sw		state6, 24(output)
+	sw		state7, 28(output)
+
+	/* state[0,1,2,3] = hi(key) */
+	lw		state0, 16(key)
+	lw		state1, 20(key)
+	lw		state2, 24(key)
+	lw		state3, 28(key)
+
+	/* output[8,9,10,11] = tmp[0,1,2,3] + state[8,9,10,11] */
+	OP_4REG	addw	line2, line0
+	sw		state8,  32(output)
+	sw		state9,  36(output)
+	sw		state10, 40(output)
+	sw		state11, 44(output)
+
+	/* output[12,13,14,15] = state[12,13,14,15] + [cnt_lo, cnt_hi, 0, 0] */
+	addw		state12, state12, cnt
+	srli		state0, cnt, 32
+	addw		state13, state13, state0
+	sw		state12, 48(output)
+	sw		state13, 52(output)
+	sw		state14, 56(output)
+	sw		state15, 60(output)
+
+	/* ++counter */
+	addi		cnt, cnt, 1
+
+	/* output += 64 */
+	addi		output, output, 64
+	/* --nblocks */
+	addi		nblocks, nblocks, -1
+	bnez		nblocks, .Lblock
+
+	/* counter = [cnt_lo, cnt_hi] */
+	sd		cnt, (counter)
+
+	/* Zero out the potentially sensitive regs, in case nothing uses these
+	 * again.  As at now copy[0,1,2,3] just contains "expand 32-byte k" and
+	 * state[0,...,11] are s0-s11 those we'll restore in the epilogue, we
+	 * only need to zero state[12,...,15].
+	 */
+	mv		state12, zero
+	mv		state13, zero
+	mv		state14, zero
+	mv		state15, zero
+
+	REG_L		s0,         (sp)
+	REG_L		s1,    SZREG(sp)
+	REG_L		s2,  2*SZREG(sp)
+	REG_L		s3,  3*SZREG(sp)
+	REG_L		s4,  4*SZREG(sp)
+	REG_L		s5,  5*SZREG(sp)
+	REG_L		s6,  6*SZREG(sp)
+	REG_L		s7,  7*SZREG(sp)
+	REG_L		s8,  8*SZREG(sp)
+	REG_L		s9,  9*SZREG(sp)
+	REG_L		s10, 10*SZREG(sp)
+	REG_L		s11, 11*SZREG(sp)
+	addi		sp, sp, 12*SZREG
+
+	ret
+SYM_FUNC_END(__arch_chacha20_blocks_nostack)
diff --git a/tools/testing/selftests/vDSO/vgetrandom-chacha.S b/tools/testing/selftests/vDSO/vgetrandom-chacha.S
index d6e09af7c0a9..3633f2d37fe8 100644
--- a/tools/testing/selftests/vDSO/vgetrandom-chacha.S
+++ b/tools/testing/selftests/vDSO/vgetrandom-chacha.S
@@ -9,6 +9,8 @@ 
 #include "../../../../arch/arm64/kernel/vdso/vgetrandom-chacha.S"
 #elif defined(__loongarch__)
 #include "../../../../arch/loongarch/vdso/vgetrandom-chacha.S"
+#elif defined(__riscv)
+#include "../../../../arch/riscv/kernel/vdso/vgetrandom-chacha.S"
 #elif defined(__powerpc__) || defined(__powerpc64__)
 #include "../../../../arch/powerpc/kernel/vdso/vgetrandom-chacha.S"
 #elif defined(__s390x__)