From: Andrew Cooper Date: Tue, 27 Dec 2022 10:12:54 +0000 (+0000) Subject: riscv X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=76b9fad544a921f226c00e1022650bd1b5fae601;p=people%2Fandrewcoop%2Fxen-test-framework.git riscv --- diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d610f93..1c0a410 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -26,7 +26,7 @@ jobs: strategy: matrix: - arch: [x86, arm32, arm64] + arch: [x86, arm32, arm64, riscv32, riscv64] compiler: [llvm-12, llvm-13, llvm-14, llvm-15] include: @@ -53,6 +53,9 @@ jobs: - arch: arm64 compiler: gcc-aarch64-linux-gnu + - arch: riscv64 + compiler: gcc-riscv64-linux-gnu + runs-on: ubuntu-22.04 steps: @@ -79,6 +82,8 @@ jobs: case $a in arm32) CROSS="CROSS_COMPILE=arm-linux-gnueabihf-" ;; arm64) CROSS="CROSS_COMPILE=aarch64-linux-gnu-" ;; + riscv32) CROSS="CROSS_COMPILE=riscv32-linux-gnu-" ;; + riscv64) CROSS="CROSS_COMPILE=riscv64-linux-gnu-" ;; esac # Select appropriate LLVM= or CC= diff --git a/Makefile b/Makefile index e599ee3..dc52578 100644 --- a/Makefile +++ b/Makefile @@ -26,7 +26,7 @@ endif xtftestdir := $(xtfdir)/tests # Supported architectures -SUPPORTED_ARCH := x86 arm64 arm32 +SUPPORTED_ARCH := x86 arm64 arm32 riscv32 riscv64 # Default architecture ARCH ?= x86 # Check if specified architecture is supported diff --git a/arch/riscv/head.S b/arch/riscv/head.S new file mode 100644 index 0000000..2fdaed4 --- /dev/null +++ b/arch/riscv/head.S @@ -0,0 +1,24 @@ +#include + + .section ".text.head", "ax", %progbits + +.globl _start +_start: + /* sp = &stack[PAGE_SIZE] */ + la sp, stack + li t0, PAGE_SIZE + add sp, sp, t0 + + call test_main + +1: j 1b + + .type _start, %function + .size _start, . - _start + +/* + * Local variables: + * tab-width: 8 + * indent-tabs-mode: nil + * End: + */ diff --git a/arch/riscv/include/arch/config.h b/arch/riscv/include/arch/config.h new file mode 100644 index 0000000..daaf9b4 --- /dev/null +++ b/arch/riscv/include/arch/config.h @@ -0,0 +1 @@ +#define XTF_VIRT_START (4 << 20) diff --git a/arch/riscv/include/arch/link.lds.h b/arch/riscv/include/arch/link.lds.h new file mode 100644 index 0000000..7b108f6 --- /dev/null +++ b/arch/riscv/include/arch/link.lds.h @@ -0,0 +1,18 @@ +#ifdef LINKER_HEADER + +#ifndef __riscv +# error Bad architecture to link with +#endif + +#if __riscv_xlen == 32 +OUTPUT_FORMAT("elf32-littleriscv") +#elif __riscv_xlen == 64 +OUTPUT_FORMAT("elf64-littleriscv") +#else +# error Bad __riscv_xlen to link with +#endif + +OUTPUT_ARCH(riscv) +ENTRY(_start) + +#endif /* LINKER_HEADER */ diff --git a/arch/riscv/include/arch/page.h b/arch/riscv/include/arch/page.h new file mode 100644 index 0000000..c7571bb --- /dev/null +++ b/arch/riscv/include/arch/page.h @@ -0,0 +1 @@ +#define PAGE_SIZE 4096 diff --git a/build/riscv-common/arch-common.mk b/build/riscv-common/arch-common.mk new file mode 100644 index 0000000..e7560eb --- /dev/null +++ b/build/riscv-common/arch-common.mk @@ -0,0 +1,11 @@ +# Common makefile for riscv + +COMMON_AFLAGS += -mno-relax +COMMON_CFLAGS += -mno-relax + +# Compilation recipe +# riscv needs linking normally, then converting to a binary format +define build-$(ARCH) + $(LD) $$(LDFLAGS_$(ARCH)) $$(DEPS-$(ARCH)) -o $$@-syms + $(OBJCOPY) $$@-syms -O binary $$@ +endef diff --git a/build/riscv-common/arch-files.mk b/build/riscv-common/arch-files.mk new file mode 100644 index 0000000..e69de29 diff --git a/build/riscv32/arch-common.mk b/build/riscv32/arch-common.mk new file mode 100644 index 0000000..3406b54 --- /dev/null +++ b/build/riscv32/arch-common.mk @@ -0,0 +1,11 @@ +# Architecture specific configuration for riscv32 + +ARCH_PATH := $(ROOT)/arch/riscv +ALL_ENVIRONMENTS := riscv32 + +riscv32_arch := riscv32 +riscv32_guest := riscv32 +defcfg-riscv32 := $(ROOT)/config/default-riscv.cfg.in + +# Include riscv common makefile +include $(ROOT)/build/riscv-common/arch-common.mk diff --git a/build/riscv32/arch-files.mk b/build/riscv32/arch-files.mk new file mode 100644 index 0000000..f5333b0 --- /dev/null +++ b/build/riscv32/arch-files.mk @@ -0,0 +1,7 @@ +# Architecture specific files compiled and linked for riscv32 + +# Include riscv common files +include $(ROOT)/build/riscv-common/arch-files.mk + +# Specific files for riscv32 +obj-perenv += $(ROOT)/arch/riscv/head.o diff --git a/build/riscv32/arch-tests.mk b/build/riscv32/arch-tests.mk new file mode 100644 index 0000000..0e5b826 --- /dev/null +++ b/build/riscv32/arch-tests.mk @@ -0,0 +1,4 @@ +# Supported tests by riscv32 + +# Currently only example test is supported +TESTS := $(ROOT)/tests/stubriscv diff --git a/build/riscv64/arch-common.mk b/build/riscv64/arch-common.mk new file mode 100644 index 0000000..933b9ff --- /dev/null +++ b/build/riscv64/arch-common.mk @@ -0,0 +1,11 @@ +# Architecture specific configuration for riscv64 + +ARCH_PATH := $(ROOT)/arch/riscv +ALL_ENVIRONMENTS := riscv64 + +riscv64_arch := riscv64 +riscv64_guest := riscv64 +defcfg-riscv64 := $(ROOT)/config/default-riscv.cfg.in + +# Include riscv common makefile +include $(ROOT)/build/riscv-common/arch-common.mk diff --git a/build/riscv64/arch-files.mk b/build/riscv64/arch-files.mk new file mode 100644 index 0000000..103d1a6 --- /dev/null +++ b/build/riscv64/arch-files.mk @@ -0,0 +1,7 @@ +# Architecture specific files compiled and linked for riscv64 + +# Include riscv common files +include $(ROOT)/build/riscv-common/arch-files.mk + +# Specific files for riscv64 +obj-perenv += $(ROOT)/arch/riscv/head.o diff --git a/build/riscv64/arch-tests.mk b/build/riscv64/arch-tests.mk new file mode 100644 index 0000000..2037864 --- /dev/null +++ b/build/riscv64/arch-tests.mk @@ -0,0 +1,4 @@ +# Supported tests by riscv64 + +# Currently only example test is supported +TESTS := $(ROOT)/tests/stubriscv diff --git a/config/default-riscv.cfg.in b/config/default-riscv.cfg.in new file mode 100644 index 0000000..26c0c50 --- /dev/null +++ b/config/default-riscv.cfg.in @@ -0,0 +1,6 @@ +name="test-@@ENV@@-@@NAME@@@@VARIATION@@" + +vcpus=@@VCPUS@@ + +memory=128 +kernel="@@XTFDIR@@/tests/@@NAME@@/test-@@ENV@@-@@NAME@@" diff --git a/tests/stubriscv/Makefile b/tests/stubriscv/Makefile new file mode 100644 index 0000000..f5f5761 --- /dev/null +++ b/tests/stubriscv/Makefile @@ -0,0 +1,9 @@ +include $(ROOT)/build/common.mk + +NAME := stubriscv +CATEGORY := special +TEST-ENVS := $(ALL_ENVIRONMENTS) + +obj-perenv += main.o + +include $(ROOT)/build/gen.mk diff --git a/tests/stubriscv/main.c b/tests/stubriscv/main.c new file mode 100644 index 0000000..e8c50cf --- /dev/null +++ b/tests/stubriscv/main.c @@ -0,0 +1,53 @@ +/** + * Minimal C logic + */ + +#if defined(__aarch64__) || (defined(__riscv) && __riscv_xlen == 64) +# define COND(_32, _64) _64 +#else +# define COND(_32, _64) _32 +#endif + +const char test_title[] = "Hello from RISC-V" COND("32", "64") "\n"; + +char __attribute__((section(".bss.page_aligned"))) stack[4096]; + +void test_main(void) +{ +#if defined(__riscv) + register unsigned long nr asm ("a7"); + register unsigned long a0 asm ("a0"); + register unsigned long a1 asm ("a1"); + register unsigned long a2 asm ("a2"); + + nr = 18; /* __HYPERVISOR_console_io */ + a0 = 0; /* CONSOLEIO_write */ + a1 = sizeof(test_title); /* len */ + a2 = (unsigned long)test_title; /* ptr */ + asm volatile ("ecall" + : [nr] "+r" (nr), [a0] "+r" (a0), + [a1] "+r" (a1), [a2] "+r" (a2) + : + : "memory"); + + unsigned int reason = 0; /* SHUTDOWN_poweroff */ + + nr = 29; /* __HYPERVISOR_sched_op */ + a0 = 2; /* SCHEDOP_shutdown */ + a1 = (unsigned long)&reason; /* ptr */ + asm volatile ("ecall" + : [nr] "+r" (nr), [a0] "+r" (a0), [a1] "+r" (a1) + : + : "memory"); +#endif +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */