1#ifndef _ASM_SCORE_IRQFLAGS_H 2#define _ASM_SCORE_IRQFLAGS_H 3 4#ifndef __ASSEMBLY__ 5 6#define raw_local_irq_save(x) \ 7{ \ 8 __asm__ __volatile__( \ 9 "mfcr r8, cr0;" \ 10 "li r9, 0xfffffffe;" \ 11 "nop;" \ 12 "mv %0, r8;" \ 13 "and r8, r8, r9;" \ 14 "mtcr r8, cr0;" \ 15 "nop;" \ 16 "nop;" \ 17 "nop;" \ 18 "nop;" \ 19 "nop;" \ 20 : "=r" (x) \ 21 : \ 22 : "r8", "r9" \ 23 ); \ 24} 25 26#define raw_local_irq_restore(x) \ 27{ \ 28 __asm__ __volatile__( \ 29 "mfcr r8, cr0;" \ 30 "ldi r9, 0x1;" \ 31 "and %0, %0, r9;" \ 32 "or r8, r8, %0;" \ 33 "mtcr r8, cr0;" \ 34 "nop;" \ 35 "nop;" \ 36 "nop;" \ 37 "nop;" \ 38 "nop;" \ 39 : \ 40 : "r"(x) \ 41 : "r8", "r9" \ 42 ); \ 43} 44 45#define raw_local_irq_enable(void) \ 46{ \ 47 __asm__ __volatile__( \ 48 "mfcr\tr8,cr0;" \ 49 "nop;" \ 50 "nop;" \ 51 "ori\tr8,0x1;" \ 52 "mtcr\tr8,cr0;" \ 53 "nop;" \ 54 "nop;" \ 55 "nop;" \ 56 "nop;" \ 57 "nop;" \ 58 : \ 59 : \ 60 : "r8"); \ 61} 62 63#define raw_local_irq_disable(void) \ 64{ \ 65 __asm__ __volatile__( \ 66 "mfcr\tr8,cr0;" \ 67 "nop;" \ 68 "nop;" \ 69 "srli\tr8,r8,1;" \ 70 "slli\tr8,r8,1;" \ 71 "mtcr\tr8,cr0;" \ 72 "nop;" \ 73 "nop;" \ 74 "nop;" \ 75 "nop;" \ 76 "nop;" \ 77 : \ 78 : \ 79 : "r8"); \ 80} 81 82#define raw_local_save_flags(x) \ 83{ \ 84 __asm__ __volatile__( \ 85 "mfcr r8, cr0;" \ 86 "nop;" \ 87 "nop;" \ 88 "mv %0, r8;" \ 89 "nop;" \ 90 "nop;" \ 91 "nop;" \ 92 "nop;" \ 93 "nop;" \ 94 "ldi r9, 0x1;" \ 95 "and %0, %0, r9;" \ 96 : "=r" (x) \ 97 : \ 98 : "r8", "r9" \ 99 ); \ 100} 101 102static inline int raw_irqs_disabled_flags(unsigned long flags) 103{ 104 return !(flags & 1); 105} 106 107#endif 108 109#endif /* _ASM_SCORE_IRQFLAGS_H */ 110