forked from Mirrors/opensbi
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 <merle@hardenedlinux.org> Signed-off-by: Anup Patel <anup.patel@wdc.com>
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user