diff options
Diffstat (limited to 'include/asm-x86_64/system.h')
-rw-r--r-- | include/asm-x86_64/system.h | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/include/asm-x86_64/system.h b/include/asm-x86_64/system.h index 80272190570e..38c1e8a69c9c 100644 --- a/include/asm-x86_64/system.h +++ b/include/asm-x86_64/system.h | |||
@@ -326,8 +326,25 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, | |||
326 | /* interrupt control.. */ | 326 | /* interrupt control.. */ |
327 | #define local_save_flags(x) do { warn_if_not_ulong(x); __asm__ __volatile__("# save_flags \n\t pushfq ; popq %q0":"=g" (x): /* no input */ :"memory"); } while (0) | 327 | #define local_save_flags(x) do { warn_if_not_ulong(x); __asm__ __volatile__("# save_flags \n\t pushfq ; popq %q0":"=g" (x): /* no input */ :"memory"); } while (0) |
328 | #define local_irq_restore(x) __asm__ __volatile__("# restore_flags \n\t pushq %0 ; popfq": /* no output */ :"g" (x):"memory", "cc") | 328 | #define local_irq_restore(x) __asm__ __volatile__("# restore_flags \n\t pushq %0 ; popfq": /* no output */ :"g" (x):"memory", "cc") |
329 | |||
330 | #ifdef CONFIG_X86_VSMP | ||
331 | /* Interrupt control for VSMP architecture */ | ||
332 | #define local_irq_disable() do { unsigned long flags; local_save_flags(flags); local_irq_restore((flags & ~(1 << 9)) | (1 << 18)); } while (0) | ||
333 | #define local_irq_enable() do { unsigned long flags; local_save_flags(flags); local_irq_restore((flags | (1 << 9)) & ~(1 << 18)); } while (0) | ||
334 | |||
335 | #define irqs_disabled() \ | ||
336 | ({ \ | ||
337 | unsigned long flags; \ | ||
338 | local_save_flags(flags); \ | ||
339 | (flags & (1<<18)) || !(flags & (1<<9)); \ | ||
340 | }) | ||
341 | |||
342 | /* For spinlocks etc */ | ||
343 | #define local_irq_save(x) do { local_save_flags(x); local_irq_restore((x & ~(1 << 9)) | (1 << 18)); } while (0) | ||
344 | #else /* CONFIG_X86_VSMP */ | ||
329 | #define local_irq_disable() __asm__ __volatile__("cli": : :"memory") | 345 | #define local_irq_disable() __asm__ __volatile__("cli": : :"memory") |
330 | #define local_irq_enable() __asm__ __volatile__("sti": : :"memory") | 346 | #define local_irq_enable() __asm__ __volatile__("sti": : :"memory") |
347 | |||
331 | /* used in the idle loop; sti takes one instruction cycle to complete */ | 348 | /* used in the idle loop; sti takes one instruction cycle to complete */ |
332 | #define safe_halt() __asm__ __volatile__("sti; hlt": : :"memory") | 349 | #define safe_halt() __asm__ __volatile__("sti; hlt": : :"memory") |
333 | /* used when interrupts are already enabled or to shutdown the processor */ | 350 | /* used when interrupts are already enabled or to shutdown the processor */ |
@@ -342,6 +359,7 @@ static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, | |||
342 | 359 | ||
343 | /* For spinlocks etc */ | 360 | /* For spinlocks etc */ |
344 | #define local_irq_save(x) do { warn_if_not_ulong(x); __asm__ __volatile__("# local_irq_save \n\t pushfq ; popq %0 ; cli":"=g" (x): /* no input */ :"memory"); } while (0) | 361 | #define local_irq_save(x) do { warn_if_not_ulong(x); __asm__ __volatile__("# local_irq_save \n\t pushfq ; popq %0 ; cli":"=g" (x): /* no input */ :"memory"); } while (0) |
362 | #endif | ||
345 | 363 | ||
346 | void cpu_idle_wait(void); | 364 | void cpu_idle_wait(void); |
347 | 365 | ||