diff options
Diffstat (limited to 'include/asm-i386/irqflags.h')
-rw-r--r-- | include/asm-i386/irqflags.h | 64 |
1 files changed, 44 insertions, 20 deletions
diff --git a/include/asm-i386/irqflags.h b/include/asm-i386/irqflags.h index 17b18cf4fe9d..eff8585cb741 100644 --- a/include/asm-i386/irqflags.h +++ b/include/asm-i386/irqflags.h | |||
@@ -9,6 +9,43 @@ | |||
9 | */ | 9 | */ |
10 | #ifndef _ASM_IRQFLAGS_H | 10 | #ifndef _ASM_IRQFLAGS_H |
11 | #define _ASM_IRQFLAGS_H | 11 | #define _ASM_IRQFLAGS_H |
12 | #include <asm/processor-flags.h> | ||
13 | |||
14 | #ifndef __ASSEMBLY__ | ||
15 | static inline unsigned long native_save_fl(void) | ||
16 | { | ||
17 | unsigned long f; | ||
18 | asm volatile("pushfl ; popl %0":"=g" (f): /* no input */); | ||
19 | return f; | ||
20 | } | ||
21 | |||
22 | static inline void native_restore_fl(unsigned long f) | ||
23 | { | ||
24 | asm volatile("pushl %0 ; popfl": /* no output */ | ||
25 | :"g" (f) | ||
26 | :"memory", "cc"); | ||
27 | } | ||
28 | |||
29 | static inline void native_irq_disable(void) | ||
30 | { | ||
31 | asm volatile("cli": : :"memory"); | ||
32 | } | ||
33 | |||
34 | static inline void native_irq_enable(void) | ||
35 | { | ||
36 | asm volatile("sti": : :"memory"); | ||
37 | } | ||
38 | |||
39 | static inline void native_safe_halt(void) | ||
40 | { | ||
41 | asm volatile("sti; hlt": : :"memory"); | ||
42 | } | ||
43 | |||
44 | static inline void native_halt(void) | ||
45 | { | ||
46 | asm volatile("hlt": : :"memory"); | ||
47 | } | ||
48 | #endif /* __ASSEMBLY__ */ | ||
12 | 49 | ||
13 | #ifdef CONFIG_PARAVIRT | 50 | #ifdef CONFIG_PARAVIRT |
14 | #include <asm/paravirt.h> | 51 | #include <asm/paravirt.h> |
@@ -17,35 +54,22 @@ | |||
17 | 54 | ||
18 | static inline unsigned long __raw_local_save_flags(void) | 55 | static inline unsigned long __raw_local_save_flags(void) |
19 | { | 56 | { |
20 | unsigned long flags; | 57 | return native_save_fl(); |
21 | |||
22 | __asm__ __volatile__( | ||
23 | "pushfl ; popl %0" | ||
24 | : "=g" (flags) | ||
25 | : /* no input */ | ||
26 | ); | ||
27 | |||
28 | return flags; | ||
29 | } | 58 | } |
30 | 59 | ||
31 | static inline void raw_local_irq_restore(unsigned long flags) | 60 | static inline void raw_local_irq_restore(unsigned long flags) |
32 | { | 61 | { |
33 | __asm__ __volatile__( | 62 | native_restore_fl(flags); |
34 | "pushl %0 ; popfl" | ||
35 | : /* no output */ | ||
36 | :"g" (flags) | ||
37 | :"memory", "cc" | ||
38 | ); | ||
39 | } | 63 | } |
40 | 64 | ||
41 | static inline void raw_local_irq_disable(void) | 65 | static inline void raw_local_irq_disable(void) |
42 | { | 66 | { |
43 | __asm__ __volatile__("cli" : : : "memory"); | 67 | native_irq_disable(); |
44 | } | 68 | } |
45 | 69 | ||
46 | static inline void raw_local_irq_enable(void) | 70 | static inline void raw_local_irq_enable(void) |
47 | { | 71 | { |
48 | __asm__ __volatile__("sti" : : : "memory"); | 72 | native_irq_enable(); |
49 | } | 73 | } |
50 | 74 | ||
51 | /* | 75 | /* |
@@ -54,7 +78,7 @@ static inline void raw_local_irq_enable(void) | |||
54 | */ | 78 | */ |
55 | static inline void raw_safe_halt(void) | 79 | static inline void raw_safe_halt(void) |
56 | { | 80 | { |
57 | __asm__ __volatile__("sti; hlt" : : : "memory"); | 81 | native_safe_halt(); |
58 | } | 82 | } |
59 | 83 | ||
60 | /* | 84 | /* |
@@ -63,7 +87,7 @@ static inline void raw_safe_halt(void) | |||
63 | */ | 87 | */ |
64 | static inline void halt(void) | 88 | static inline void halt(void) |
65 | { | 89 | { |
66 | __asm__ __volatile__("hlt": : :"memory"); | 90 | native_halt(); |
67 | } | 91 | } |
68 | 92 | ||
69 | /* | 93 | /* |
@@ -96,7 +120,7 @@ static inline unsigned long __raw_local_irq_save(void) | |||
96 | 120 | ||
97 | static inline int raw_irqs_disabled_flags(unsigned long flags) | 121 | static inline int raw_irqs_disabled_flags(unsigned long flags) |
98 | { | 122 | { |
99 | return !(flags & (1 << 9)); | 123 | return !(flags & X86_EFLAGS_IF); |
100 | } | 124 | } |
101 | 125 | ||
102 | static inline int raw_irqs_disabled(void) | 126 | static inline int raw_irqs_disabled(void) |