diff options
author | Vivian Wang <dramforever@live.com> | 2022-10-10 19:34:44 +0300 |
---|---|---|
committer | Anup Patel <anup@brainfault.org> | 2022-10-23 08:30:30 +0300 |
commit | 56bed1a0fe39cc788452202827ab5fdc3c58bc20 (patch) | |
tree | 713d6fad53f7dfb29e0cbe12ecd025df7647c0b7 /lib | |
parent | 9d54f431e803342218561faa6b4649bbdcea1d24 (diff) | |
download | opensbi-56bed1a0fe39cc788452202827ab5fdc3c58bc20.tar.xz |
lib: sbi_ecall: Generate extensions list with carray
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@live.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sbi/objects.mk | 22 | ||||
-rw-r--r-- | lib/sbi/sbi_ecall.c | 39 | ||||
-rw-r--r-- | lib/sbi/sbi_ecall_exts.carray | 3 |
3 files changed, 32 insertions, 32 deletions
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 |