diff options
Diffstat (limited to 'arch/riscv/linux')
| -rw-r--r-- | arch/riscv/linux/Makefile | 60 | ||||
| -rw-r--r-- | arch/riscv/linux/probe.c | 294 |
2 files changed, 0 insertions, 354 deletions
diff --git a/arch/riscv/linux/Makefile b/arch/riscv/linux/Makefile deleted file mode 100644 index 9b813ff..0000000 --- a/arch/riscv/linux/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -## -# By default everything is silent. If you want to change this behavior, simply -# assign V=1 when calling make. - -V = -ifeq ($(strip $(V)),) - E = @echo - Q = @ -else - E = @\# - Q = -endif - -## -# Compile options. You can use CROSS_COMPILE just like on the Linux Kernel. You -# can also determine the ISA to be used, which defaults to my VisionFive2 board. -# I did not go too much into the rabbit hole of platform-specific flags because -# everything is in assembly anyways and everything is statically linked. Hence -# no `-mcpu`, no `-mtune`, no funny business. - -CC = $(CROSS_COMPILE)gcc -LD = $(CROSS_COMPILE)ld -ISA ?= rv64imafdc_zicntr_zicsr_zifencei_zihpm_zca_zcd_zba_zbb -WARNINGS = -Werror -Wpedantic -Wall -Wextra -Wcast-align -Wcast-qual -Winit-self \ - -Wmissing-include-dirs -Wredundant-decls -Wshadow -Wsign-conversion \ - -Wswitch-default -Wundef -Wunreachable-code -Wmissing-noreturn -CCFLAGS = $(WARNINGS) -march=$(ISA) -LDFLAGS = - - -# You can pass an optional `DEBUG` variable to manipulate the build type. -DEBUG = -ifeq ($(strip $(DEBUG)),) - CCFLAGS += -O3 -else - CCFLAGS += -g -endif - -## -# Paths. - -SRC = $(wildcard *.c) -EXES = $(SRC:.c=) - -## -# Targets - -.PHONY: all -all: clean $(EXES) - -.PHONY: build -build: $(EXES) - -.c: - $(E) " CC " $(*F) - $(Q) $(CC) $(CCFLAGS) $< -o $@ - -.PHONY: clean -clean: - $(Q) rm -f $(EXES) diff --git a/arch/riscv/linux/probe.c b/arch/riscv/linux/probe.c deleted file mode 100644 index 9e2e978..0000000 --- a/arch/riscv/linux/probe.c +++ /dev/null @@ -1,294 +0,0 @@ -#define _GNU_SOURCE - -#include <sched.h> -#include <asm/hwprobe.h> -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <stdbool.h> -#include <stdint.h> - -#define NR_RISCV_HWPROBE 258 - -// Depend on Linux patches that have not been merged upstream... -#define RISCV_HWPROBE_EXT_ZICNTR (1ULL << 49) -#define RISCV_HWPROBE_EXT_ZIHPM (1ULL << 50) -#define RISCV_HWPROBE_EXT_ZICSR (1ULL << 51) -#define RISCV_HWPROBE_EXT_ZIFENCEI (1ULL << 52) - -#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr)[0]) - -struct ext_pair_t { - char *id; - uint64_t value; -}; - -static struct ext_pair_t ext_pairs[] = { - { - .id = "F, D", - .value = RISCV_HWPROBE_IMA_FD, - }, - { - .id = "C", - .value = RISCV_HWPROBE_IMA_C, - }, - { - .id = "V", - .value = RISCV_HWPROBE_IMA_V, - }, - { - .id = "ZBA", - .value = RISCV_HWPROBE_EXT_ZBA, - }, - { - .id = "ZBB", - .value = RISCV_HWPROBE_EXT_ZBB, - }, - { - .id = "ZBS", - .value = RISCV_HWPROBE_EXT_ZBS, - }, - { - .id = "ZICBOZ", - .value = RISCV_HWPROBE_EXT_ZICBOZ, - }, - { - .id = "ZBC", - .value = RISCV_HWPROBE_EXT_ZBC, - }, - { - .id = "ZBKB", - .value = RISCV_HWPROBE_EXT_ZBKB, - }, - { - .id = "ZBKC", - .value = RISCV_HWPROBE_EXT_ZBKC, - }, - { - .id = "ZBKX", - .value = RISCV_HWPROBE_EXT_ZBKX, - }, - { - .id = "ZKND", - .value = RISCV_HWPROBE_EXT_ZKND, - }, - { - .id = "ZKNE", - .value = RISCV_HWPROBE_EXT_ZKNE, - }, - { - .id = "ZKNH", - .value = RISCV_HWPROBE_EXT_ZKNH, - }, - { - .id = "ZKSED", - .value = RISCV_HWPROBE_EXT_ZKSED, - }, - { - .id = "ZKSH", - .value = RISCV_HWPROBE_EXT_ZKSH, - }, - { - .id = "ZKT", - .value = RISCV_HWPROBE_EXT_ZKT, - }, - { - .id = "ZVBB", - .value = RISCV_HWPROBE_EXT_ZVBB, - }, - { - .id = "ZVBC", - .value = RISCV_HWPROBE_EXT_ZVBC, - }, - { - .id = "ZVKB", - .value = RISCV_HWPROBE_EXT_ZVKB, - }, - { - .id = "ZVKG", - .value = RISCV_HWPROBE_EXT_ZVKG, - }, - { - .id = "ZVKNED", - .value = RISCV_HWPROBE_EXT_ZVKNED, - }, - { - .id = "ZVKNHA", - .value = RISCV_HWPROBE_EXT_ZVKNHA, - }, - { - .id = "ZVKNHB", - .value = RISCV_HWPROBE_EXT_ZVKNHB, - }, - { - .id = "ZVKSED", - .value = RISCV_HWPROBE_EXT_ZVKSED, - }, - { - .id = "ZVKSH", - .value = RISCV_HWPROBE_EXT_ZVKSH, - }, - { - .id = "ZVKT", - .value = RISCV_HWPROBE_EXT_ZVKT, - }, - { - .id = "ZFH", - .value = RISCV_HWPROBE_EXT_ZFH, - }, - { - .id = "ZFHMIN", - .value = RISCV_HWPROBE_EXT_ZFHMIN, - }, - { - .id = "ZIHINTNTL", - .value = RISCV_HWPROBE_EXT_ZIHINTNTL, - }, - { - .id = "ZVFH", - .value = RISCV_HWPROBE_EXT_ZVFH, - }, - { - .id = "ZVFHMIN", - .value = RISCV_HWPROBE_EXT_ZVFHMIN, - }, - { - .id = "ZFA", - .value = RISCV_HWPROBE_EXT_ZFA, - }, - { - .id = "ZTSO", - .value = RISCV_HWPROBE_EXT_ZTSO, - }, - { - .id = "ZACAS", - .value = RISCV_HWPROBE_EXT_ZACAS, - }, - { - .id = "ZICOND", - .value = RISCV_HWPROBE_EXT_ZICOND, - }, - { - .id = "ZIHINTPAUSE", - .value = RISCV_HWPROBE_EXT_ZIHINTPAUSE, - }, - { - .id = "ZVE32X", - .value = RISCV_HWPROBE_EXT_ZVE32X, - }, - { - .id = "ZVE32F", - .value = RISCV_HWPROBE_EXT_ZVE32F, - }, - { - .id = "ZVE64X", - .value = RISCV_HWPROBE_EXT_ZVE64X, - }, - { - .id = "ZVE64F", - .value = RISCV_HWPROBE_EXT_ZVE64F, - }, - { - .id = "ZVE64D", - .value = RISCV_HWPROBE_EXT_ZVE64D, - }, - { - .id = "ZIMOP", - .value = RISCV_HWPROBE_EXT_ZIMOP, - }, - { - .id = "ZCA", - .value = RISCV_HWPROBE_EXT_ZCA, - }, - { - .id = "ZCB", - .value = RISCV_HWPROBE_EXT_ZCB, - }, - { - .id = "ZCD", - .value = RISCV_HWPROBE_EXT_ZCD, - }, - { - .id = "ZCF", - .value = RISCV_HWPROBE_EXT_ZCF, - }, - { - .id = "ZCMOP", - .value = RISCV_HWPROBE_EXT_ZCMOP, - }, - { - .id = "ZAWRS", - .value = RISCV_HWPROBE_EXT_ZAWRS, - }, - { - .id = "ZICNTR", - .value = RISCV_HWPROBE_EXT_ZICNTR, - }, - { - .id = "ZIHPM", - .value = RISCV_HWPROBE_EXT_ZIHPM, - }, - { - .id = "ZICSR", - .value = RISCV_HWPROBE_EXT_ZICSR, - }, - { - .id = "ZIFENCEI", - .value = RISCV_HWPROBE_EXT_ZIFENCEI, - }, -}; - -void print_bits(size_t size, void *ptr) -{ - unsigned char *b = (unsigned char *)ptr; - unsigned char byte; - int i, j; - - for (i = size - 1; i >= 0; i--) { - for (j = 7; j >= 0; j--) { - byte = (b[i] >> j) & 1; - printf("%u", byte); - } - } -} - -int main() -{ - struct riscv_hwprobe pairs; - long rc; - - // base: rv64ima - - pairs = (struct riscv_hwprobe){ - .key = RISCV_HWPROBE_KEY_BASE_BEHAVIOR, - }; - rc = syscall(NR_RISCV_HWPROBE, &pairs, 1, 0, NULL, 0); - if (rc) { - perror("could not fetch the base behavior for the system"); - exit(EXIT_FAILURE); - } - printf("Supports base extensions I, M, A? %s\n", (bool)pairs.value ? "yes" : "no"); - - // Extensions - - pairs = (struct riscv_hwprobe){ - .key = RISCV_HWPROBE_KEY_IMA_EXT_0, - }; - rc = syscall(NR_RISCV_HWPROBE, &pairs, 1, 0, NULL, 0); - if (rc) { - perror("could not fetch extensions as given by hwprobe"); - exit(EXIT_FAILURE); - } - - printf("\nWe got back this bit map: "); - print_bits(sizeof(long), &pairs.value); - - puts("; which means:\n"); - for (size_t i = 0; i < ARRAY_SIZE(ext_pairs); i++) { - if ((ext_pairs[i].value & pairs.value) == ext_pairs[i].value) { - printf("%s: OK\n", ext_pairs[i].id); - } - } - - exit(EXIT_SUCCESS); -} |
