* [PATCH 0/2] RISC-V: implement private GCC library
@ 2025-12-01 17:47 Heinrich Schuchardt
2025-12-01 17:47 ` [PATCH 1/2] " Heinrich Schuchardt
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Heinrich Schuchardt @ 2025-12-01 17:47 UTC (permalink / raw)
To: Rick Chen, Leo
Cc: Yao Zi, E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot,
Heinrich Schuchardt
We currently include libgcc.a when building for the RISC-V architecture.
For instance lib/mbedtls/external/mbedtls/library/bignum.c uses __ctzdi2().
At least the Ubuntu Linux distribution has switched to building libgcc.a
for the RVA23S64 profile. Using this library on RVA20 systems results in
crashes. We therefore need a private replacement library.
With the series a private GCC library and unit tests are provided for
64-bit RISC-V. This is enough to build for CONFIG_WGET_HTTPS as suggested
in E's patch
[PATCH] configs: starfive: enable wget https
https://lore.kernel.org/u-boot/20251112005451.41285-1-e@freeshell.de/
Heinrich Schuchardt (2):
RISC-V: implement private GCC library
test: provide unit tests for the RISC-V private GCC library
arch/Kconfig | 1 +
arch/riscv/lib/Makefile | 2 +
arch/riscv/lib/clz.c | 105 ++++++++++++++++++++++++++++++++++++++++
arch/riscv/lib/ctz.c | 97 +++++++++++++++++++++++++++++++++++++
lib/Kconfig | 2 +-
test/lib/Makefile | 4 ++
test/lib/test_clz.c | 53 ++++++++++++++++++++
test/lib/test_ctz.c | 53 ++++++++++++++++++++
8 files changed, 316 insertions(+), 1 deletion(-)
create mode 100644 arch/riscv/lib/clz.c
create mode 100644 arch/riscv/lib/ctz.c
create mode 100644 test/lib/test_clz.c
create mode 100644 test/lib/test_ctz.c
--
2.51.0
^ permalink raw reply [flat|nested] 13+ messages in thread* [PATCH 1/2] RISC-V: implement private GCC library 2025-12-01 17:47 [PATCH 0/2] RISC-V: implement private GCC library Heinrich Schuchardt @ 2025-12-01 17:47 ` Heinrich Schuchardt 2025-12-04 11:53 ` Leo Liang 2025-12-04 11:54 ` Leo Liang 2025-12-01 17:47 ` [PATCH 2/2] test: provide unit tests for the RISC-V " Heinrich Schuchardt 2025-12-02 12:25 ` [PATCH 0/2] RISC-V: implement " Mark Kettenis 2 siblings, 2 replies; 13+ messages in thread From: Heinrich Schuchardt @ 2025-12-01 17:47 UTC (permalink / raw) To: Rick Chen, Leo Cc: Yao Zi, E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Heinrich Schuchardt, Heinrich Schuchardt From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> The following functions are provided: Count leading zero bits * int __clzsi2 (unsigned int a) * int __clzdi2 (unsigned long a) * int __clzti2 (unsigned long long a) Count trailing zero bits * int __ctzsi2 (unsigned int a) * int __ctzdi2 (unsigned long a) * int __ctzti2 (unsigned long long a) Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Signed-off-by: Heinrich Schuchardt <zfsdt@canonical.com> --- arch/Kconfig | 1 + arch/riscv/lib/Makefile | 2 + arch/riscv/lib/clz.c | 105 ++++++++++++++++++++++++++++++++++++++++ arch/riscv/lib/ctz.c | 95 ++++++++++++++++++++++++++++++++++++ lib/Kconfig | 2 +- 5 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 arch/riscv/lib/clz.c create mode 100644 arch/riscv/lib/ctz.c diff --git a/arch/Kconfig b/arch/Kconfig index 3133f892f94..4af0da2485f 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -159,6 +159,7 @@ config PPC config RISCV bool "RISC-V architecture" select CREATE_ARCH_SYMLINK + select HAVE_PRIVATE_LIBGCC if 64BIT select HAVE_SETJMP select HAVE_INITJMP select SUPPORT_ACPI diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index f1f50918eff..a527b3e9ae3 100644 --- a/arch/riscv/lib/Makefile +++ b/arch/riscv/lib/Makefile @@ -6,6 +6,8 @@ # Copyright (C) 2017 Andes Technology Corporation # Rick Chen, Andes Technology Corporation <rick@andestech.com> +lib-$(CONFIG_USE_PRIVATE_LIBGCC) += clz.o ctz.o + obj-$(CONFIG_$(PHASE_)LIB_BOOTM) += bootm.o obj-$(CONFIG_$(PHASE_)LIB_BOOTI) += image.o obj-$(CONFIG_CMD_GO) += boot.o diff --git a/arch/riscv/lib/clz.c b/arch/riscv/lib/clz.c new file mode 100644 index 00000000000..7b173d3c858 --- /dev/null +++ b/arch/riscv/lib/clz.c @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * libgcc replacement - count leading bits + * + * Copyright 2025, Heinrich Schuchardt <heinrich.schuchardt@canonical.com> + */ + +#include <linux/types.h> + +/** + * __clzti2() - count number of leading zero bits + * + * @x: number to check + * Return: number of leading zero bits + */ +int __clzti2(long long x) +{ + int ret = 64; + + if (!x) + return 64; + + if (x & 0xFFFFFFFF00000000LL) { + ret -= 32; + x >>= 32; + } + if (x & 0xFFFF0000LL) { + ret -= 16; + x >>= 16; + } + if (x & 0xFF00LL) { + ret -= 8; + x >>= 8; + } + if (x & 0xF0LL) { + ret -= 4; + x >>= 4; + } + if (x & 0xCLL) { + ret -= 2; + x >>= 2; + } + if (x & 0x2LL) { + ret -= 1; + x >>= 1; + } + if (x) + ret -= 1; + + return ret; +} + +/** + * __clzsi2() - count number of leading zero bits + * + * @x: number to check + * Return: number of leading zero bits + */ +int __clzsi2(int x) +{ + int ret = 32; + + if (!x) + return 32; + + if (x & 0xFFFF0000) { + ret -= 16; + x >>= 16; + } + if (x & 0xFF00) { + ret -= 8; + x >>= 8; + } + if (x & 0xF0) { + ret -= 4; + x >>= 4; + } + if (x & 0xC) { + ret -= 2; + x >>= 2; + } + if (x & 0x2) { + ret -= 1; + x >>= 1; + } + if (x) + ret -= 1; + + return ret; +} + +/** + * __clzdi2() - count number of leading zero bits + * + * @x: number to check + * Return: number of leading zero bits + */ +int __clzdi2(long x) +{ +#if BITS_PER_LONG == 64 + return __clzti2(x); +#else + return __clzsi2(x); +#endif +} diff --git a/arch/riscv/lib/ctz.c b/arch/riscv/lib/ctz.c new file mode 100644 index 00000000000..6c875e39f0e --- /dev/null +++ b/arch/riscv/lib/ctz.c @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * libgcc replacement - count trailing bits + */ + +#include <linux/types.h> + +/** + * __ctzti2() - count number of trailing zero bits + * + * @x: number to check + * Return: number of trailing zero bits + */ +int __ctzti2(long long x) +{ + int ret = 0; + + if (!x) + return 64; + + if (!(x & 0xFFFFFFFFLL)) { + ret += 32; + x >>= 32; + } + if (!(x & 0xFFFFLL)) { + ret += 16; + x >>= 16; + } + if (!(x & 0xFFLL)) { + ret += 8; + x >>= 8; + } + if (!(x & 0xFLL)) { + ret += 4; + x >>= 4; + } + if (!(x & 0x3LL)) { + ret += 2; + x >>= 2; + } + if (!(x & 0x1ll)) + ret += 1; + + return ret; +} + +/** + * __ctzsi2() - count number of trailing zero bits + * + * @x: number to check + * Return: number of trailing zero bits + */ +int __ctzsi2(int x) +{ + int ret = 0; + + if (!x) + return 32; + + if (!(x & 0xFFFF)) { + ret += 16; + x >>= 16; + } + if (!(x & 0xFF)) { + ret += 8; + x >>= 8; + } + if (!(x & 0xF)) { + ret += 4; + x >>= 4; + } + if (!(x & 0x3)) { + ret += 2; + x >>= 2; + } + if (!(x & 0x1)) + ret += 1; + + return ret; +} + +/** + * __ctzdi2() - count number of trailing zero bits + * + * @x: number to check + * Return: number of trailing zero bits + */ +int __ctzdi2(long x) +{ +#if BITS_PER_LONG == 64 + return __ctzti2(x); +#else + return __ctzsi2(x); +#endif +} diff --git a/lib/Kconfig b/lib/Kconfig index f5c1731f456..7b390608b33 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -212,7 +212,7 @@ config IMAGE_SPARSE_FILLBUF_SIZE config USE_PRIVATE_LIBGCC bool "Use private libgcc" depends on HAVE_PRIVATE_LIBGCC - default y if HAVE_PRIVATE_LIBGCC && ((ARM && !ARM64) || MIPS) + default y if HAVE_PRIVATE_LIBGCC && ((ARM && !ARM64) || MIPS || RISCV) help This option allows you to use the built-in libgcc implementation of U-Boot instead of the one provided by the compiler. -- 2.51.0 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] RISC-V: implement private GCC library 2025-12-01 17:47 ` [PATCH 1/2] " Heinrich Schuchardt @ 2025-12-04 11:53 ` Leo Liang 2025-12-04 11:54 ` Leo Liang 1 sibling, 0 replies; 13+ messages in thread From: Leo Liang @ 2025-12-04 11:53 UTC (permalink / raw) To: Heinrich Schuchardt Cc: Rick Chen, Yao Zi, E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Heinrich Schuchardt On Mon, Dec 01, 2025 at 06:47:04PM +0100, Heinrich Schuchardt wrote: > [EXTERNAL MAIL] > > From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> > > The following functions are provided: > > Count leading zero bits > > * int __clzsi2 (unsigned int a) > * int __clzdi2 (unsigned long a) > * int __clzti2 (unsigned long long a) > > Count trailing zero bits > > * int __ctzsi2 (unsigned int a) > * int __ctzdi2 (unsigned long a) > * int __ctzti2 (unsigned long long a) > > Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> > Signed-off-by: Heinrich Schuchardt <zfsdt@canonical.com> > --- > arch/Kconfig | 1 + > arch/riscv/lib/Makefile | 2 + > arch/riscv/lib/clz.c | 105 ++++++++++++++++++++++++++++++++++++++++ > arch/riscv/lib/ctz.c | 95 ++++++++++++++++++++++++++++++++++++ > lib/Kconfig | 2 +- > 5 files changed, 204 insertions(+), 1 deletion(-) > create mode 100644 arch/riscv/lib/clz.c > create mode 100644 arch/riscv/lib/ctz.c Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com> ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] RISC-V: implement private GCC library 2025-12-01 17:47 ` [PATCH 1/2] " Heinrich Schuchardt 2025-12-04 11:53 ` Leo Liang @ 2025-12-04 11:54 ` Leo Liang 1 sibling, 0 replies; 13+ messages in thread From: Leo Liang @ 2025-12-04 11:54 UTC (permalink / raw) To: Heinrich Schuchardt Cc: Rick Chen, Yao Zi, E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Heinrich Schuchardt On Mon, Dec 01, 2025 at 06:47:04PM +0100, Heinrich Schuchardt wrote: > [EXTERNAL MAIL] > > From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> > > The following functions are provided: > > Count leading zero bits > > * int __clzsi2 (unsigned int a) > * int __clzdi2 (unsigned long a) > * int __clzti2 (unsigned long long a) > > Count trailing zero bits > > * int __ctzsi2 (unsigned int a) > * int __ctzdi2 (unsigned long a) > * int __ctzti2 (unsigned long long a) > > Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> > Signed-off-by: Heinrich Schuchardt <zfsdt@canonical.com> > --- > arch/Kconfig | 1 + > arch/riscv/lib/Makefile | 2 + > arch/riscv/lib/clz.c | 105 ++++++++++++++++++++++++++++++++++++++++ > arch/riscv/lib/ctz.c | 95 ++++++++++++++++++++++++++++++++++++ > lib/Kconfig | 2 +- > 5 files changed, 204 insertions(+), 1 deletion(-) > create mode 100644 arch/riscv/lib/clz.c > create mode 100644 arch/riscv/lib/ctz.c Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com> ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/2] test: provide unit tests for the RISC-V private GCC library 2025-12-01 17:47 [PATCH 0/2] RISC-V: implement private GCC library Heinrich Schuchardt 2025-12-01 17:47 ` [PATCH 1/2] " Heinrich Schuchardt @ 2025-12-01 17:47 ` Heinrich Schuchardt 2025-12-02 12:25 ` [PATCH 0/2] RISC-V: implement " Mark Kettenis 2 siblings, 0 replies; 13+ messages in thread From: Heinrich Schuchardt @ 2025-12-01 17:47 UTC (permalink / raw) To: Rick Chen, Leo Cc: Yao Zi, E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Heinrich Schuchardt, Heinrich Schuchardt From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Add unit tests for the functions for counting leading and trailing zero bits. Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> Signed-off-by: Heinrich Schuchardt <zfsdt@canonical.com> --- test/lib/Makefile | 4 ++++ test/lib/test_clz.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ test/lib/test_ctz.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 test/lib/test_clz.c create mode 100644 test/lib/test_ctz.c diff --git a/test/lib/Makefile b/test/lib/Makefile index 35b40b584c4..7c9dc180c8d 100644 --- a/test/lib/Makefile +++ b/test/lib/Makefile @@ -10,6 +10,10 @@ obj-y += abuf.o obj-y += alist.o obj-$(CONFIG_EFI_LOADER) += efi_device_path.o efi_memory.o obj-$(CONFIG_EFI_SECURE_BOOT) += efi_image_region.o +ifdef CONFIG_RISCV +obj-$(CONFIG_USE_PRIVATE_LIBGCC) += test_clz.o +obj-$(CONFIG_USE_PRIVATE_LIBGCC) += test_ctz.o +endif obj-y += hexdump.o obj-$(CONFIG_SANDBOX) += kconfig.o obj-y += lmb.o diff --git a/test/lib/test_clz.c b/test/lib/test_clz.c new file mode 100644 index 00000000000..11fd527d063 --- /dev/null +++ b/test/lib/test_clz.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright 2025, Heinrich Schuchardt <heinrich.schuchardt@canonical.com> + */ + +#include <test/lib.h> +#include <test/test.h> +#include <test/ut.h> + +int __clzsi2(int a); +int __clzdi2(long a); +int __clzti2(long long a); + +/** + * test_clz() - test library functions to count leading zero bits + * + * @uts: unit test state + */ +static int test_clz(struct unit_test_state *uts) +{ + ut_asserteq(0, __clzti2(0xffffffffffffffffLL)); + ut_asserteq(0, __clzti2(0x8000000000000000LL)); + ut_asserteq(1, __clzti2(0x4000000000000000LL)); + ut_asserteq(17, __clzti2(0x0000500000a00000LL)); + ut_asserteq(62, __clzti2(0x0000000000000002LL)); + ut_asserteq(63, __clzti2(0x0000000000000001LL)); + +#if BITS_PER_LONG == 64 + ut_asserteq(0, __clzdi2(0xffffffffffffffffLL)); + ut_asserteq(0, __clzti2(0x8000000000000000LL)); + ut_asserteq(1, __clzti2(0x4000000000000000LL)); + ut_asserteq(17, __clzdi2(0x0000500000a00000LL)); + ut_asserteq(62, __clzdi2(0x0000000000000002LL)); + ut_asserteq(63, __clzdi2(0x0000000000000001LL)); +#else + ut_asserteq(0, __clzdi2(0xffffffff)); + ut_asserteq(0, __clzdi2(0x80000000)); + ut_asserteq(1, __clzdi2(0x40000000)); + ut_asserteq(9, __clzdi2(0x0050a000)); + ut_asserteq(30, __clzdi2(0x00000002)); + ut_asserteq(31, __clzdi2(0x00000001)); +#endif + + ut_asserteq(0, __clzsi2(0xffffffff)); + ut_asserteq(0, __clzsi2(0x80000000)); + ut_asserteq(1, __clzsi2(0x40000000)); + ut_asserteq(9, __clzsi2(0x0050a000)); + ut_asserteq(30, __clzsi2(0x00000002)); + ut_asserteq(31, __clzsi2(0x00000001)); + + return 0; +} +LIB_TEST(test_clz, 0); diff --git a/test/lib/test_ctz.c b/test/lib/test_ctz.c new file mode 100644 index 00000000000..96c08202dc2 --- /dev/null +++ b/test/lib/test_ctz.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright 2025, Heinrich Schuchardt <heinrich.schuchardt@canonical.com> + */ + +#include <test/lib.h> +#include <test/test.h> +#include <test/ut.h> + +int __ctzsi2(int a); +int __ctzdi2(long a); +int __ctzti2(long long a); + +/** + * test_ctz() - test library functions to count trailing zero bits + * + * @uts: unit test state + */ +static int test_ctz(struct unit_test_state *uts) +{ + ut_asserteq(0, __ctzti2(0xffffffffffffffffLL)); + ut_asserteq(63, __ctzti2(0x8000000000000000LL)); + ut_asserteq(62, __ctzti2(0x4000000000000000LL)); + ut_asserteq(21, __ctzti2(0x0000500000a00000LL)); + ut_asserteq(1, __ctzti2(0x0000000000000002LL)); + ut_asserteq(0, __ctzti2(0x0000000000000001LL)); + +#if BITS_PER_LONG == 64 + ut_asserteq(0, __ctzdi2(0xffffffffffffffffLL)); + ut_asserteq(63, __ctzdi2(0x8000000000000000LL)); + ut_asserteq(62, __ctzdi2(0x4000000000000000LL)); + ut_asserteq(21, __ctzdi2(0x0000500000a00000LL)); + ut_asserteq(1, __ctzdi2(0x0000000000000002LL)); + ut_asserteq(0, __ctzdi2(0x0000000000000001LL)); +#else + ut_asserteq(0, __ctzdi2(0xffffffff)); + ut_asserteq(31, __ctzdi2(0x80000000)); + ut_asserteq(30, __ctzdi2(0x40000000)); + ut_asserteq(13, __ctzdi2(0x0050a000)); + ut_asserteq(1, __ctzdi2(0x00000002)); + ut_asserteq(0, __ctzdi2(0x00000001)); +#endif + + ut_asserteq(0, __ctzsi2(0xffffffff)); + ut_asserteq(31, __ctzsi2(0x80000000)); + ut_asserteq(30, __ctzsi2(0x40000000)); + ut_asserteq(13, __ctzsi2(0x0050a000)); + ut_asserteq(1, __ctzsi2(0x00000002)); + ut_asserteq(0, __ctzsi2(0x00000001)); + + return 0; +} +LIB_TEST(test_ctz, 0); -- 2.51.0 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 0/2] RISC-V: implement private GCC library 2025-12-01 17:47 [PATCH 0/2] RISC-V: implement private GCC library Heinrich Schuchardt 2025-12-01 17:47 ` [PATCH 1/2] " Heinrich Schuchardt 2025-12-01 17:47 ` [PATCH 2/2] test: provide unit tests for the RISC-V " Heinrich Schuchardt @ 2025-12-02 12:25 ` Mark Kettenis 2 siblings, 0 replies; 13+ messages in thread From: Mark Kettenis @ 2025-12-02 12:25 UTC (permalink / raw) To: Heinrich Schuchardt Cc: rick, ycliang, ziyao, e, hal.feng, mchitale, minda.chen, u-boot, zfsdt > From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> > Date: Mon, 1 Dec 2025 18:47:03 +0100 > > We currently include libgcc.a when building for the RISC-V architecture. > For instance lib/mbedtls/external/mbedtls/library/bignum.c uses __ctzdi2(). > > At least the Ubuntu Linux distribution has switched to building libgcc.a > for the RVA23S64 profile. Using this library on RVA20 systems results in > crashes. We therefore need a private replacement library. Sound like the real problem here is using a native toolchain instead of a toolchain for the target at hand. That said, the solution a sensible one. > With the series a private GCC library and unit tests are provided for > 64-bit RISC-V. This is enough to build for CONFIG_WGET_HTTPS as suggested > in E's patch > > [PATCH] configs: starfive: enable wget https > https://lore.kernel.org/u-boot/20251112005451.41285-1-e@freeshell.de/ > > Heinrich Schuchardt (2): > RISC-V: implement private GCC library > test: provide unit tests for the RISC-V private GCC library > > arch/Kconfig | 1 + > arch/riscv/lib/Makefile | 2 + > arch/riscv/lib/clz.c | 105 ++++++++++++++++++++++++++++++++++++++++ > arch/riscv/lib/ctz.c | 97 +++++++++++++++++++++++++++++++++++++ > lib/Kconfig | 2 +- > test/lib/Makefile | 4 ++ > test/lib/test_clz.c | 53 ++++++++++++++++++++ > test/lib/test_ctz.c | 53 ++++++++++++++++++++ > 8 files changed, 316 insertions(+), 1 deletion(-) > create mode 100644 arch/riscv/lib/clz.c > create mode 100644 arch/riscv/lib/ctz.c > create mode 100644 test/lib/test_clz.c > create mode 100644 test/lib/test_ctz.c > > -- > 2.51.0 > > ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 0/2] RISC-V: implement private GCC library @ 2025-12-01 17:49 Heinrich Schuchardt 2025-12-01 17:49 ` [PATCH 1/2] " Heinrich Schuchardt 0 siblings, 1 reply; 13+ messages in thread From: Heinrich Schuchardt @ 2025-12-01 17:49 UTC (permalink / raw) To: Rick Chen, Leo Cc: Yao Zi, E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Heinrich Schuchardt We currently include libgcc.a when building for the RISC-V architecture. For instance lib/mbedtls/external/mbedtls/library/bignum.c uses __ctzdi2(). At least the Ubuntu Linux distribution has switched to building libgcc.a for the RVA23S64 profile. Using this library on RVA20 systems results in crashes. We therefore need a private replacement library. With the series a private GCC library and unit tests are provided for 64-bit RISC-V. This is enough to build for CONFIG_WGET_HTTPS as suggested in E's patch [PATCH] configs: starfive: enable wget https https://lore.kernel.org/u-boot/20251112005451.41285-1-e@freeshell.de/ Heinrich Schuchardt (2): RISC-V: implement private GCC library test: provide unit tests for the RISC-V private GCC library arch/Kconfig | 1 + arch/riscv/lib/Makefile | 2 + arch/riscv/lib/clz.c | 105 ++++++++++++++++++++++++++++++++++++++++ arch/riscv/lib/ctz.c | 97 +++++++++++++++++++++++++++++++++++++ lib/Kconfig | 2 +- test/lib/Makefile | 4 ++ test/lib/test_clz.c | 53 ++++++++++++++++++++ test/lib/test_ctz.c | 53 ++++++++++++++++++++ 8 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 arch/riscv/lib/clz.c create mode 100644 arch/riscv/lib/ctz.c create mode 100644 test/lib/test_clz.c create mode 100644 test/lib/test_ctz.c -- 2.51.0 ^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/2] RISC-V: implement private GCC library 2025-12-01 17:49 Heinrich Schuchardt @ 2025-12-01 17:49 ` Heinrich Schuchardt 2025-12-02 3:57 ` Yao Zi 0 siblings, 1 reply; 13+ messages in thread From: Heinrich Schuchardt @ 2025-12-01 17:49 UTC (permalink / raw) To: Rick Chen, Leo Cc: Yao Zi, E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Heinrich Schuchardt The following functions are provided: Count leading zero bits * int __clzsi2 (unsigned int a) * int __clzdi2 (unsigned long a) * int __clzti2 (unsigned long long a) Count trailing zero bits * int __ctzsi2 (unsigned int a) * int __ctzdi2 (unsigned long a) * int __ctzti2 (unsigned long long a) Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> --- arch/Kconfig | 1 + arch/riscv/lib/Makefile | 2 + arch/riscv/lib/clz.c | 105 ++++++++++++++++++++++++++++++++++++++++ arch/riscv/lib/ctz.c | 95 ++++++++++++++++++++++++++++++++++++ lib/Kconfig | 2 +- 5 files changed, 204 insertions(+), 1 deletion(-) create mode 100644 arch/riscv/lib/clz.c create mode 100644 arch/riscv/lib/ctz.c diff --git a/arch/Kconfig b/arch/Kconfig index 3133f892f94..4af0da2485f 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -159,6 +159,7 @@ config PPC config RISCV bool "RISC-V architecture" select CREATE_ARCH_SYMLINK + select HAVE_PRIVATE_LIBGCC if 64BIT select HAVE_SETJMP select HAVE_INITJMP select SUPPORT_ACPI diff --git a/arch/riscv/lib/Makefile b/arch/riscv/lib/Makefile index f1f50918eff..a527b3e9ae3 100644 --- a/arch/riscv/lib/Makefile +++ b/arch/riscv/lib/Makefile @@ -6,6 +6,8 @@ # Copyright (C) 2017 Andes Technology Corporation # Rick Chen, Andes Technology Corporation <rick@andestech.com> +lib-$(CONFIG_USE_PRIVATE_LIBGCC) += clz.o ctz.o + obj-$(CONFIG_$(PHASE_)LIB_BOOTM) += bootm.o obj-$(CONFIG_$(PHASE_)LIB_BOOTI) += image.o obj-$(CONFIG_CMD_GO) += boot.o diff --git a/arch/riscv/lib/clz.c b/arch/riscv/lib/clz.c new file mode 100644 index 00000000000..7b173d3c858 --- /dev/null +++ b/arch/riscv/lib/clz.c @@ -0,0 +1,105 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * libgcc replacement - count leading bits + * + * Copyright 2025, Heinrich Schuchardt <heinrich.schuchardt@canonical.com> + */ + +#include <linux/types.h> + +/** + * __clzti2() - count number of leading zero bits + * + * @x: number to check + * Return: number of leading zero bits + */ +int __clzti2(long long x) +{ + int ret = 64; + + if (!x) + return 64; + + if (x & 0xFFFFFFFF00000000LL) { + ret -= 32; + x >>= 32; + } + if (x & 0xFFFF0000LL) { + ret -= 16; + x >>= 16; + } + if (x & 0xFF00LL) { + ret -= 8; + x >>= 8; + } + if (x & 0xF0LL) { + ret -= 4; + x >>= 4; + } + if (x & 0xCLL) { + ret -= 2; + x >>= 2; + } + if (x & 0x2LL) { + ret -= 1; + x >>= 1; + } + if (x) + ret -= 1; + + return ret; +} + +/** + * __clzsi2() - count number of leading zero bits + * + * @x: number to check + * Return: number of leading zero bits + */ +int __clzsi2(int x) +{ + int ret = 32; + + if (!x) + return 32; + + if (x & 0xFFFF0000) { + ret -= 16; + x >>= 16; + } + if (x & 0xFF00) { + ret -= 8; + x >>= 8; + } + if (x & 0xF0) { + ret -= 4; + x >>= 4; + } + if (x & 0xC) { + ret -= 2; + x >>= 2; + } + if (x & 0x2) { + ret -= 1; + x >>= 1; + } + if (x) + ret -= 1; + + return ret; +} + +/** + * __clzdi2() - count number of leading zero bits + * + * @x: number to check + * Return: number of leading zero bits + */ +int __clzdi2(long x) +{ +#if BITS_PER_LONG == 64 + return __clzti2(x); +#else + return __clzsi2(x); +#endif +} diff --git a/arch/riscv/lib/ctz.c b/arch/riscv/lib/ctz.c new file mode 100644 index 00000000000..6c875e39f0e --- /dev/null +++ b/arch/riscv/lib/ctz.c @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * libgcc replacement - count trailing bits + */ + +#include <linux/types.h> + +/** + * __ctzti2() - count number of trailing zero bits + * + * @x: number to check + * Return: number of trailing zero bits + */ +int __ctzti2(long long x) +{ + int ret = 0; + + if (!x) + return 64; + + if (!(x & 0xFFFFFFFFLL)) { + ret += 32; + x >>= 32; + } + if (!(x & 0xFFFFLL)) { + ret += 16; + x >>= 16; + } + if (!(x & 0xFFLL)) { + ret += 8; + x >>= 8; + } + if (!(x & 0xFLL)) { + ret += 4; + x >>= 4; + } + if (!(x & 0x3LL)) { + ret += 2; + x >>= 2; + } + if (!(x & 0x1ll)) + ret += 1; + + return ret; +} + +/** + * __ctzsi2() - count number of trailing zero bits + * + * @x: number to check + * Return: number of trailing zero bits + */ +int __ctzsi2(int x) +{ + int ret = 0; + + if (!x) + return 32; + + if (!(x & 0xFFFF)) { + ret += 16; + x >>= 16; + } + if (!(x & 0xFF)) { + ret += 8; + x >>= 8; + } + if (!(x & 0xF)) { + ret += 4; + x >>= 4; + } + if (!(x & 0x3)) { + ret += 2; + x >>= 2; + } + if (!(x & 0x1)) + ret += 1; + + return ret; +} + +/** + * __ctzdi2() - count number of trailing zero bits + * + * @x: number to check + * Return: number of trailing zero bits + */ +int __ctzdi2(long x) +{ +#if BITS_PER_LONG == 64 + return __ctzti2(x); +#else + return __ctzsi2(x); +#endif +} diff --git a/lib/Kconfig b/lib/Kconfig index f5c1731f456..7b390608b33 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -212,7 +212,7 @@ config IMAGE_SPARSE_FILLBUF_SIZE config USE_PRIVATE_LIBGCC bool "Use private libgcc" depends on HAVE_PRIVATE_LIBGCC - default y if HAVE_PRIVATE_LIBGCC && ((ARM && !ARM64) || MIPS) + default y if HAVE_PRIVATE_LIBGCC && ((ARM && !ARM64) || MIPS || RISCV) help This option allows you to use the built-in libgcc implementation of U-Boot instead of the one provided by the compiler. -- 2.51.0 ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] RISC-V: implement private GCC library 2025-12-01 17:49 ` [PATCH 1/2] " Heinrich Schuchardt @ 2025-12-02 3:57 ` Yao Zi 2025-12-02 4:59 ` Heinrich Schuchardt 2025-12-02 5:28 ` Icenowy Zheng 0 siblings, 2 replies; 13+ messages in thread From: Yao Zi @ 2025-12-02 3:57 UTC (permalink / raw) To: Heinrich Schuchardt, Rick Chen, Leo Cc: E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot On Mon, Dec 01, 2025 at 06:49:03PM +0100, Heinrich Schuchardt wrote: > The following functions are provided: > > Count leading zero bits > > * int __clzsi2 (unsigned int a) > * int __clzdi2 (unsigned long a) > * int __clzti2 (unsigned long long a) > > Count trailing zero bits > > * int __ctzsi2 (unsigned int a) > * int __ctzdi2 (unsigned long a) > * int __ctzti2 (unsigned long long a) > > Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> > --- I noted there's another series with the same subject[1] sent almost at the same time, and I couldn't tell the difference at the first glance. Is this an incident? > arch/Kconfig | 1 + > arch/riscv/lib/Makefile | 2 + > arch/riscv/lib/clz.c | 105 ++++++++++++++++++++++++++++++++++++++++ > arch/riscv/lib/ctz.c | 95 ++++++++++++++++++++++++++++++++++++ > lib/Kconfig | 2 +- > 5 files changed, 204 insertions(+), 1 deletion(-) > create mode 100644 arch/riscv/lib/clz.c > create mode 100644 arch/riscv/lib/ctz.c > > diff --git a/arch/Kconfig b/arch/Kconfig > index 3133f892f94..4af0da2485f 100644 > --- a/arch/Kconfig > +++ b/arch/Kconfig > @@ -159,6 +159,7 @@ config PPC > config RISCV > bool "RISC-V architecture" > select CREATE_ARCH_SYMLINK > + select HAVE_PRIVATE_LIBGCC if 64BIT Are 32-bit platforms excluded for lacking of enough library functions? Should we exclude !RISCV_ISA_F || !RISCV_ISA_D platforms as well? Though there's no in-tree 64-bit port without F/D extension. > select HAVE_SETJMP > select HAVE_INITJMP > select SUPPORT_ACPI Regards, Yao Zi [1]: https://lore.kernel.org/u-boot/20251201174705.652626-1-zfsdt@canonical.com/ ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] RISC-V: implement private GCC library 2025-12-02 3:57 ` Yao Zi @ 2025-12-02 4:59 ` Heinrich Schuchardt 2025-12-02 5:28 ` Icenowy Zheng 1 sibling, 0 replies; 13+ messages in thread From: Heinrich Schuchardt @ 2025-12-02 4:59 UTC (permalink / raw) To: Yao Zi Cc: E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Rick Chen, Leo On 12/2/25 04:57, Yao Zi wrote: > On Mon, Dec 01, 2025 at 06:49:03PM +0100, Heinrich Schuchardt wrote: >> The following functions are provided: >> >> Count leading zero bits >> >> * int __clzsi2 (unsigned int a) >> * int __clzdi2 (unsigned long a) >> * int __clzti2 (unsigned long long a) >> >> Count trailing zero bits >> >> * int __ctzsi2 (unsigned int a) >> * int __ctzdi2 (unsigned long a) >> * int __ctzti2 (unsigned long long a) >> >> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt@canonical.com> >> --- > > I noted there's another series with the same subject[1] sent almost at > the same time, and I couldn't tell the difference at the first glance. > Is this an incident? Thank you for reviewing. That was my mistake. I have set the first mail series [1] to superseded in Patchwork. > >> arch/Kconfig | 1 + >> arch/riscv/lib/Makefile | 2 + >> arch/riscv/lib/clz.c | 105 ++++++++++++++++++++++++++++++++++++++++ >> arch/riscv/lib/ctz.c | 95 ++++++++++++++++++++++++++++++++++++ >> lib/Kconfig | 2 +- >> 5 files changed, 204 insertions(+), 1 deletion(-) >> create mode 100644 arch/riscv/lib/clz.c >> create mode 100644 arch/riscv/lib/ctz.c >> >> diff --git a/arch/Kconfig b/arch/Kconfig >> index 3133f892f94..4af0da2485f 100644 >> --- a/arch/Kconfig >> +++ b/arch/Kconfig >> @@ -159,6 +159,7 @@ config PPC >> config RISCV >> bool "RISC-V architecture" >> select CREATE_ARCH_SYMLINK >> + select HAVE_PRIVATE_LIBGCC if 64BIT > > Are 32-bit platforms excluded for lacking of enough library functions? > Should we exclude !RISCV_ISA_F || !RISCV_ISA_D platforms as well? Though > there's no in-tree 64-bit port without F/D extension. As I am not aware of any RVA23 distro for 32bit RISC-V, I see no current need. 32-bit support will require additionally implementing __ashldi3, __lshldi3, __udivdi3. If you want to implement these extra functions, you cannot trust the documentation. The functions don't take the arguments described in https://gcc.gnu.org/onlinedocs/gccint/Integer-library-routines.html. E.g __ashldi3 expects a 64 bit value passed in registers a0 (low bits), a1 (high bits) while the shift is passed in a2. 32-bit __udivdi3 expects two 64-bit values. See https://github.com/gcc-mirror/gcc/blob/addda4a7e8593c37c90eb4c1d7edda29fa4bde31/libgcc/libgcc2.c#L412 libgcc is published under GPL-3 and therefore we cannot simply copy that code into our GPL-2 project. Best regards Heinrich > >> select HAVE_SETJMP >> select HAVE_INITJMP >> select SUPPORT_ACPI > > Regards, > Yao Zi > > [1]: https://lore.kernel.org/u-boot/20251201174705.652626-1-zfsdt@canonical.com/ ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] RISC-V: implement private GCC library 2025-12-02 3:57 ` Yao Zi 2025-12-02 4:59 ` Heinrich Schuchardt @ 2025-12-02 5:28 ` Icenowy Zheng 2025-12-02 6:15 ` Heinrich Schuchardt 1 sibling, 1 reply; 13+ messages in thread From: Icenowy Zheng @ 2025-12-02 5:28 UTC (permalink / raw) To: Yao Zi, Heinrich Schuchardt, Rick Chen, Leo Cc: E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot 在 2025-12-02星期二的 03:57 +0000,Yao Zi写道: > On Mon, Dec 01, 2025 at 06:49:03PM +0100, Heinrich Schuchardt wrote: > > The following functions are provided: > > > > Count leading zero bits > > > > * int __clzsi2 (unsigned int a) > > * int __clzdi2 (unsigned long a) > > * int __clzti2 (unsigned long long a) > > > > Count trailing zero bits > > > > * int __ctzsi2 (unsigned int a) > > * int __ctzdi2 (unsigned long a) > > * int __ctzti2 (unsigned long long a) > > > > Signed-off-by: Heinrich Schuchardt > > <heinrich.schuchardt@canonical.com> > > --- > > I noted there's another series with the same subject[1] sent almost > at > the same time, and I couldn't tell the difference at the first > glance. > Is this an incident? > > > arch/Kconfig | 1 + > > arch/riscv/lib/Makefile | 2 + > > arch/riscv/lib/clz.c | 105 > > ++++++++++++++++++++++++++++++++++++++++ > > arch/riscv/lib/ctz.c | 95 ++++++++++++++++++++++++++++++++++++ > > lib/Kconfig | 2 +- > > 5 files changed, 204 insertions(+), 1 deletion(-) > > create mode 100644 arch/riscv/lib/clz.c > > create mode 100644 arch/riscv/lib/ctz.c > > > > diff --git a/arch/Kconfig b/arch/Kconfig > > index 3133f892f94..4af0da2485f 100644 > > --- a/arch/Kconfig > > +++ b/arch/Kconfig > > @@ -159,6 +159,7 @@ config PPC > > config RISCV > > bool "RISC-V architecture" > > select CREATE_ARCH_SYMLINK > > + select HAVE_PRIVATE_LIBGCC if 64BIT > > Are 32-bit platforms excluded for lacking of enough library > functions? > Should we exclude !RISCV_ISA_F || !RISCV_ISA_D platforms as well? > Though > there's no in-tree 64-bit port without F/D extension. The S7 core in U74-MC complex seems to have only IMAC, no F/D. > > > select HAVE_SETJMP > > select HAVE_INITJMP > > select SUPPORT_ACPI > > Regards, > Yao Zi > > [1]: > https://lore.kernel.org/u-boot/20251201174705.652626-1-zfsdt@canonical.com/ ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] RISC-V: implement private GCC library 2025-12-02 5:28 ` Icenowy Zheng @ 2025-12-02 6:15 ` Heinrich Schuchardt 2025-12-02 7:03 ` Icenowy Zheng 0 siblings, 1 reply; 13+ messages in thread From: Heinrich Schuchardt @ 2025-12-02 6:15 UTC (permalink / raw) To: Icenowy Zheng Cc: E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Yao Zi, Rick Chen, Leo On 12/2/25 06:28, Icenowy Zheng wrote: > 在 2025-12-02星期二的 03:57 +0000,Yao Zi写道: >> On Mon, Dec 01, 2025 at 06:49:03PM +0100, Heinrich Schuchardt wrote: >>> The following functions are provided: >>> >>> Count leading zero bits >>> >>> * int __clzsi2 (unsigned int a) >>> * int __clzdi2 (unsigned long a) >>> * int __clzti2 (unsigned long long a) >>> >>> Count trailing zero bits >>> >>> * int __ctzsi2 (unsigned int a) >>> * int __ctzdi2 (unsigned long a) >>> * int __ctzti2 (unsigned long long a) >>> >>> Signed-off-by: Heinrich Schuchardt >>> <heinrich.schuchardt@canonical.com> >>> --- >> >> I noted there's another series with the same subject[1] sent almost >> at >> the same time, and I couldn't tell the difference at the first >> glance. >> Is this an incident? >> >>> arch/Kconfig | 1 + >>> arch/riscv/lib/Makefile | 2 + >>> arch/riscv/lib/clz.c | 105 >>> ++++++++++++++++++++++++++++++++++++++++ >>> arch/riscv/lib/ctz.c | 95 ++++++++++++++++++++++++++++++++++++ >>> lib/Kconfig | 2 +- >>> 5 files changed, 204 insertions(+), 1 deletion(-) >>> create mode 100644 arch/riscv/lib/clz.c >>> create mode 100644 arch/riscv/lib/ctz.c >>> >>> diff --git a/arch/Kconfig b/arch/Kconfig >>> index 3133f892f94..4af0da2485f 100644 >>> --- a/arch/Kconfig >>> +++ b/arch/Kconfig >>> @@ -159,6 +159,7 @@ config PPC >>> config RISCV >>> bool "RISC-V architecture" >>> select CREATE_ARCH_SYMLINK >>> + select HAVE_PRIVATE_LIBGCC if 64BIT >> >> Are 32-bit platforms excluded for lacking of enough library >> functions? Yes. See https://lore.kernel.org/u-boot/20251201174904.652954-1-heinrich.schuchardt@canonical.com/T/#mbf44c9f5073649bbf2e1368ffbeaec82680a268d >> Should we exclude !RISCV_ISA_F || !RISCV_ISA_D platforms as well? >> Though libgcc.a as provided by distros assumes that you have the D and F extensions. Either a specific libgcc.a will be needed or we will have to implement the missing functions in the private lib if such platforms. It would make more sense to set CONFIG_USE_PRIVATE_LIBGCC=n for such platforms than setting CONFIG_HAVE_PRIVATE_LIBGCC=n. Which way we want to go can be decided when such platforms arrive. >> there's no in-tree 64-bit port without F/D extension. > > The S7 core in U74-MC complex seems to have only IMAC, no F/D. The S7 core is not supported by U-Boot. Best regards Heinrich > >> >>> select HAVE_SETJMP >>> select HAVE_INITJMP >>> select SUPPORT_ACPI >> >> Regards, >> Yao Zi >> >> [1]: >> https://lore.kernel.org/u-boot/20251201174705.652626-1-zfsdt@canonical.com/ > ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] RISC-V: implement private GCC library 2025-12-02 6:15 ` Heinrich Schuchardt @ 2025-12-02 7:03 ` Icenowy Zheng 2025-12-02 10:02 ` Heinrich Schuchardt 0 siblings, 1 reply; 13+ messages in thread From: Icenowy Zheng @ 2025-12-02 7:03 UTC (permalink / raw) To: Heinrich Schuchardt Cc: E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Yao Zi, Rick Chen, Leo 在 2025-12-02星期二的 07:15 +0100,Heinrich Schuchardt写道: > On 12/2/25 06:28, Icenowy Zheng wrote: > > 在 2025-12-02星期二的 03:57 +0000,Yao Zi写道: > > > On Mon, Dec 01, 2025 at 06:49:03PM +0100, Heinrich Schuchardt > > > wrote: > > > > The following functions are provided: > > > > > > > > Count leading zero bits > > > > > > > > * int __clzsi2 (unsigned int a) > > > > * int __clzdi2 (unsigned long a) > > > > * int __clzti2 (unsigned long long a) > > > > > > > > Count trailing zero bits > > > > > > > > * int __ctzsi2 (unsigned int a) > > > > * int __ctzdi2 (unsigned long a) > > > > * int __ctzti2 (unsigned long long a) > > > > > > > > Signed-off-by: Heinrich Schuchardt > > > > <heinrich.schuchardt@canonical.com> > > > > --- > > > > > > I noted there's another series with the same subject[1] sent > > > almost > > > at > > > the same time, and I couldn't tell the difference at the first > > > glance. > > > Is this an incident? > > > > > > > arch/Kconfig | 1 + > > > > arch/riscv/lib/Makefile | 2 + > > > > arch/riscv/lib/clz.c | 105 > > > > ++++++++++++++++++++++++++++++++++++++++ > > > > arch/riscv/lib/ctz.c | 95 > > > > ++++++++++++++++++++++++++++++++++++ > > > > lib/Kconfig | 2 +- > > > > 5 files changed, 204 insertions(+), 1 deletion(-) > > > > create mode 100644 arch/riscv/lib/clz.c > > > > create mode 100644 arch/riscv/lib/ctz.c > > > > > > > > diff --git a/arch/Kconfig b/arch/Kconfig > > > > index 3133f892f94..4af0da2485f 100644 > > > > --- a/arch/Kconfig > > > > +++ b/arch/Kconfig > > > > @@ -159,6 +159,7 @@ config PPC > > > > config RISCV > > > > bool "RISC-V architecture" > > > > select CREATE_ARCH_SYMLINK > > > > + select HAVE_PRIVATE_LIBGCC if 64BIT > > > > > > Are 32-bit platforms excluded for lacking of enough library > > > functions? > > Yes. See > https://lore.kernel.org/u-boot/20251201174904.652954-1-heinrich.schuchardt@canonical.com/T/#mbf44c9f5073649bbf2e1368ffbeaec82680a268d > > > > Should we exclude !RISCV_ISA_F || !RISCV_ISA_D platforms as well? > > > Though > > libgcc.a as provided by distros assumes that you have the D and F > extensions. Either a specific libgcc.a will be needed or we will have > to > implement the missing functions in the private lib if such platforms. > > It would make more sense to set CONFIG_USE_PRIVATE_LIBGCC=n for such > platforms than setting CONFIG_HAVE_PRIVATE_LIBGCC=n. > > Which way we want to go can be decided when such platforms arrive. > > > > there's no in-tree 64-bit port without F/D extension. > > > > The S7 core in U74-MC complex seems to have only IMAC, no F/D. > The S7 core is not supported by U-Boot. Well at least SPL is run on the S7 cores, although the SBI should keep the S7 core from being running main U-Boot. > > Best regards > > Heinrich > > > > > > > > > > select HAVE_SETJMP > > > > select HAVE_INITJMP > > > > select SUPPORT_ACPI > > > > > > Regards, > > > Yao Zi > > > > > > [1]: > > > https://lore.kernel.org/u-boot/20251201174705.652626-1-zfsdt@canonical.com/ > > > ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH 1/2] RISC-V: implement private GCC library 2025-12-02 7:03 ` Icenowy Zheng @ 2025-12-02 10:02 ` Heinrich Schuchardt 0 siblings, 0 replies; 13+ messages in thread From: Heinrich Schuchardt @ 2025-12-02 10:02 UTC (permalink / raw) To: Icenowy Zheng Cc: E Shattow, Hal Feng, Mayuresh Chitale, Minda Chen, u-boot, Yao Zi, Rick Chen, Leo On 12/2/25 08:03, Icenowy Zheng wrote: > 在 2025-12-02星期二的 07:15 +0100,Heinrich Schuchardt写道: >> On 12/2/25 06:28, Icenowy Zheng wrote: >>> 在 2025-12-02星期二的 03:57 +0000,Yao Zi写道: >>>> On Mon, Dec 01, 2025 at 06:49:03PM +0100, Heinrich Schuchardt >>>> wrote: >>>>> The following functions are provided: >>>>> >>>>> Count leading zero bits >>>>> >>>>> * int __clzsi2 (unsigned int a) >>>>> * int __clzdi2 (unsigned long a) >>>>> * int __clzti2 (unsigned long long a) >>>>> >>>>> Count trailing zero bits >>>>> >>>>> * int __ctzsi2 (unsigned int a) >>>>> * int __ctzdi2 (unsigned long a) >>>>> * int __ctzti2 (unsigned long long a) >>>>> >>>>> Signed-off-by: Heinrich Schuchardt >>>>> <heinrich.schuchardt@canonical.com> >>>>> --- >>>> >>>> I noted there's another series with the same subject[1] sent >>>> almost >>>> at >>>> the same time, and I couldn't tell the difference at the first >>>> glance. >>>> Is this an incident? >>>> >>>>> arch/Kconfig | 1 + >>>>> arch/riscv/lib/Makefile | 2 + >>>>> arch/riscv/lib/clz.c | 105 >>>>> ++++++++++++++++++++++++++++++++++++++++ >>>>> arch/riscv/lib/ctz.c | 95 >>>>> ++++++++++++++++++++++++++++++++++++ >>>>> lib/Kconfig | 2 +- >>>>> 5 files changed, 204 insertions(+), 1 deletion(-) >>>>> create mode 100644 arch/riscv/lib/clz.c >>>>> create mode 100644 arch/riscv/lib/ctz.c >>>>> >>>>> diff --git a/arch/Kconfig b/arch/Kconfig >>>>> index 3133f892f94..4af0da2485f 100644 >>>>> --- a/arch/Kconfig >>>>> +++ b/arch/Kconfig >>>>> @@ -159,6 +159,7 @@ config PPC >>>>> config RISCV >>>>> bool "RISC-V architecture" >>>>> select CREATE_ARCH_SYMLINK >>>>> + select HAVE_PRIVATE_LIBGCC if 64BIT >>>> >>>> Are 32-bit platforms excluded for lacking of enough library >>>> functions? >> >> Yes. See >> https://lore.kernel.org/u-boot/20251201174904.652954-1-heinrich.schuchardt@canonical.com/T/#mbf44c9f5073649bbf2e1368ffbeaec82680a268d >> >>>> Should we exclude !RISCV_ISA_F || !RISCV_ISA_D platforms as well? >>>> Though >> >> libgcc.a as provided by distros assumes that you have the D and F >> extensions. Either a specific libgcc.a will be needed or we will have >> to >> implement the missing functions in the private lib if such platforms. >> >> It would make more sense to set CONFIG_USE_PRIVATE_LIBGCC=n for such >> platforms than setting CONFIG_HAVE_PRIVATE_LIBGCC=n. >> >> Which way we want to go can be decided when such platforms arrive. >> >>>> there's no in-tree 64-bit port without F/D extension. >>> >>> The S7 core in U74-MC complex seems to have only IMAC, no F/D. >> The S7 core is not supported by U-Boot. https://starfivetech.com/uploads/u74_core_complex_manual_21G1.pdf talks of U7 and has "The U7 FPU provides full hardware support for the IEEE 754-2008 floating-point standard for 32-bit single-precision and 64-bit double-precision arithmetic." https://www.sifive.com/document-file/freedom-u740-c000-manual mentions: "The S7 RISC‑V Core supports the RV64IMAC extension string." The main user of floating point variables in U-Boot is the TrueType library. I guess without TrueType you will not be using the floating point unit > > Well at least SPL is run on the S7 cores, although the SBI should keep > the S7 core from being running main U-Boot. On the Unmatched board the HSM extension reports the S7 hart of the Unmatched board as stopped. Harts: 0: stopped 1: started 2: stopped 3: stopped 4: stopped But it seems that the SBI API does not allow to determine if a hart actually has entered OpenSBI. qemu-riscv64_smode_defconfig can be booted with -cpu rv64,zfa=off,f=off,d=off Best regards Heinrich >>> >>>> >>>>> select HAVE_SETJMP >>>>> select HAVE_INITJMP >>>>> select SUPPORT_ACPI >>>> >>>> Regards, >>>> Yao Zi >>>> >>>> [1]: >>>> https://lore.kernel.org/u-boot/20251201174705.652626-1-zfsdt@canonical.com/ >>> >> > ^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2025-12-04 11:55 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-12-01 17:47 [PATCH 0/2] RISC-V: implement private GCC library Heinrich Schuchardt 2025-12-01 17:47 ` [PATCH 1/2] " Heinrich Schuchardt 2025-12-04 11:53 ` Leo Liang 2025-12-04 11:54 ` Leo Liang 2025-12-01 17:47 ` [PATCH 2/2] test: provide unit tests for the RISC-V " Heinrich Schuchardt 2025-12-02 12:25 ` [PATCH 0/2] RISC-V: implement " Mark Kettenis -- strict thread matches above, loose matches on Subject: below -- 2025-12-01 17:49 Heinrich Schuchardt 2025-12-01 17:49 ` [PATCH 1/2] " Heinrich Schuchardt 2025-12-02 3:57 ` Yao Zi 2025-12-02 4:59 ` Heinrich Schuchardt 2025-12-02 5:28 ` Icenowy Zheng 2025-12-02 6:15 ` Heinrich Schuchardt 2025-12-02 7:03 ` Icenowy Zheng 2025-12-02 10:02 ` Heinrich Schuchardt
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.