From 4fa3dc2076289ee9a40d626dd090cc51e8781639 Mon Sep 17 00:00:00 2001 From: Dr-Noob Date: Mon, 18 Sep 2023 08:20:32 +0100 Subject: [PATCH] [v1.04][RISCV] First support for parsing multi-letter extensions --- src/riscv/riscv.c | 26 ++++++++++++++++++++++++-- src/riscv/riscv.h | 30 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/riscv/riscv.c b/src/riscv/riscv.c index 6d7bf83..e166f4c 100644 --- a/src/riscv/riscv.c +++ b/src/riscv/riscv.c @@ -9,6 +9,11 @@ #include "uarch.h" #include "soc.h" +#define SET_ISA_EXT_MAP(name, bit) \ + if(strncmp(multi_letter_extension, name, \ + multi_letter_extension_len) == 0) \ + ext->mask |= 1UL << bit; \ + struct frequency* get_frequency_info(uint32_t core) { struct frequency* freq = emalloc(sizeof(struct frequency)); @@ -41,10 +46,27 @@ int parse_multi_letter_extension(struct extensions* ext, char* e) { int multi_letter_extension_len = multi_letter_extension_end-(e+1); - // TODO: Parse extension and fill ext struct char* multi_letter_extension = emalloc(multi_letter_extension_len); strncpy(multi_letter_extension, e+1, multi_letter_extension_len); - printWarn("Not parsed multi-letter extension: %s", multi_letter_extension); + // TODO: Add more extensions + // https://en.wikipedia.org/wiki/RISC-V + SET_ISA_EXT_MAP("smaia", RISCV_ISA_EXT_SMAIA); + SET_ISA_EXT_MAP("ssaia", RISCV_ISA_EXT_SSAIA); + SET_ISA_EXT_MAP("sscofpmf", RISCV_ISA_EXT_SSCOFPMF); + SET_ISA_EXT_MAP("sstc", RISCV_ISA_EXT_SSTC); + SET_ISA_EXT_MAP("svinval", RISCV_ISA_EXT_SVINVAL); + SET_ISA_EXT_MAP("svnapot", RISCV_ISA_EXT_SVNAPOT); + SET_ISA_EXT_MAP("svpbmt", RISCV_ISA_EXT_SVPBMT); + SET_ISA_EXT_MAP("zba", RISCV_ISA_EXT_ZBA); + SET_ISA_EXT_MAP("zbb", RISCV_ISA_EXT_ZBB); + SET_ISA_EXT_MAP("zbs", RISCV_ISA_EXT_ZBS); + SET_ISA_EXT_MAP("zicbom", RISCV_ISA_EXT_ZICBOM); + SET_ISA_EXT_MAP("zicboz", RISCV_ISA_EXT_ZICBOZ); + SET_ISA_EXT_MAP("zihintpause", RISCV_ISA_EXT_ZIHINTPAUSE); + else { + printBug("parse_multi_letter_extension: Unknown multi-letter extension: %s", multi_letter_extension); + return -1; + } return multi_letter_extension_len; } diff --git a/src/riscv/riscv.h b/src/riscv/riscv.h index fcbdff1..8ec8119 100644 --- a/src/riscv/riscv.h +++ b/src/riscv/riscv.h @@ -29,6 +29,36 @@ static const struct extension extension_list[] = { { 's' - 'a', "(S) Supervisor-level Instructions" } }; +#define RISCV_ISA_EXT_MAX 64 +#define RISCV_ISA_EXT_NAME_LEN_MAX 32 +#define RISCV_ISA_EXT_BASE 26 + +// This enum represent the logical ID for multi-letter RISC-V ISA extensions. +// The logical ID should start from RISCV_ISA_EXT_BASE and must not exceed +// RISCV_ISA_EXT_MAX. +#define RISCV_ISA_EXT_BASE 26 + +#define RISCV_ISA_EXT_SSCOFPMF 26 +#define RISCV_ISA_EXT_SSTC 27 +#define RISCV_ISA_EXT_SVINVAL 28 +#define RISCV_ISA_EXT_SVPBMT 29 +#define RISCV_ISA_EXT_ZBB 30 +#define RISCV_ISA_EXT_ZICBOM 31 +#define RISCV_ISA_EXT_ZIHINTPAUSE 32 +#define RISCV_ISA_EXT_SVNAPOT 33 +#define RISCV_ISA_EXT_ZICBOZ 34 +#define RISCV_ISA_EXT_SMAIA 35 +#define RISCV_ISA_EXT_SSAIA 36 +#define RISCV_ISA_EXT_ZBA 37 +#define RISCV_ISA_EXT_ZBS 38 +#define RISCV_ISA_EXT_ZICNTR 39 +#define RISCV_ISA_EXT_ZICSR 40 +#define RISCV_ISA_EXT_ZIFENCEI 41 +#define RISCV_ISA_EXT_ZIHPM 42 + +#define RISCV_ISA_EXT_MAX 64 +#define RISCV_ISA_EXT_NAME_LEN_MAX 32 + struct cpuInfo* get_cpu_info(void); char* get_str_topology(struct cpuInfo* cpu, struct topology* topo); char* get_str_extensions(struct cpuInfo* cpu);