| #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;" \ |
| "ldi r9, 0x1;" \ |
| "and %0, %0, r9;" \ |
| : "=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 */ |