From b3a12553f88eee076182bbe4b7479bd3b918fdd9 Mon Sep 17 00:00:00 2001 From: Jaroslaw Pelczar Date: Tue, 3 Sep 2019 18:19:19 +0200 Subject: [PATCH] arm64: Implement IRQ masking for kernel Signed-off-by: Jaroslaw Pelczar Change-Id: I05e41f8cd28834e4bcc9f02b4694a640f460cd17 Reviewed-on: https://review.haiku-os.org/c/haiku/+/1856 Reviewed-by: waddlesplash --- headers/private/kernel/arch/arm64/arch_int.h | 48 ++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/headers/private/kernel/arch/arm64/arch_int.h b/headers/private/kernel/arch/arm64/arch_int.h index 55e1afafd6..a1c292d67e 100644 --- a/headers/private/kernel/arch/arm64/arch_int.h +++ b/headers/private/kernel/arch/arm64/arch_int.h @@ -7,9 +7,57 @@ #include +#include #define NUM_IO_VECTORS 1024 +static inline void +arch_int_enable_interrupts_inline(void) +{ + __asm__ __volatile__("msr daifclr, #2"); +} + + +static inline int +arch_int_disable_interrupts_inline(void) +{ + uint32 flags; + + __asm__ __volatile__( + "mrs %0, daif\n\t" + "msr daifset, #2\n\t" + : "=&r"(flags)); + + return flags; +} + + +static inline void +arch_int_restore_interrupts_inline(int oldState) +{ + WRITE_SPECIALREG(daif, oldState); +} + + +static inline bool +arch_int_are_interrupts_enabled_inline(void) +{ + uint32 flags; + + __asm__ __volatile__( + "mrs %0, daif\n\t" + : "=&r"(flags)); + + return (flags & PSR_I) == 0; +} + +// map the functions to the inline versions +#define arch_int_enable_interrupts() arch_int_enable_interrupts_inline() +#define arch_int_disable_interrupts() arch_int_disable_interrupts_inline() +#define arch_int_restore_interrupts(status) \ + arch_int_restore_interrupts_inline(status) +#define arch_int_are_interrupts_enabled() \ + arch_int_are_interrupts_enabled_inline() #endif /* _KERNEL_ARCH_ARM64_ARCH_INT_H_ */