]> xenbits.xensource.com Git - people/andrewcoop/xen-test-framework.git/commitdiff
riscv
authorAndrew Cooper <andrew.cooper3@citrix.com>
Tue, 27 Dec 2022 10:12:54 +0000 (10:12 +0000)
committerAndrew Cooper <andrew.cooper3@citrix.com>
Sat, 13 Jan 2024 14:48:59 +0000 (14:48 +0000)
17 files changed:
.github/workflows/build.yml
Makefile
arch/riscv/head.S [new file with mode: 0644]
arch/riscv/include/arch/config.h [new file with mode: 0644]
arch/riscv/include/arch/link.lds.h [new file with mode: 0644]
arch/riscv/include/arch/page.h [new file with mode: 0644]
build/riscv-common/arch-common.mk [new file with mode: 0644]
build/riscv-common/arch-files.mk [new file with mode: 0644]
build/riscv32/arch-common.mk [new file with mode: 0644]
build/riscv32/arch-files.mk [new file with mode: 0644]
build/riscv32/arch-tests.mk [new file with mode: 0644]
build/riscv64/arch-common.mk [new file with mode: 0644]
build/riscv64/arch-files.mk [new file with mode: 0644]
build/riscv64/arch-tests.mk [new file with mode: 0644]
config/default-riscv.cfg.in [new file with mode: 0644]
tests/stubriscv/Makefile [new file with mode: 0644]
tests/stubriscv/main.c [new file with mode: 0644]

index d610f937fb62f516e345d33043765e9c2be7170c..1c0a4106859d34638b398384f9ea6f7c32554323 100644 (file)
@@ -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=
index e599ee35e358e47e8336c95c6dc907a6bbcdcdbb..dc525785ace7e4b1980568aa0602f7d43d6af285 100644 (file)
--- 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 (file)
index 0000000..2fdaed4
--- /dev/null
@@ -0,0 +1,24 @@
+#include <arch/page.h>
+
+        .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 (file)
index 0000000..daaf9b4
--- /dev/null
@@ -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 (file)
index 0000000..7b108f6
--- /dev/null
@@ -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 (file)
index 0000000..c7571bb
--- /dev/null
@@ -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 (file)
index 0000000..e7560eb
--- /dev/null
@@ -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 (file)
index 0000000..e69de29
diff --git a/build/riscv32/arch-common.mk b/build/riscv32/arch-common.mk
new file mode 100644 (file)
index 0000000..3406b54
--- /dev/null
@@ -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 (file)
index 0000000..f5333b0
--- /dev/null
@@ -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 (file)
index 0000000..0e5b826
--- /dev/null
@@ -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 (file)
index 0000000..933b9ff
--- /dev/null
@@ -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 (file)
index 0000000..103d1a6
--- /dev/null
@@ -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 (file)
index 0000000..2037864
--- /dev/null
@@ -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 (file)
index 0000000..26c0c50
--- /dev/null
@@ -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 (file)
index 0000000..f5f5761
--- /dev/null
@@ -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 (file)
index 0000000..e8c50cf
--- /dev/null
@@ -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:
+ */