aboutsummaryrefslogtreecommitdiff
path: root/kernel/kapi/interrupts.stress.cpp
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-09-29 12:40:48 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-09-29 12:40:48 +0200
commit569f0e50663095e8ba7363cdab5421d0aeb9e6c3 (patch)
treecf7c5d890db69c1babd17f8d13e5b3e5e62fa7ed /kernel/kapi/interrupts.stress.cpp
parente259f732d9bf38e390588f07884c31ece95f5b7b (diff)
downloadkernel-569f0e50663095e8ba7363cdab5421d0aeb9e6c3.tar.xz
kernel-569f0e50663095e8ba7363cdab5421d0aeb9e6c3.zip
kapi/interrupts: add tests
Diffstat (limited to 'kernel/kapi/interrupts.stress.cpp')
-rw-r--r--kernel/kapi/interrupts.stress.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/kernel/kapi/interrupts.stress.cpp b/kernel/kapi/interrupts.stress.cpp
new file mode 100644
index 00000000..d3baf7b8
--- /dev/null
+++ b/kernel/kapi/interrupts.stress.cpp
@@ -0,0 +1,65 @@
+#include <kapi/interrupts.hpp>
+
+#include <kernel/test_support/cpu.hpp>
+
+#include <catch2/catch_test_macros.hpp>
+
+#include <future>
+#include <mutex>
+
+SCENARIO("irq_lock remote unlock protection", "[kapi][interrupts]")
+{
+ GIVEN("a simple irq_lock")
+ {
+ auto lock = kapi::interrupts::irq_lock{};
+
+ WHEN("it is locked on the main core")
+ {
+ auto guard = std::lock_guard{lock};
+
+ THEN("unlocking it on a different core panics")
+ {
+ auto unlocker = [&] {
+ try
+ {
+ lock.unlock();
+ return false;
+ }
+ catch (kernel::tests::cpu::halt const &)
+ {
+ return true;
+ }
+ };
+
+ auto result = std::async(std::launch::async, unlocker);
+
+ REQUIRE(result.get());
+ }
+ }
+ }
+
+ GIVEN("A heap allocated irq_lock")
+ {
+ // We use plain new-delete here, since the destruction path of std::shared_ptr is fully noexcept.
+ auto lock = new kapi::interrupts::irq_lock<>{};
+
+ THEN("destroying it on a different core panics")
+ {
+ auto destroyer = [&] {
+ try
+ {
+ delete lock;
+ return false;
+ }
+ catch (kernel::tests::cpu::halt const &)
+ {
+ return true;
+ }
+ };
+
+ auto result = std::async(std::launch::async, destroyer);
+
+ REQUIRE(result.get());
+ }
+ }
+} \ No newline at end of file