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,
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;
}
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,
};
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,
};
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,
};
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,
};
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,
};
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,
};
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,
};
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,
};
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,
};
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,
};
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,
};
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,
};