diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/sbi/riscv_asm.c | 32 | ||||
| -rw-r--r-- | lib/sbi/sbi_init.c | 13 |
2 files changed, 43 insertions, 2 deletions
diff --git a/lib/sbi/riscv_asm.c b/lib/sbi/riscv_asm.c index e0c8889a..d16e32a8 100644 --- a/lib/sbi/riscv_asm.c +++ b/lib/sbi/riscv_asm.c @@ -10,6 +10,38 @@ #include <sbi/riscv_asm.h> #include <sbi/riscv_encoding.h> #include <sbi/sbi_error.h> +#include <sbi/sbi_platform.h> + +int misa_extension(char ext) +{ + unsigned long misa = csr_read(CSR_MISA); + + if (misa) + return misa & (1 << (ext - 'A')); + + return sbi_platform_misa_extension(sbi_platform_thishart_ptr(), ext); +} + +int misa_xlen(void) +{ + long r; + + if (csr_read(CSR_MISA) == 0) + return sbi_platform_misa_xlen(sbi_platform_thishart_ptr()); + + __asm__ __volatile__( + "csrr t0, misa\n\t" + "slti t1, t0, 0\n\t" + "slli t1, t1, 1\n\t" + "slli t0, t0, 1\n\t" + "slti t0, t0, 0\n\t" + "add %0, t0, t1" + : "=r"(r) + : + : "t0", "t1"); + + return r ? r : -1; +} unsigned long csr_read_num(int csr_num) { diff --git a/lib/sbi/sbi_init.c b/lib/sbi/sbi_init.c index 265bb025..51ce3a0e 100644 --- a/lib/sbi/sbi_init.c +++ b/lib/sbi/sbi_init.c @@ -30,10 +30,10 @@ static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid) { + int xlen; char str[64]; const struct sbi_platform *plat = sbi_platform_ptr(scratch); - misa_string(str, sizeof(str)); #ifdef OPENSBI_VERSION_GIT sbi_printf("\nOpenSBI %s\n", OPENSBI_VERSION_GIT); #else @@ -43,9 +43,18 @@ static void sbi_boot_prints(struct sbi_scratch *scratch, u32 hartid) sbi_printf(BANNER); + /* Determine MISA XLEN and MISA string */ + xlen = misa_xlen(); + if (xlen < 1) { + sbi_printf("Error %d getting MISA XLEN\n", xlen); + sbi_hart_hang(); + } + xlen = 16 * (1 << xlen); + misa_string(str, sizeof(str)); + /* Platform details */ sbi_printf("Platform Name : %s\n", sbi_platform_name(plat)); - sbi_printf("Platform HART Features : RV%d%s\n", misa_xlen(), str); + sbi_printf("Platform HART Features : RV%d%s\n", xlen, str); sbi_printf("Platform Max HARTs : %d\n", sbi_platform_hart_count(plat)); sbi_printf("Current Hart : %u\n", hartid); |
