[PATCH 2/3] lib: sbi_ecall: Generate extensions list with carray
Anup Patel
anup at brainfault.org
Sat Oct 22 22:41:31 PDT 2022
On Mon, Oct 10, 2022 at 10:05 PM Vivian Wang <dramforever at live.com> wrote:
>
> Instead of hard-coding the list of extensions in C code, use carray to
> generate the list of extensions.
>
> Using carray makes adding and removing extensions slightly cleaner. This
> also paves the way for using Kconfig to disable unneeded extensions.
>
> Signed-off-by: Vivian Wang <dramforever at live.com>
Looks good to me.
Reviewed-by: Anup Patel <anup at brainfault.org>
Applied this patch to the riscv/opensbi repo.
Thanks,
Anup
> ---
> include/sbi/sbi_ecall.h | 10 ---------
> lib/sbi/objects.mk | 22 ++++++++++++++++----
> lib/sbi/sbi_ecall.c | 39 ++++++++++-------------------------
> lib/sbi/sbi_ecall_exts.carray | 3 +++
> 4 files changed, 32 insertions(+), 42 deletions(-)
> create mode 100644 lib/sbi/sbi_ecall_exts.carray
>
> diff --git a/include/sbi/sbi_ecall.h b/include/sbi/sbi_ecall.h
> index 046a56a..ff9bf8e 100644
> --- a/include/sbi/sbi_ecall.h
> +++ b/include/sbi/sbi_ecall.h
> @@ -31,16 +31,6 @@ struct sbi_ecall_extension {
> struct sbi_trap_info *out_trap);
> };
>
> -extern struct sbi_ecall_extension ecall_base;
> -extern struct sbi_ecall_extension ecall_legacy;
> -extern struct sbi_ecall_extension ecall_time;
> -extern struct sbi_ecall_extension ecall_rfence;
> -extern struct sbi_ecall_extension ecall_ipi;
> -extern struct sbi_ecall_extension ecall_vendor;
> -extern struct sbi_ecall_extension ecall_hsm;
> -extern struct sbi_ecall_extension ecall_srst;
> -extern struct sbi_ecall_extension ecall_pmu;
> -
> u16 sbi_ecall_version_major(void);
>
> u16 sbi_ecall_version_minor(void);
> diff --git a/lib/sbi/objects.mk b/lib/sbi/objects.mk
> index 1ed1983..fa20b7b 100644
> --- a/lib/sbi/objects.mk
> +++ b/lib/sbi/objects.mk
> @@ -12,17 +12,31 @@ libsbi-objs-y += riscv_atomic.o
> libsbi-objs-y += riscv_hardfp.o
> libsbi-objs-y += riscv_locks.o
>
> -libsbi-objs-y += sbi_bitmap.o
> -libsbi-objs-y += sbi_bitops.o
> -libsbi-objs-y += sbi_console.o
> -libsbi-objs-y += sbi_domain.o
> libsbi-objs-y += sbi_ecall.o
> +libsbi-objs-y += sbi_ecall_exts.o
> +
> +# The order of below extensions is performance optimized
> +carray-sbi_ecall_exts-y += ecall_time
> +carray-sbi_ecall_exts-y += ecall_rfence
> +carray-sbi_ecall_exts-y += ecall_ipi
> +carray-sbi_ecall_exts-y += ecall_base
> +carray-sbi_ecall_exts-y += ecall_hsm
> +carray-sbi_ecall_exts-y += ecall_srst
> +carray-sbi_ecall_exts-y += ecall_pmu
> +carray-sbi_ecall_exts-y += ecall_legacy
> +carray-sbi_ecall_exts-y += ecall_vendor
> +
> libsbi-objs-y += sbi_ecall_base.o
> libsbi-objs-y += sbi_ecall_hsm.o
> libsbi-objs-y += sbi_ecall_legacy.o
> libsbi-objs-y += sbi_ecall_pmu.o
> libsbi-objs-y += sbi_ecall_replace.o
> libsbi-objs-y += sbi_ecall_vendor.o
> +
> +libsbi-objs-y += sbi_bitmap.o
> +libsbi-objs-y += sbi_bitops.o
> +libsbi-objs-y += sbi_console.o
> +libsbi-objs-y += sbi_domain.o
> libsbi-objs-y += sbi_emulate_csr.o
> libsbi-objs-y += sbi_fifo.o
> libsbi-objs-y += sbi_hart.o
> diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c
> index ce021eb..25dd78c 100644
> --- a/lib/sbi/sbi_ecall.c
> +++ b/lib/sbi/sbi_ecall.c
> @@ -13,6 +13,9 @@
> #include <sbi/sbi_error.h>
> #include <sbi/sbi_trap.h>
>
> +extern struct sbi_ecall_extension *sbi_ecall_exts[];
> +extern unsigned long sbi_ecall_exts_size;
> +
> u16 sbi_ecall_version_major(void)
> {
> return SBI_ECALL_VERSION_MAJOR;
> @@ -144,35 +147,15 @@ int sbi_ecall_handler(struct sbi_trap_regs *regs)
> int sbi_ecall_init(void)
> {
> int ret;
> + struct sbi_ecall_extension *ext;
> + unsigned long i;
>
> - /* The order of below registrations is performance optimized */
> - ret = sbi_ecall_register_extension(&ecall_time);
> - if (ret)
> - return ret;
> - ret = sbi_ecall_register_extension(&ecall_rfence);
> - if (ret)
> - return ret;
> - ret = sbi_ecall_register_extension(&ecall_ipi);
> - if (ret)
> - return ret;
> - ret = sbi_ecall_register_extension(&ecall_base);
> - if (ret)
> - return ret;
> - ret = sbi_ecall_register_extension(&ecall_hsm);
> - if (ret)
> - return ret;
> - ret = sbi_ecall_register_extension(&ecall_srst);
> - if (ret)
> - return ret;
> - ret = sbi_ecall_register_extension(&ecall_pmu);
> - if (ret)
> - return ret;
> - ret = sbi_ecall_register_extension(&ecall_legacy);
> - if (ret)
> - return ret;
> - ret = sbi_ecall_register_extension(&ecall_vendor);
> - if (ret)
> - return ret;
> + for (i = 0; i < sbi_ecall_exts_size; i++) {
> + ext = sbi_ecall_exts[i];
> + ret = sbi_ecall_register_extension(ext);
> + if (ret)
> + return ret;
> + }
>
> return 0;
> }
> diff --git a/lib/sbi/sbi_ecall_exts.carray b/lib/sbi/sbi_ecall_exts.carray
> new file mode 100644
> index 0000000..710e3ed
> --- /dev/null
> +++ b/lib/sbi/sbi_ecall_exts.carray
> @@ -0,0 +1,3 @@
> +HEADER: sbi/sbi_ecall.h
> +TYPE: struct sbi_ecall_extension
> +NAME: sbi_ecall_exts
> --
> 2.37.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list