Add a test for mret to a misaligned addr
Change-Id: I2c123eed203d9db8edc648955095fe523059ff22
diff --git a/tests/kelvin_isa/BUILD b/tests/kelvin_isa/BUILD
index def4d11..696000a 100644
--- a/tests/kelvin_isa/BUILD
+++ b/tests/kelvin_isa/BUILD
@@ -51,6 +51,20 @@
)
kelvin_test(
+ name = "mret_fault",
+ srcs = [
+ "mret_fault.cc",
+ ],
+ hw_test_size = "small",
+ deps = [
+ ":kelvin_test",
+ ],
+ iss = False,
+ expect_success = False,
+ tags = ["intentional_failure"],
+)
+
+kelvin_test(
name = "instr_fault",
srcs = [
"instr_fault.cc",
diff --git a/tests/kelvin_isa/mret_fault.cc b/tests/kelvin_isa/mret_fault.cc
new file mode 100644
index 0000000..3a16b5e
--- /dev/null
+++ b/tests/kelvin_isa/mret_fault.cc
@@ -0,0 +1,72 @@
+// Copyright 2025 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.
+
+#include <cstdint>
+
+extern "C" {
+
+void isr_wrapper(void);
+__attribute__((naked)) void isr_wrapper() {
+ asm volatile(
+ "csrr t0, mepc \n"
+ "addi t0, t0, 2 \n"
+ "csrw mepc, t0 \n"
+ "mret \n");
+}
+void bad_isr(void);
+__attribute__((naked)) void bad_isr() { asm volatile("ebreak \n"); }
+
+__attribute__((naked, aligned(256))) void isr_vector_table() {
+ asm volatile(
+ "j isr_wrapper \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n"
+ "j bad_isr \n");
+}
+
+int main(int argc, char** argv) {
+ asm volatile("csrw mtvec, %0" ::"rK"((uint32_t)(&isr_vector_table)));
+ asm volatile("ecall");
+ return 0;
+}
+
+} // extern "C"
\ No newline at end of file