 b4f4372f96
			
		
	
	
	b4f4372f96
	
	
	
		
			
			So that we can profile code even in a local_irq_disable() section, only write 14 (instead of 15) into the %pil register to disable IRQs. This allows PIL level 15 to serve as a pseudo NMI. Signed-off-by: David S. Miller <davem@davemloft.net>
		
			
				
	
	
		
			91 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
	
		
			1.6 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * include/asm/irqflags.h
 | |
|  *
 | |
|  * IRQ flags handling
 | |
|  *
 | |
|  * This file gets included from lowlevel asm headers too, to provide
 | |
|  * wrapped versions of the local_irq_*() APIs, based on the
 | |
|  * raw_local_irq_*() functions from the lowlevel headers.
 | |
|  */
 | |
| #ifndef _ASM_IRQFLAGS_H
 | |
| #define _ASM_IRQFLAGS_H
 | |
| 
 | |
| #include <asm/pil.h>
 | |
| 
 | |
| #ifndef __ASSEMBLY__
 | |
| 
 | |
| static inline unsigned long __raw_local_save_flags(void)
 | |
| {
 | |
| 	unsigned long flags;
 | |
| 
 | |
| 	__asm__ __volatile__(
 | |
| 		"rdpr	%%pil, %0"
 | |
| 		: "=r" (flags)
 | |
| 	);
 | |
| 
 | |
| 	return flags;
 | |
| }
 | |
| 
 | |
| #define raw_local_save_flags(flags) \
 | |
| 		do { (flags) = __raw_local_save_flags(); } while (0)
 | |
| 
 | |
| static inline void raw_local_irq_restore(unsigned long flags)
 | |
| {
 | |
| 	__asm__ __volatile__(
 | |
| 		"wrpr	%0, %%pil"
 | |
| 		: /* no output */
 | |
| 		: "r" (flags)
 | |
| 		: "memory"
 | |
| 	);
 | |
| }
 | |
| 
 | |
| static inline void raw_local_irq_disable(void)
 | |
| {
 | |
| 	__asm__ __volatile__(
 | |
| 		"wrpr	%0, %%pil"
 | |
| 		: /* no outputs */
 | |
| 		: "i" (PIL_NORMAL_MAX)
 | |
| 		: "memory"
 | |
| 	);
 | |
| }
 | |
| 
 | |
| static inline void raw_local_irq_enable(void)
 | |
| {
 | |
| 	__asm__ __volatile__(
 | |
| 		"wrpr	0, %%pil"
 | |
| 		: /* no outputs */
 | |
| 		: /* no inputs */
 | |
| 		: "memory"
 | |
| 	);
 | |
| }
 | |
| 
 | |
| static inline int raw_irqs_disabled_flags(unsigned long flags)
 | |
| {
 | |
| 	return (flags > 0);
 | |
| }
 | |
| 
 | |
| static inline int raw_irqs_disabled(void)
 | |
| {
 | |
| 	unsigned long flags = __raw_local_save_flags();
 | |
| 
 | |
| 	return raw_irqs_disabled_flags(flags);
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * For spinlocks, etc:
 | |
|  */
 | |
| static inline unsigned long __raw_local_irq_save(void)
 | |
| {
 | |
| 	unsigned long flags = __raw_local_save_flags();
 | |
| 
 | |
| 	raw_local_irq_disable();
 | |
| 
 | |
| 	return flags;
 | |
| }
 | |
| 
 | |
| #define raw_local_irq_save(flags) \
 | |
| 		do { (flags) = __raw_local_irq_save(); } while (0)
 | |
| 
 | |
| #endif /* (__ASSEMBLY__) */
 | |
| 
 | |
| #endif /* !(_ASM_IRQFLAGS_H) */
 |