summaryrefslogtreecommitdiff
path: root/include/sbi/riscv_asm.h
diff options
context:
space:
mode:
authorXiang Wang <merle@hardenedlinux.org>2019-11-26 13:36:29 +0300
committerAnup Patel <anup@brainfault.org>2019-11-26 13:36:29 +0300
commitc96cc03fcc2723fa007b65e5ae6fe2673ea41413 (patch)
tree0ba08cbedbf6cefea45618ccdaf9180c27e9929c /include/sbi/riscv_asm.h
parent75f903dd78e2419057d04e14d6720fde764cbf78 (diff)
downloadopensbi-c96cc03fcc2723fa007b65e5ae6fe2673ea41413.tar.xz
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>
Diffstat (limited to 'include/sbi/riscv_asm.h')
-rw-r--r--include/sbi/riscv_asm.h16
1 files changed, 6 insertions, 10 deletions
diff --git a/include/sbi/riscv_asm.h b/include/sbi/riscv_asm.h
index 4f12c03..04502e1 100644
--- a/include/sbi/riscv_asm.h
+++ b/include/sbi/riscv_asm.h
@@ -159,22 +159,18 @@ void csr_write_num(int csr_num, unsigned long val);
__asm__ __volatile__("wfi" ::: "memory"); \
} while (0)
-static inline int misa_extension(char ext)
-{
- return csr_read(CSR_MISA) & (1 << (ext - 'A'));
-}
+/* Determine CPU extension, return non-zero support */
+int misa_extension(char ext);
-static inline int misa_xlen(void)
-{
- return ((long)csr_read(CSR_MISA) < 0) ? 64 : 32;
-}
+/* Get MXL field of misa, return -1 on error */
+int misa_xlen(void);
static inline void misa_string(char *out, unsigned int out_sz)
{
- unsigned long i, val = csr_read(CSR_MISA);
+ unsigned long i;
for (i = 0; i < 26; i++) {
- if (val & (1 << i)) {
+ if (misa_extension('A' + i)) {
*out = 'A' + i;
out++;
}