1
2
3
4
5
6
7#ifndef __ASM_NDS_SYSTEM_H
8#define __ASM_NDS_SYSTEM_H
9
10
11
12
13
14extern int irq_flags;
15
16#define local_irq_enable() \
17 __asm__ __volatile__ ( \
18 "mfsr %0, $psw\n\t" \
19 "andi %0, %0, 0x1\n\t" \
20 "setgie.e\n\t" \
21 : \
22 : "r" (irq_flags) \
23 )
24
25#define local_irq_disable() \
26 do { \
27 int __tmp_dummy; \
28 __asm__ __volatile__ ( \
29 "mfsr %0, $psw\n\t" \
30 "andi %0, %0, 0x1\n\t" \
31 "setgie.d\n\t" \
32 "dsb\n\t" \
33 : "=r" (__tmp_dummy) \
34 ); \
35 } while (0)
36
37#define local_irq_save(x) \
38 __asm__ __volatile__ ( \
39 "mfsr %0, $psw\n\t" \
40 "andi %0, %0, 0x1\n\t" \
41 "setgie.d\n\t" \
42 "dsb\n\t" \
43 : "=&r" (x) \
44 )
45
46#define local_save_flags(x) \
47 __asm__ __volatile__ ( \
48 "mfsr %0, $psw\n\t" \
49 "andi %0, %0, 0x1\n\t" \
50 "setgie.e\n\t" \
51 "setgie.d\n\t" \
52 : "=r" (x) \
53 )
54
55#define irqs_enabled_from_flags(x) ((x) != 0x1f)
56
57#define local_irq_restore(x) \
58 do { \
59 if (irqs_enabled_from_flags(x)) \
60 local_irq_enable(); \
61 } while (0)
62
63
64
65
66#define nop() asm volatile ("nop;\n\t" : : )
67#define mb() asm volatile ("" : : : "memory")
68#define rmb() asm volatile ("" : : : "memory")
69#define wmb() asm volatile ("" : : : "memory")
70
71#endif
72