0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <asm/irqflags.h>
0012 #include <asm/hazards.h>
0013 #include <linux/compiler.h>
0014 #include <linux/preempt.h>
0015 #include <linux/export.h>
0016 #include <linux/stringify.h>
0017
0018 #if !defined(CONFIG_CPU_HAS_DIEI)
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038 notrace void arch_local_irq_disable(void)
0039 {
0040 preempt_disable_notrace();
0041
0042 __asm__ __volatile__(
0043 " .set push \n"
0044 " .set noat \n"
0045 " mfc0 $1,$12 \n"
0046 " ori $1,0x1f \n"
0047 " xori $1,0x1f \n"
0048 " .set noreorder \n"
0049 " mtc0 $1,$12 \n"
0050 " " __stringify(__irq_disable_hazard) " \n"
0051 " .set pop \n"
0052 :
0053 :
0054 : "memory");
0055
0056 preempt_enable_notrace();
0057 }
0058 EXPORT_SYMBOL(arch_local_irq_disable);
0059
0060 notrace unsigned long arch_local_irq_save(void)
0061 {
0062 unsigned long flags;
0063
0064 preempt_disable_notrace();
0065
0066 __asm__ __volatile__(
0067 " .set push \n"
0068 " .set reorder \n"
0069 " .set noat \n"
0070 " mfc0 %[flags], $12 \n"
0071 " ori $1, %[flags], 0x1f \n"
0072 " xori $1, 0x1f \n"
0073 " .set noreorder \n"
0074 " mtc0 $1, $12 \n"
0075 " " __stringify(__irq_disable_hazard) " \n"
0076 " .set pop \n"
0077 : [flags] "=r" (flags)
0078 :
0079 : "memory");
0080
0081 preempt_enable_notrace();
0082
0083 return flags;
0084 }
0085 EXPORT_SYMBOL(arch_local_irq_save);
0086
0087 notrace void arch_local_irq_restore(unsigned long flags)
0088 {
0089 unsigned long __tmp1;
0090
0091 preempt_disable_notrace();
0092
0093 __asm__ __volatile__(
0094 " .set push \n"
0095 " .set noreorder \n"
0096 " .set noat \n"
0097 " mfc0 $1, $12 \n"
0098 " andi %[flags], 1 \n"
0099 " ori $1, 0x1f \n"
0100 " xori $1, 0x1f \n"
0101 " or %[flags], $1 \n"
0102 " mtc0 %[flags], $12 \n"
0103 " " __stringify(__irq_disable_hazard) " \n"
0104 " .set pop \n"
0105 : [flags] "=r" (__tmp1)
0106 : "0" (flags)
0107 : "memory");
0108
0109 preempt_enable_notrace();
0110 }
0111 EXPORT_SYMBOL(arch_local_irq_restore);
0112
0113 #endif