[PATCH v2 1/2] riscv: add platform-specific double word shifts for riscv32
Charlie Jenkins
thecharlesjenkins at gmail.com
Fri Apr 10 12:30:14 PDT 2026
On Fri, Apr 10, 2026 at 01:49:31PM +0300, Dmitry Antipov wrote:
> On Thu, 2026-04-09 at 16:22 -0700, Charlie Jenkins wrote:
>
> > However, this change causes the libstub to bypass these new functions
> > you have introduced. lib-ashldi3.o and lib-lshrdi3.o use the following
> > rule to compile the generic arch libs:
> >
> > $(obj)/lib-%.o: $(srctree)/lib/%.c FORCE
> > $(call if_changed_rule,cc_o_c)
> >
> > This is specifically for the efi libstub, the regular kernel (like in
> > your test case in the next patch) will use these newly introduced
> > functions.
> >
> > One solution is to use this change instead:
> >
> > diff --git a/drivers/firmware/efi/libstub/Makefile b/drivers/firmware/efi/libstub/Makefile
> > index e386ffd009b7..775c34d80179 100644
> > --- a/drivers/firmware/efi/libstub/Makefile
> > +++ b/drivers/firmware/efi/libstub/Makefile
> > @@ -96,7 +96,7 @@ CFLAGS_zboot-decompress-gzip.o += -I$(srctree)/lib/zlib_inflate
> > zboot-obj-$(CONFIG_KERNEL_ZSTD) := zboot-decompress-zstd.o lib-xxhash.o
> > CFLAGS_zboot-decompress-zstd.o += -I$(srctree)/lib/zstd
> >
> > -zboot-obj-$(CONFIG_RISCV) += lib-clz_ctz.o lib-ashldi3.o
> > +zboot-obj-$(CONFIG_RISCV) += lib-clz_ctz.o ../../../../arch/riscv/lib/ashldi3.o ../../../../arch/riscv/lib/lshrdi3.o
> > lib-$(CONFIG_EFI_ZBOOT) += zboot.o $(zboot-obj-y)
> >
> > lib-$(CONFIG_UNACCEPTED_MEMORY) += unaccepted_memory.o bitmap.o find.o
> >
> > This will link against the correct shifting libraries.
>
> 1) This seems wrong for riscv64 which can have CONFIG_EFI_ZBOOT=y as
> well but doesn't need these 64-on-32 quirks.
>
> 2) IIUC EFI stub executes just once before the kernel is booting, so it
> doesn't seem too critical to link arch-specific (optimized) things
> against it.
>
> So I'm voting for something like:
>
> diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
> index 29e0729299f5..55fb5a20aa25 100644
> --- a/drivers/firmware/efi/Kconfig
> +++ b/drivers/firmware/efi/Kconfig
> @@ -85,6 +85,10 @@ config EFI_ZBOOT
> provided that the loader implements the decompression algorithm.
> (The compression algorithm used is described in the zboot header)
>
> +config EFI_ZBOOT_EXTRAS
> + bool
> + default y if RISCV && 32BIT
> +
> config EFI_ARMSTUB_DTB_LOADER
> bool "Enable the DTB loader"
> depends on EFI_GENERIC_STUB && !RISCV && !LOONGARCH
> diff --git a/drivers/firmware/efi/libstub/Makefile
> b/drivers/firmware/efi/libstub/Makefile
> index f83301a19dc5..8f199b99d0f6 100644
> --- a/drivers/firmware/efi/libstub/Makefile
> +++ b/drivers/firmware/efi/libstub/Makefile
> @@ -96,7 +96,8 @@ CFLAGS_zboot-decompress-gzip.o += -
> I$(srctree)/lib/zlib_inflate
> zboot-obj-$(CONFIG_KERNEL_ZSTD) := zboot-decompress-zstd.o lib-
> xxhash.o
> CFLAGS_zboot-decompress-zstd.o += -I$(srctree)/lib/zstd
>
> -zboot-obj-$(CONFIG_RISCV) += lib-clz_ctz.o lib-ashldi3.o lib-lshrdi3.o
> +zboot-obj-extras-$(CONFIG_EFI_ZBOOT_EXTRAS) += lib-ashldi3.o lib-lshrdi3.o
> +zboot-obj-$(CONFIG_RISCV) += lib-clz_ctz.o $(zboot-obj-extras-y)
> lib-$(CONFIG_EFI_ZBOOT) += zboot.o $(zboot-obj-y)
>
> lib-$(CONFIG_UNACCEPTED_MEMORY) += unaccepted_memory.o bitmap.o find.o
>
> Kindly ask you to test this. And it will be even more helpful if you can test
> building an running riscv64 as well :-).
I agree with this solution. With this patch applied, I have tested
EFI booting on riscv32 and riscv64. Thanks for putting this together.
You can add my tags assuming this patch is applied in the next
version.
Tested-by: Charlie Jenkins <thecharlesjenkins at gmail.com>
Reviewed-by: Charlie Jenkins <thecharlesjenkins at gmail.com>
>
> Dmitry
More information about the linux-riscv
mailing list