xref: /haiku/headers/private/kernel/arch/arm64/arch_int.h (revision cb29eafe2586fdb2d7685afa69fdab5d88a8b576)
1 /*
2  * Copyright 2018, Jaroslaw Pelczar <jarek@jpelczar.com>
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _KERNEL_ARCH_ARM64_ARCH_INT_H_
6 #define _KERNEL_ARCH_ARM64_ARCH_INT_H_
7 
8 
9 #include <SupportDefs.h>
10 #include <kernel/arch/arm64/arm_registers.h>
11 
12 
13 #define NUM_IO_VECTORS			1024
14 
15 static inline void
16 arch_int_enable_interrupts_inline(void)
17 {
18 	__asm__ __volatile__("msr daifclr, #2");
19 }
20 
21 
22 static inline int
23 arch_int_disable_interrupts_inline(void)
24 {
25 	uint32 flags;
26 
27 	__asm__ __volatile__(
28 			"mrs %0, daif\n\t"
29 			"msr daifset, #2\n\t"
30 			: "=&r"(flags));
31 
32 	return flags;
33 }
34 
35 
36 static inline void
37 arch_int_restore_interrupts_inline(int oldState)
38 {
39 	WRITE_SPECIALREG(daif, oldState);
40 }
41 
42 
43 static inline bool
44 arch_int_are_interrupts_enabled_inline(void)
45 {
46 	uint32 flags;
47 
48 	__asm__ __volatile__(
49 			"mrs %0, daif\n\t"
50 			: "=&r"(flags));
51 
52 	return (flags & PSR_I) == 0;
53 }
54 
55 // map the functions to the inline versions
56 #define arch_int_enable_interrupts()	arch_int_enable_interrupts_inline()
57 #define arch_int_disable_interrupts()	arch_int_disable_interrupts_inline()
58 #define arch_int_restore_interrupts(status)	\
59 	arch_int_restore_interrupts_inline(status)
60 #define arch_int_are_interrupts_enabled()	\
61 	arch_int_are_interrupts_enabled_inline()
62 
63 #endif /* _KERNEL_ARCH_ARM64_ARCH_INT_H_ */
64