From 109249913bfe9e04c881b1216c8c258d7b097c44 Mon Sep 17 00:00:00 2001 From: Matt Knight Date: Sun, 16 Apr 2023 12:47:52 -0700 Subject: [PATCH] check if the thread of execution is in an ISR on Cortex M (#123) --- src/modules/cpus/cortex-m.zig | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/modules/cpus/cortex-m.zig b/src/modules/cpus/cortex-m.zig index f69151b..5b9715f 100644 --- a/src/modules/cpus/cortex-m.zig +++ b/src/modules/cpus/cortex-m.zig @@ -1,7 +1,32 @@ const std = @import("std"); const microzig = @import("microzig"); +const mmio = microzig.mmio; const root = @import("root"); +pub const regs = struct { + // Interrupt Control and State Register + pub const ICSR = @intToPtr(*volatile mmio.Mmio(packed struct { + VECTACTIVE: u9, + reserved0: u2, + RETTOBASE: u1, + VECTPENDING: u9, + reserved1: u1, + ISRPENDING: u1, + ISRPREEMPT: u1, + reserved2: u1, + PENDSTCLR: u1, + PENDSTSET: u1, + PENDSVCLR: u1, + PENDSVSET: u1, + reserved3: u2, + NMIPENDSET: u1, + }), 0xE000ED04); +}; + +pub fn executing_isr() bool { + return regs.ICSR.read().VECTACTIVE != 0; +} + pub fn sei() void { asm volatile ("cpsie i"); }