1 /* Portions taken from Linux arch arm64 */
2 #ifndef __ASM_ARM64_SYSTEM_H
3 #define __ASM_ARM64_SYSTEM_H
4
5 #include <asm/arm64/cmpxchg.h>
6
7 /* Uses uimm4 as a bitmask to select the clearing of one or more of
8 * the DAIF exception mask bits:
9 * bit 3 selects the D mask,
10 * bit 2 the A mask,
11 * bit 1 the I mask and
12 * bit 0 the F mask.
13 */
14
15 #define local_fiq_disable() asm volatile ( "msr daifset, #1\n" ::: "memory" )
16 #define local_fiq_enable() asm volatile ( "msr daifclr, #1\n" ::: "memory" )
17 #define local_irq_disable() asm volatile ( "msr daifset, #2\n" ::: "memory" )
18 #define local_irq_enable() asm volatile ( "msr daifclr, #2\n" ::: "memory" )
19 #define local_abort_disable() asm volatile ( "msr daifset, #4\n" ::: "memory" )
20 #define local_abort_enable() asm volatile ( "msr daifclr, #4\n" ::: "memory" )
21
22 #define local_save_flags(x) \
23 ({ \
24 BUILD_BUG_ON(sizeof(x) != sizeof(long)); \
25 asm volatile( \
26 "mrs %0, daif // local_save_flags\n" \
27 : "=r" (x) \
28 : \
29 : "memory"); \
30 })
31
32 #define local_irq_save(x) \
33 ({ \
34 local_save_flags(x); \
35 local_irq_disable(); \
36 })
37 #define local_irq_restore(x) \
38 ({ \
39 BUILD_BUG_ON(sizeof(x) != sizeof(long)); \
40 asm volatile ( \
41 "msr daif, %0 // local_irq_restore" \
42 : \
43 : "r" (x) \
44 : "memory"); \
45 })
46
local_irq_is_enabled(void)47 static inline int local_irq_is_enabled(void)
48 {
49 unsigned long flags;
50 local_save_flags(flags);
51 return !(flags & PSR_IRQ_MASK);
52 }
53
local_fiq_is_enabled(void)54 static inline int local_fiq_is_enabled(void)
55 {
56 unsigned long flags;
57 local_save_flags(flags);
58 return !(flags & PSR_FIQ_MASK);
59 }
60
61 #endif
62 /*
63 * Local variables:
64 * mode: C
65 * c-file-style: "BSD"
66 * c-basic-offset: 4
67 * indent-tabs-mode: nil
68 * End:
69 */
70