[v1.03][RISCV] Add support for RISCV extensions

This commit is contained in:
Dr-Noob
2023-04-12 18:55:56 +02:00
parent 4405a262ca
commit 05744f4e40
6 changed files with 190 additions and 4 deletions

View File

@@ -28,6 +28,40 @@ int64_t get_peak_performance(struct cpuInfo* cpu) {
return flops;
}
struct extensions* get_extensions_from_str(char* str) {
struct extensions* ext = emalloc(sizeof(struct extensions));
ext->mask = 0;
ext->str = NULL;
if(str == NULL) {
return ext;
}
int len = sizeof(char) * (strlen(str)+1);
ext->str = emalloc(sizeof(char) * len);
memset(ext->str, 0, len);
strncpy(ext->str, str, sizeof(char) * len);
// Code inspired in Linux kernel:
// https://elixir.bootlin.com/linux/v6.2.10/source/arch/riscv/kernel/cpufeature.c
char* isa = str;
if (!strncmp(isa, "rv32", 4))
isa += 4;
else if (!strncmp(isa, "rv64", 4))
isa += 4;
else {
printBug("get_extensions_from_str: ISA string must start with rv64 or rv32");
return ext;
}
for(char* e = isa; *e != '\0'; e++) {
int n = *e - 'a';
ext->mask |= 1UL << n;
}
return ext;
}
struct cpuInfo* get_cpu_info(void) {
struct cpuInfo* cpu = malloc(sizeof(struct cpuInfo));
//init_cpu_info(cpu);
@@ -37,8 +71,11 @@ struct cpuInfo* get_cpu_info(void) {
cpu->topo = topo;
char* cpuinfo_str = get_uarch_from_cpuinfo();
char* ext_str = get_extensions_from_cpuinfo();
cpu->hv = emalloc(sizeof(struct hypervisor));
cpu->hv->present = false;
cpu->ext = get_extensions_from_str(ext_str);
if(cpu->ext->str != NULL && cpu->ext->mask == 0) return NULL;
cpu->arch = get_uarch_from_cpuinfo_str(cpuinfo_str, cpu);
cpu->soc = get_soc();
cpu->freq = get_frequency_info(0);
@@ -57,6 +94,9 @@ char* get_str_topology(struct cpuInfo* cpu, struct topology* topo) {
}
char* get_str_extensions(struct cpuInfo* cpu) {
if(cpu->ext != NULL) {
return cpu->ext->str;
}
return NULL;
}