summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/sbi/sbi_ecall.h1
-rw-r--r--lib/sbi/sbi_ecall.c5
-rw-r--r--lib/sbi/sbi_ecall_base.c14
-rw-r--r--lib/sbi/sbi_ecall_cppc.c16
-rw-r--r--lib/sbi/sbi_ecall_dbcn.c16
-rw-r--r--lib/sbi/sbi_ecall_hsm.c14
-rw-r--r--lib/sbi/sbi_ecall_ipi.c14
-rw-r--r--lib/sbi/sbi_ecall_legacy.c14
-rw-r--r--lib/sbi/sbi_ecall_pmu.c16
-rw-r--r--lib/sbi/sbi_ecall_rfence.c14
-rw-r--r--lib/sbi/sbi_ecall_srst.c16
-rw-r--r--lib/sbi/sbi_ecall_susp.c16
-rw-r--r--lib/sbi/sbi_ecall_time.c14
-rw-r--r--lib/sbi/sbi_ecall_vendor.c16
14 files changed, 143 insertions, 43 deletions
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,
};