diff options
Diffstat (limited to 'lib/sbi/sbi_ecall_vendor.c')
-rw-r--r-- | lib/sbi/sbi_ecall_vendor.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/lib/sbi/sbi_ecall_vendor.c b/lib/sbi/sbi_ecall_vendor.c index 9252829..9ea5156 100644 --- a/lib/sbi/sbi_ecall_vendor.c +++ b/lib/sbi/sbi_ecall_vendor.c @@ -13,12 +13,23 @@ #include <sbi/sbi_error.h> #include <sbi/sbi_platform.h> #include <sbi/sbi_trap.h> +#include <sbi/riscv_asm.h> + +static inline unsigned long sbi_ecall_vendor_id(void) +{ + return SBI_EXT_VENDOR_START + + (csr_read(CSR_MVENDORID) & + (SBI_EXT_VENDOR_END - SBI_EXT_VENDOR_START)); +} static int sbi_ecall_vendor_probe(unsigned long extid, unsigned long *out_val) { - *out_val = sbi_platform_vendor_ext_check(sbi_platform_thishart_ptr(), - extid); + if (!sbi_platform_vendor_ext_check(sbi_platform_thishart_ptr()) || + extid != sbi_ecall_vendor_id()) + *out_val = 0; + else + *out_val = 1; return 0; } @@ -27,6 +38,10 @@ static int sbi_ecall_vendor_handler(unsigned long extid, unsigned long funcid, unsigned long *out_val, struct sbi_trap_info *out_trap) { + if (!sbi_platform_vendor_ext_check(sbi_platform_thishart_ptr()) || + extid != sbi_ecall_vendor_id()) + return SBI_ERR_NOT_SUPPORTED; + return sbi_platform_vendor_ext_provider(sbi_platform_thishart_ptr(), extid, funcid, regs, out_val, out_trap); |