summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorXiang Wang <[email protected]>2019-11-26 16:06:29 +0530
committerAnup Patel <[email protected]>2019-11-26 16:06:29 +0530
commitc96cc03fcc2723fa007b65e5ae6fe2673ea41413 (patch)
tree0ba08cbedbf6cefea45618ccdaf9180c27e9929c /lib
parent75f903dd78e2419057d04e14d6720fde764cbf78 (diff)
lib: Fix CPU capabilities detection function
On some platforms, misa may not be implemented. On such a platform, reading misa will get 0. At this time, platform is required to implement a non-standard function to detect the CPU's capabilities. Therefore, this modification add interfaces for non-standard function. The MXL field of misa is always at the highest two bits, whether it is a 32-bit 64-bit or a 128-bit machine. Therefore, this modification fixes the use of a fixed offset to detect the machine length. Signed-off-by: Xiang Wang <[email protected]> Signed-off-by: Anup Patel <[email protected]>
Diffstat (limited to 'lib')
-rw-r--r--lib/sbi/riscv_asm.c32
-rw-r--r--lib/sbi/sbi_init.c13
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);