#ifndef _ASM_SCORE_IRQFLAGS_H | |
#define _ASM_SCORE_IRQFLAGS_H | |
#ifndef __ASSEMBLY__ | |
#define raw_local_irq_save(x) \ | |
{ \ | |
__asm__ __volatile__( \ | |
"mfcr r8, cr0;" \ | |
"li r9, 0xfffffffe;" \ | |
"nop;" \ | |
"mv %0, r8;" \ | |
"and r8, r8, r9;" \ | |
"mtcr r8, cr0;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
: "=r" (x) \ | |
: \ | |
: "r8", "r9" \ | |
); \ | |
} | |
#define raw_local_irq_restore(x) \ | |
{ \ | |
__asm__ __volatile__( \ | |
"mfcr r8, cr0;" \ | |
"ldi r9, 0x1;" \ | |
"and %0, %0, r9;" \ | |
"or r8, r8, %0;" \ | |
"mtcr r8, cr0;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
: \ | |
: "r"(x) \ | |
: "r8", "r9" \ | |
); \ | |
} | |
#define raw_local_irq_enable(void) \ | |
{ \ | |
__asm__ __volatile__( \ | |
"mfcr\tr8,cr0;" \ | |
"nop;" \ | |
"nop;" \ | |
"ori\tr8,0x1;" \ | |
"mtcr\tr8,cr0;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
: \ | |
: \ | |
: "r8"); \ | |
} | |
#define raw_local_irq_disable(void) \ | |
{ \ | |
__asm__ __volatile__( \ | |
"mfcr\tr8,cr0;" \ | |
"nop;" \ | |
"nop;" \ | |
"srli\tr8,r8,1;" \ | |
"slli\tr8,r8,1;" \ | |
"mtcr\tr8,cr0;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
: \ | |
: \ | |
: "r8"); \ | |
} | |
#define raw_local_save_flags(x) \ | |
{ \ | |
__asm__ __volatile__( \ | |
"mfcr r8, cr0;" \ | |
"nop;" \ | |
"nop;" \ | |
"mv %0, r8;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"nop;" \ | |
"ldi r9, 0x1;" \ | |
"and %0, %0, r9;" \ | |
: "=r" (x) \ | |
: \ | |
: "r8", "r9" \ | |
); \ | |
} | |
static inline int raw_irqs_disabled_flags(unsigned long flags) | |
{ | |
return !(flags & 1); | |
} | |
#endif | |
#endif /* _ASM_SCORE_IRQFLAGS_H */ |