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