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