Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/*
2 * Copyright (C) 2006 Atmark Techno, Inc.
3 *
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details.
7 */
8
9#ifndef _ASM_MICROBLAZE_IRQFLAGS_H
10#define _ASM_MICROBLAZE_IRQFLAGS_H
11
12#include <linux/irqflags.h>
13#include <asm/registers.h>
14
15# if CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR
16
17# define raw_local_irq_save(flags) \
18 do { \
19 asm volatile (" msrclr %0, %1; \
20 nop;" \
21 : "=r"(flags) \
22 : "i"(MSR_IE) \
23 : "memory"); \
24 } while (0)
25
26# define raw_local_irq_disable() \
27 do { \
28 asm volatile (" msrclr r0, %0; \
29 nop;" \
30 : \
31 : "i"(MSR_IE) \
32 : "memory"); \
33 } while (0)
34
35# define raw_local_irq_enable() \
36 do { \
37 asm volatile (" msrset r0, %0; \
38 nop;" \
39 : \
40 : "i"(MSR_IE) \
41 : "memory"); \
42 } while (0)
43
44# else /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR == 0 */
45
46# define raw_local_irq_save(flags) \
47 do { \
48 register unsigned tmp; \
49 asm volatile (" mfs %0, rmsr; \
50 nop; \
51 andi %1, %0, %2; \
52 mts rmsr, %1; \
53 nop;" \
54 : "=r"(flags), "=r" (tmp) \
55 : "i"(~MSR_IE) \
56 : "memory"); \
57 } while (0)
58
59# define raw_local_irq_disable() \
60 do { \
61 register unsigned tmp; \
62 asm volatile (" mfs %0, rmsr; \
63 nop; \
64 andi %0, %0, %1; \
65 mts rmsr, %0; \
66 nop;" \
67 : "=r"(tmp) \
68 : "i"(~MSR_IE) \
69 : "memory"); \
70 } while (0)
71
72# define raw_local_irq_enable() \
73 do { \
74 register unsigned tmp; \
75 asm volatile (" mfs %0, rmsr; \
76 nop; \
77 ori %0, %0, %1; \
78 mts rmsr, %0; \
79 nop;" \
80 : "=r"(tmp) \
81 : "i"(MSR_IE) \
82 : "memory"); \
83 } while (0)
84
85# endif /* CONFIG_XILINX_MICROBLAZE0_USE_MSR_INSTR */
86
87#define raw_local_irq_restore(flags) \
88 do { \
89 asm volatile (" mts rmsr, %0; \
90 nop;" \
91 : \
92 : "r"(flags) \
93 : "memory"); \
94 } while (0)
95
96static inline unsigned long get_msr(void)
97{
98 unsigned long flags;
99 asm volatile (" mfs %0, rmsr; \
100 nop;" \
101 : "=r"(flags) \
102 : \
103 : "memory"); \
104 return flags;
105}
106
107#define raw_local_save_flags(flags) ((flags) = get_msr())
108#define raw_irqs_disabled() ((get_msr() & MSR_IE) == 0)
109#define raw_irqs_disabled_flags(flags) ((flags & MSR_IE) == 0)
110
111#endif /* _ASM_MICROBLAZE_IRQFLAGS_H */