Add riscv-test into kelvin SW project
Use bazel's git_repository functionality to pull RISCV's ISA tests
directly since we are not changing anything from there. The
Kelvin-specific changes are the entry point and the pass/fail condition
(replaced with mpause/ebreak)
Also move the repository dependency into repos.bzl to a cleaner
dependency management.
Change-Id: I21d0c1238d1a5888daee7b23e9b41004c4303752
diff --git a/WORKSPACE b/WORKSPACE
index 60c42e0..1912123 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1,33 +1,8 @@
workspace(name = "kelvin")
-load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
-load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+load("//build_tools/bazel:repos.bzl", "kelvin_repos")
+kelvin_repos()
-# Kelvin toolchain
-new_local_repository(
- name = "kelvin-gcc",
- build_file = "third_party/kelvin-gcc/BUILD",
- path = "../../cache/toolchain_kelvin",
-)
-
-# CRT is the Compiler Repository Toolkit. It contains the configuration for
-# the windows compiler.
-maybe(
- http_archive,
- name = "crt",
- url = "https://github.com/lowRISC/crt/archive/refs/tags/v0.3.4.tar.gz",
- sha256 = "01a66778d1a0d5bbfb4ba30e72bd6876d0c20766d0b1921ab36ca3350cb48c60",
- strip_prefix = "crt-0.3.4",
-)
-
-load("@crt//:repos.bzl", "crt_repos")
-
-crt_repos()
-
-load("@crt//:deps.bzl", "crt_deps")
-
-crt_deps()
-
+# Register Kelvin toolchain
load("//platforms:registration.bzl", "kelvin_register_toolchain")
-
kelvin_register_toolchain()
diff --git a/build_tools/bazel/kelvin.bzl b/build_tools/bazel/kelvin.bzl
index 84d037b..ddd20ce 100644
--- a/build_tools/bazel/kelvin.bzl
+++ b/build_tools/bazel/kelvin.bzl
@@ -2,7 +2,6 @@
load("@rules_cc//cc:find_cc_toolchain.bzl", "find_cc_toolchain")
-
KELVIN_PLATFORM = "//platforms/riscv32:kelvin"
def _kelvin_transition_impl(_settings, _attr):
@@ -142,7 +141,11 @@
toolchains = ["@rules_cc//cc:toolchain_type"],
)
-def kelvin_binary(name, srcs, **kwargs):
+def kelvin_binary(
+ name,
+ srcs,
+ is_riscv_test = False,
+ **kwargs):
"""A helper macro for generating binary artifacts for the kelvin core.
This macro uses the kelvin toolchain, kelvin-specific starting asm,
@@ -151,6 +154,8 @@
Args:
name: The name of this rule.
srcs: The c source files.
+ is_riscv_test: A bool flag to decide if a custom _start asm is included.
+ It is used by riscv-tests.
**kwargs: Additional arguments forward to cc_binary.
Emits rules:
filegroup named: <name>.bin
@@ -158,11 +163,13 @@
filegroup named: <name>.elf
Containing all elf output for the target.
"""
- srcs = srcs + [
- "//crt:kelvin_gloss.cc",
- "//crt:kelvin_start.S",
- "//crt:crt.S",
- ]
+ srcs.append("//crt:kelvin_gloss.cc")
+ if not is_riscv_test:
+ srcs += [
+ "//crt:crt.S",
+ "//crt:kelvin_start.S",
+ ]
+
kelvin_binary_impl(
name = name,
srcs = srcs,
diff --git a/build_tools/bazel/repos.bzl b/build_tools/bazel/repos.bzl
new file mode 100644
index 0000000..7e9cfd6
--- /dev/null
+++ b/build_tools/bazel/repos.bzl
@@ -0,0 +1,34 @@
+"""Kelvin dependency repository setup."""
+
+load("@bazel_tools//tools/build_defs/repo:utils.bzl", "maybe")
+load("@bazel_tools//tools/build_defs/repo:git.bzl", "new_git_repository")
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+
+def kelvin_repos():
+ """"Setup Kelvin dependency repositories."""
+
+ # Kelvin toolchain
+ native.new_local_repository(
+ name = "kelvin-gcc",
+ build_file = "third_party/kelvin-gcc/BUILD",
+ path = "../../cache/toolchain_kelvin",
+ )
+
+ # CRT is the Compiler Repository Toolkit. It contains the configuration for
+ # the windows compiler.
+ maybe(
+ http_archive,
+ name = "crt",
+ url = "https://github.com/lowRISC/crt/archive/refs/tags/v0.3.4.tar.gz",
+ sha256 = "01a66778d1a0d5bbfb4ba30e72bd6876d0c20766d0b1921ab36ca3350cb48c60",
+ strip_prefix = "crt-0.3.4",
+ )
+
+ # risc-v isa test
+ new_git_repository(
+ name = "riscv-tests",
+ commit = "d649367a1386609da3d10e9e6d388f98781dd35f",
+ build_file = "//third_party/riscv:BUILD.riscv-tests",
+ shallow_since = "1636745372 -0800",
+ remote = "https://spacebeaker.googlesource.com/shodan/3p/riscv/riscv-tests",
+ )
diff --git a/tests/riscv-tests/BUILD b/tests/riscv-tests/BUILD
new file mode 100644
index 0000000..1e07424
--- /dev/null
+++ b/tests/riscv-tests/BUILD
@@ -0,0 +1,106 @@
+# Build riscv-tests based on Kelvin linker script and termination condition.
+
+load("//build_tools/bazel:kelvin.bzl", "kelvin_binary")
+
+cc_library(
+ name = "riscv_tests_base",
+ srcs = [
+ "test_main.cc",
+ ],
+ hdrs = [
+ "riscv_test.h",
+ "@riscv-tests//:isa/macros/scalar/test_macros.h",
+ ],
+)
+
+RV32UI_TESTS = [
+ "add",
+ "addi",
+ "and",
+ "andi",
+ "auipc",
+ "beq",
+ "bge",
+ "bgeu",
+ "blt",
+ "bltu",
+ "bne",
+ "fence_i",
+ "jalr",
+ "jal",
+ "lb",
+ "lbu",
+ "lh",
+ "lhu",
+ "lui",
+ "lw",
+ "ori",
+ "or",
+ "sb",
+ "sh",
+ "simple",
+ "slli",
+ "sll",
+ "slti",
+ "sltiu",
+ "slt",
+ "sltu",
+ "srai",
+ "sra",
+ "srli",
+ "srl",
+ "sub",
+ "sw",
+ "xori",
+ "xor",
+]
+
+[kelvin_binary(
+ name = "rv32ui_{}".format(test),
+ srcs = [
+ # riscv-tests use the rv64 code to set up rv32 tests.
+ "@riscv-tests//:isa/rv64ui/{}.S".format(test),
+ ],
+ # The include paths are set explicitly because riscv-tests has special
+ # include dependencies.
+ copts = [
+ "-Itests/riscv-tests",
+ "-Iexternal/riscv-tests/isa/macros/scalar",
+ "-Wno-variadic-macros",
+ ],
+ defines = [
+ "RVTEST_RV64U=RVTEST_RV32U",
+ ],
+ is_riscv_test = True,
+ deps = [
+ ":riscv_tests_base",
+ ],
+) for test in RV32UI_TESTS]
+
+RV32UM_TESTS = [
+ "div",
+ "divu",
+ "mul",
+ "mulh",
+ "mulhsu",
+ "mulhu",
+ "rem",
+ "remu",
+]
+
+[kelvin_binary(
+ name = "rv32um_{}".format(test),
+ srcs = [
+ "@riscv-tests//:isa/rv32um/{}.S".format(test),
+
+ ],
+ copts = [
+ "-Itests/riscv-tests",
+ "-Iexternal/riscv-tests/isa/macros/scalar",
+ "-Wno-variadic-macros",
+ ],
+ is_riscv_test = True,
+ deps = [
+ ":riscv_tests_base",
+ ],
+) for test in RV32UM_TESTS]
diff --git a/tests/riscv-tests/riscv_test.h b/tests/riscv-tests/riscv_test.h
new file mode 100644
index 0000000..9d86895
--- /dev/null
+++ b/tests/riscv-tests/riscv_test.h
@@ -0,0 +1,47 @@
+// Copyright 2023 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// A simplified RISCV test header file to replace the pass/fail condition with
+// Kelvin-specific termination calls.
+
+#ifndef TESTS_RISCV_TESTS_RISCV_TEST_H_
+#define TESTS_RISCV_TESTS_RISCV_TEST_H_
+
+#define RVTEST_RV32U \
+ .macro init; \
+ .endm
+#define RVTEST_CODE_BEGIN \
+ .globl _start; \
+ _start:
+#define RVTEST_CODE_END
+#define TESTNUM gp
+#define RVTEST_PASS mpause
+#define RVTEST_FAIL ebreak
+#define EXTRA_DATA
+// clang-format off
+#define RVTEST_DATA_BEGIN \
+ EXTRA_DATA \
+ .pushsection .tohost, "aw", @progbits; \
+ .align 6; .global tohost; tohost: .dword 0; .size tohost, 8; \
+ .align 6; .global fromhost; fromhost: .dword 0; .size fromhost, 8;\
+ .popsection; \
+ .align 4; \
+ .global begin_signature; \
+ begin_signature:
+// clang-format on
+#define RVTEST_DATA_END \
+ .align 4; \
+ .global end_signature; \
+ end_signature:
+#endif // TESTS_RISCV_TESTS_RISCV_TEST_H_
diff --git a/tests/riscv-tests/test_main.cc b/tests/riscv-tests/test_main.cc
new file mode 100644
index 0000000..ca87f60
--- /dev/null
+++ b/tests/riscv-tests/test_main.cc
@@ -0,0 +1,21 @@
+// Copyright 2023 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Common main test file for riscv ISA tests
+
+extern "C" void _start();
+int main() {
+ _start();
+ return 0;
+}
diff --git a/third_party/riscv/BUILD b/third_party/riscv/BUILD
new file mode 100644
index 0000000..ffd0fb0
--- /dev/null
+++ b/third_party/riscv/BUILD
@@ -0,0 +1 @@
+package(default_visibility = ["//visibility:public"])
diff --git a/third_party/riscv/BUILD.riscv-tests b/third_party/riscv/BUILD.riscv-tests
new file mode 100644
index 0000000..dcf1177
--- /dev/null
+++ b/third_party/riscv/BUILD.riscv-tests
@@ -0,0 +1,8 @@
+package(default_visibility = ["//visibility:public"])
+
+filegroup(
+ name = "all",
+ srcs = glob(["**"], exclude=["**/*.gitignore"]),
+)
+
+exports_files(glob(["**"]))