diff --git a/include/sbi/sbi_ecall.h b/include/sbi/sbi_ecall.h index ff9bf8e2..fac26429 100644 --- a/include/sbi/sbi_ecall.h +++ b/include/sbi/sbi_ecall.h @@ -24,6 +24,7 @@ struct sbi_ecall_extension { struct sbi_dlist head; unsigned long extid_start; unsigned long extid_end; + int (* register_extensions)(void); int (* probe)(unsigned long extid, unsigned long *out_val); int (* handle)(unsigned long extid, unsigned long funcid, const struct sbi_trap_regs *regs, diff --git a/lib/sbi/sbi_ecall.c b/lib/sbi/sbi_ecall.c index 76a1ae9a..3eb4f0ad 100644 --- a/lib/sbi/sbi_ecall.c +++ b/lib/sbi/sbi_ecall.c @@ -154,7 +154,10 @@ int sbi_ecall_init(void) for (i = 0; i < sbi_ecall_exts_size; i++) { ext = sbi_ecall_exts[i]; - ret = sbi_ecall_register_extension(ext); + ret = SBI_ENODEV; + + if (ext->register_extensions) + ret = ext->register_extensions(); if (ret) return ret; } diff --git a/lib/sbi/sbi_ecall_base.c b/lib/sbi/sbi_ecall_base.c index 786d2ac6..74f05eb2 100644 --- a/lib/sbi/sbi_ecall_base.c +++ b/lib/sbi/sbi_ecall_base.c @@ -72,8 +72,16 @@ static int sbi_ecall_base_handler(unsigned long extid, unsigned long funcid, return ret; } +struct sbi_ecall_extension ecall_base; + +static int sbi_ecall_base_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_base); +} + struct sbi_ecall_extension ecall_base = { - .extid_start = SBI_EXT_BASE, - .extid_end = SBI_EXT_BASE, - .handle = sbi_ecall_base_handler, + .extid_start = SBI_EXT_BASE, + .extid_end = SBI_EXT_BASE, + .register_extensions = sbi_ecall_base_register_extensions, + .handle = sbi_ecall_base_handler, }; diff --git a/lib/sbi/sbi_ecall_cppc.c b/lib/sbi/sbi_ecall_cppc.c index 91585f3b..42ec744c 100644 --- a/lib/sbi/sbi_ecall_cppc.c +++ b/lib/sbi/sbi_ecall_cppc.c @@ -55,9 +55,17 @@ static int sbi_ecall_cppc_probe(unsigned long extid, unsigned long *out_val) return 0; } +struct sbi_ecall_extension ecall_cppc; + +static int sbi_ecall_cppc_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_cppc); +} + struct sbi_ecall_extension ecall_cppc = { - .extid_start = SBI_EXT_CPPC, - .extid_end = SBI_EXT_CPPC, - .handle = sbi_ecall_cppc_handler, - .probe = sbi_ecall_cppc_probe, + .extid_start = SBI_EXT_CPPC, + .extid_end = SBI_EXT_CPPC, + .register_extensions = sbi_ecall_cppc_register_extensions, + .probe = sbi_ecall_cppc_probe, + .handle = sbi_ecall_cppc_handler, }; diff --git a/lib/sbi/sbi_ecall_dbcn.c b/lib/sbi/sbi_ecall_dbcn.c index fe7e175a..58b19e44 100644 --- a/lib/sbi/sbi_ecall_dbcn.c +++ b/lib/sbi/sbi_ecall_dbcn.c @@ -64,9 +64,17 @@ static int sbi_ecall_dbcn_probe(unsigned long extid, unsigned long *out_val) return 0; } +struct sbi_ecall_extension ecall_dbcn; + +static int sbi_ecall_dbcn_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_dbcn); +} + struct sbi_ecall_extension ecall_dbcn = { - .extid_start = SBI_EXT_DBCN, - .extid_end = SBI_EXT_DBCN, - .handle = sbi_ecall_dbcn_handler, - .probe = sbi_ecall_dbcn_probe, + .extid_start = SBI_EXT_DBCN, + .extid_end = SBI_EXT_DBCN, + .register_extensions = sbi_ecall_dbcn_register_extensions, + .probe = sbi_ecall_dbcn_probe, + .handle = sbi_ecall_dbcn_handler, }; diff --git a/lib/sbi/sbi_ecall_hsm.c b/lib/sbi/sbi_ecall_hsm.c index f1b41d07..20705c39 100644 --- a/lib/sbi/sbi_ecall_hsm.c +++ b/lib/sbi/sbi_ecall_hsm.c @@ -54,8 +54,16 @@ static int sbi_ecall_hsm_handler(unsigned long extid, unsigned long funcid, return ret; } +struct sbi_ecall_extension ecall_hsm; + +static int sbi_ecall_hsm_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_hsm); +} + struct sbi_ecall_extension ecall_hsm = { - .extid_start = SBI_EXT_HSM, - .extid_end = SBI_EXT_HSM, - .handle = sbi_ecall_hsm_handler, + .extid_start = SBI_EXT_HSM, + .extid_end = SBI_EXT_HSM, + .register_extensions = sbi_ecall_hsm_register_extensions, + .handle = sbi_ecall_hsm_handler, }; diff --git a/lib/sbi/sbi_ecall_ipi.c b/lib/sbi/sbi_ecall_ipi.c index f4797e11..a40d6b8c 100644 --- a/lib/sbi/sbi_ecall_ipi.c +++ b/lib/sbi/sbi_ecall_ipi.c @@ -29,8 +29,16 @@ static int sbi_ecall_ipi_handler(unsigned long extid, unsigned long funcid, return ret; } +struct sbi_ecall_extension ecall_ipi; + +static int sbi_ecall_ipi_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_ipi); +} + struct sbi_ecall_extension ecall_ipi = { - .extid_start = SBI_EXT_IPI, - .extid_end = SBI_EXT_IPI, - .handle = sbi_ecall_ipi_handler, + .extid_start = SBI_EXT_IPI, + .extid_end = SBI_EXT_IPI, + .register_extensions = sbi_ecall_ipi_register_extensions, + .handle = sbi_ecall_ipi_handler, }; diff --git a/lib/sbi/sbi_ecall_legacy.c b/lib/sbi/sbi_ecall_legacy.c index 8237498b..99e862e0 100644 --- a/lib/sbi/sbi_ecall_legacy.c +++ b/lib/sbi/sbi_ecall_legacy.c @@ -117,8 +117,16 @@ static int sbi_ecall_legacy_handler(unsigned long extid, unsigned long funcid, return ret; } +struct sbi_ecall_extension ecall_legacy; + +static int sbi_ecall_legacy_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_legacy); +} + struct sbi_ecall_extension ecall_legacy = { - .extid_start = SBI_EXT_0_1_SET_TIMER, - .extid_end = SBI_EXT_0_1_SHUTDOWN, - .handle = sbi_ecall_legacy_handler, + .extid_start = SBI_EXT_0_1_SET_TIMER, + .extid_end = SBI_EXT_0_1_SHUTDOWN, + .register_extensions = sbi_ecall_legacy_register_extensions, + .handle = sbi_ecall_legacy_handler, }; diff --git a/lib/sbi/sbi_ecall_pmu.c b/lib/sbi/sbi_ecall_pmu.c index 367e9277..b0589d0e 100644 --- a/lib/sbi/sbi_ecall_pmu.c +++ b/lib/sbi/sbi_ecall_pmu.c @@ -88,9 +88,17 @@ static int sbi_ecall_pmu_probe(unsigned long extid, unsigned long *out_val) return 0; } +struct sbi_ecall_extension ecall_pmu; + +static int sbi_ecall_pmu_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_pmu); +} + struct sbi_ecall_extension ecall_pmu = { - .extid_start = SBI_EXT_PMU, - .extid_end = SBI_EXT_PMU, - .handle = sbi_ecall_pmu_handler, - .probe = sbi_ecall_pmu_probe, + .extid_start = SBI_EXT_PMU, + .extid_end = SBI_EXT_PMU, + .register_extensions = sbi_ecall_pmu_register_extensions, + .probe = sbi_ecall_pmu_probe, + .handle = sbi_ecall_pmu_handler, }; diff --git a/lib/sbi/sbi_ecall_rfence.c b/lib/sbi/sbi_ecall_rfence.c index 6334c001..22c66522 100644 --- a/lib/sbi/sbi_ecall_rfence.c +++ b/lib/sbi/sbi_ecall_rfence.c @@ -79,8 +79,16 @@ static int sbi_ecall_rfence_handler(unsigned long extid, unsigned long funcid, return ret; } +struct sbi_ecall_extension ecall_rfence; + +static int sbi_ecall_rfence_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_rfence); +} + struct sbi_ecall_extension ecall_rfence = { - .extid_start = SBI_EXT_RFENCE, - .extid_end = SBI_EXT_RFENCE, - .handle = sbi_ecall_rfence_handler, + .extid_start = SBI_EXT_RFENCE, + .extid_end = SBI_EXT_RFENCE, + .register_extensions = sbi_ecall_rfence_register_extensions, + .handle = sbi_ecall_rfence_handler, }; diff --git a/lib/sbi/sbi_ecall_srst.c b/lib/sbi/sbi_ecall_srst.c index 93b012ce..ad315376 100644 --- a/lib/sbi/sbi_ecall_srst.c +++ b/lib/sbi/sbi_ecall_srst.c @@ -67,9 +67,17 @@ static int sbi_ecall_srst_probe(unsigned long extid, unsigned long *out_val) return 0; } +struct sbi_ecall_extension ecall_srst; + +static int sbi_ecall_srst_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_srst); +} + struct sbi_ecall_extension ecall_srst = { - .extid_start = SBI_EXT_SRST, - .extid_end = SBI_EXT_SRST, - .handle = sbi_ecall_srst_handler, - .probe = sbi_ecall_srst_probe, + .extid_start = SBI_EXT_SRST, + .extid_end = SBI_EXT_SRST, + .register_extensions = sbi_ecall_srst_register_extensions, + .probe = sbi_ecall_srst_probe, + .handle = sbi_ecall_srst_handler, }; diff --git a/lib/sbi/sbi_ecall_susp.c b/lib/sbi/sbi_ecall_susp.c index f20126c4..bfbdbe64 100644 --- a/lib/sbi/sbi_ecall_susp.c +++ b/lib/sbi/sbi_ecall_susp.c @@ -40,9 +40,17 @@ static int sbi_ecall_susp_probe(unsigned long extid, unsigned long *out_val) return 0; } +struct sbi_ecall_extension ecall_susp; + +static int sbi_ecall_susp_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_susp); +} + struct sbi_ecall_extension ecall_susp = { - .extid_start = SBI_EXT_SUSP, - .extid_end = SBI_EXT_SUSP, - .handle = sbi_ecall_susp_handler, - .probe = sbi_ecall_susp_probe, + .extid_start = SBI_EXT_SUSP, + .extid_end = SBI_EXT_SUSP, + .register_extensions = sbi_ecall_susp_register_extensions, + .probe = sbi_ecall_susp_probe, + .handle = sbi_ecall_susp_handler, }; diff --git a/lib/sbi/sbi_ecall_time.c b/lib/sbi/sbi_ecall_time.c index 668cb176..e79196f7 100644 --- a/lib/sbi/sbi_ecall_time.c +++ b/lib/sbi/sbi_ecall_time.c @@ -33,8 +33,16 @@ static int sbi_ecall_time_handler(unsigned long extid, unsigned long funcid, return ret; } +struct sbi_ecall_extension ecall_time; + +static int sbi_ecall_time_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_time); +} + struct sbi_ecall_extension ecall_time = { - .extid_start = SBI_EXT_TIME, - .extid_end = SBI_EXT_TIME, - .handle = sbi_ecall_time_handler, + .extid_start = SBI_EXT_TIME, + .extid_end = SBI_EXT_TIME, + .register_extensions = sbi_ecall_time_register_extensions, + .handle = sbi_ecall_time_handler, }; diff --git a/lib/sbi/sbi_ecall_vendor.c b/lib/sbi/sbi_ecall_vendor.c index 8b8dab00..126156f7 100644 --- a/lib/sbi/sbi_ecall_vendor.c +++ b/lib/sbi/sbi_ecall_vendor.c @@ -47,9 +47,17 @@ static int sbi_ecall_vendor_handler(unsigned long extid, unsigned long funcid, out_val, out_trap); } +struct sbi_ecall_extension ecall_vendor; + +static int sbi_ecall_vendor_register_extensions(void) +{ + return sbi_ecall_register_extension(&ecall_vendor); +} + struct sbi_ecall_extension ecall_vendor = { - .extid_start = SBI_EXT_VENDOR_START, - .extid_end = SBI_EXT_VENDOR_END, - .probe = sbi_ecall_vendor_probe, - .handle = sbi_ecall_vendor_handler, + .extid_start = SBI_EXT_VENDOR_START, + .extid_end = SBI_EXT_VENDOR_END, + .register_extensions = sbi_ecall_vendor_register_extensions, + .probe = sbi_ecall_vendor_probe, + .handle = sbi_ecall_vendor_handler, };