xref: /haiku/headers/private/kernel/arch/arm64/arch_int.h (revision 97f11716bfaa0f385eb0e28a52bf56a5023b9e99)
13a72e3ebSJaroslaw Pelczar /*
23a72e3ebSJaroslaw Pelczar  * Copyright 2018, Jaroslaw Pelczar <jarek@jpelczar.com>
33a72e3ebSJaroslaw Pelczar  * Distributed under the terms of the MIT License.
43a72e3ebSJaroslaw Pelczar  */
53a72e3ebSJaroslaw Pelczar #ifndef _KERNEL_ARCH_ARM64_ARCH_INT_H_
63a72e3ebSJaroslaw Pelczar #define _KERNEL_ARCH_ARM64_ARCH_INT_H_
73a72e3ebSJaroslaw Pelczar 
83a72e3ebSJaroslaw Pelczar 
93a72e3ebSJaroslaw Pelczar #include <SupportDefs.h>
10b3a12553SJaroslaw Pelczar #include <kernel/arch/arm64/arm_registers.h>
113a72e3ebSJaroslaw Pelczar 
123a72e3ebSJaroslaw Pelczar 
133a72e3ebSJaroslaw Pelczar #define NUM_IO_VECTORS			1024
143a72e3ebSJaroslaw Pelczar 
15b3a12553SJaroslaw Pelczar static inline void
arch_int_enable_interrupts_inline(void)16b3a12553SJaroslaw Pelczar arch_int_enable_interrupts_inline(void)
17b3a12553SJaroslaw Pelczar {
18*d1c3213aSmilek7 	asm volatile("msr daifclr, #0xf" : : : "memory");
19b3a12553SJaroslaw Pelczar }
20b3a12553SJaroslaw Pelczar 
21b3a12553SJaroslaw Pelczar 
22b3a12553SJaroslaw Pelczar static inline int
arch_int_disable_interrupts_inline(void)23b3a12553SJaroslaw Pelczar arch_int_disable_interrupts_inline(void)
24b3a12553SJaroslaw Pelczar {
25b3a12553SJaroslaw Pelczar 	uint32 flags;
26b3a12553SJaroslaw Pelczar 
27*d1c3213aSmilek7 	asm volatile("mrs %0, daif\n" "msr daifset, #0xf" : "=r"(flags) : : "memory");
28b3a12553SJaroslaw Pelczar 
29b3a12553SJaroslaw Pelczar 	return flags;
30b3a12553SJaroslaw Pelczar }
31b3a12553SJaroslaw Pelczar 
32b3a12553SJaroslaw Pelczar 
33b3a12553SJaroslaw Pelczar static inline void
arch_int_restore_interrupts_inline(int oldState)34b3a12553SJaroslaw Pelczar arch_int_restore_interrupts_inline(int oldState)
35b3a12553SJaroslaw Pelczar {
36*d1c3213aSmilek7 	asm volatile("msr daif, %0" : : "r"(oldState) : "memory");
37b3a12553SJaroslaw Pelczar }
38b3a12553SJaroslaw Pelczar 
39b3a12553SJaroslaw Pelczar 
40b3a12553SJaroslaw Pelczar static inline bool
arch_int_are_interrupts_enabled_inline(void)41b3a12553SJaroslaw Pelczar arch_int_are_interrupts_enabled_inline(void)
42b3a12553SJaroslaw Pelczar {
43*d1c3213aSmilek7 	return (READ_SPECIALREG(DAIF) & PSR_I) == 0;
44b3a12553SJaroslaw Pelczar }
45b3a12553SJaroslaw Pelczar 
46*d1c3213aSmilek7 
47b3a12553SJaroslaw Pelczar // map the functions to the inline versions
48b3a12553SJaroslaw Pelczar #define arch_int_enable_interrupts()	arch_int_enable_interrupts_inline()
49b3a12553SJaroslaw Pelczar #define arch_int_disable_interrupts()	arch_int_disable_interrupts_inline()
50b3a12553SJaroslaw Pelczar #define arch_int_restore_interrupts(status)	\
51b3a12553SJaroslaw Pelczar 	arch_int_restore_interrupts_inline(status)
52b3a12553SJaroslaw Pelczar #define arch_int_are_interrupts_enabled()	\
53b3a12553SJaroslaw Pelczar 	arch_int_are_interrupts_enabled_inline()
543a72e3ebSJaroslaw Pelczar 
55*d1c3213aSmilek7 
563a72e3ebSJaroslaw Pelczar #endif /* _KERNEL_ARCH_ARM64_ARCH_INT_H_ */
57