Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/m32r/include/asm/irqflags.h
10818 views
1
/*
2
* This file is subject to the terms and conditions of the GNU General Public
3
* License. See the file "COPYING" in the main directory of this archive
4
* for more details.
5
*
6
* Copyright (C) 2001 Hiroyuki Kondo, Hirokazu Takata, and Hitoshi Yamamoto
7
* Copyright (C) 2004, 2006 Hirokazu Takata <takata at linux-m32r.org>
8
*/
9
10
#ifndef _ASM_M32R_IRQFLAGS_H
11
#define _ASM_M32R_IRQFLAGS_H
12
13
#include <linux/types.h>
14
15
static inline unsigned long arch_local_save_flags(void)
16
{
17
unsigned long flags;
18
asm volatile("mvfc %0,psw" : "=r"(flags));
19
return flags;
20
}
21
22
static inline void arch_local_irq_disable(void)
23
{
24
#if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
25
asm volatile (
26
"clrpsw #0x40 -> nop"
27
: : : "memory");
28
#else
29
unsigned long tmpreg0, tmpreg1;
30
asm volatile (
31
"ld24 %0, #0 ; Use 32-bit insn. \n\t"
32
"mvfc %1, psw ; No interrupt can be accepted here. \n\t"
33
"mvtc %0, psw \n\t"
34
"and3 %0, %1, #0xffbf \n\t"
35
"mvtc %0, psw \n\t"
36
: "=&r" (tmpreg0), "=&r" (tmpreg1)
37
:
38
: "cbit", "memory");
39
#endif
40
}
41
42
static inline void arch_local_irq_enable(void)
43
{
44
#if !defined(CONFIG_CHIP_M32102) && !defined(CONFIG_CHIP_M32104)
45
asm volatile (
46
"setpsw #0x40 -> nop"
47
: : : "memory");
48
#else
49
unsigned long tmpreg;
50
asm volatile (
51
"mvfc %0, psw; \n\t"
52
"or3 %0, %0, #0x0040; \n\t"
53
"mvtc %0, psw; \n\t"
54
: "=&r" (tmpreg)
55
:
56
: "cbit", "memory");
57
#endif
58
}
59
60
static inline unsigned long arch_local_irq_save(void)
61
{
62
unsigned long flags;
63
64
#if !(defined(CONFIG_CHIP_M32102) || defined(CONFIG_CHIP_M32104))
65
asm volatile (
66
"mvfc %0, psw; \n\t"
67
"clrpsw #0x40 -> nop; \n\t"
68
: "=r" (flags)
69
:
70
: "memory");
71
#else
72
unsigned long tmpreg;
73
asm volatile (
74
"ld24 %1, #0 \n\t"
75
"mvfc %0, psw \n\t"
76
"mvtc %1, psw \n\t"
77
"and3 %1, %0, #0xffbf \n\t"
78
"mvtc %1, psw \n\t"
79
: "=r" (flags), "=&r" (tmpreg)
80
:
81
: "cbit", "memory");
82
#endif
83
return flags;
84
}
85
86
static inline void arch_local_irq_restore(unsigned long flags)
87
{
88
asm volatile("mvtc %0,psw"
89
:
90
: "r" (flags)
91
: "cbit", "memory");
92
}
93
94
static inline bool arch_irqs_disabled_flags(unsigned long flags)
95
{
96
return !(flags & 0x40);
97
}
98
99
static inline bool arch_irqs_disabled(void)
100
{
101
return arch_irqs_disabled_flags(arch_local_save_flags());
102
}
103
104
#endif /* _ASM_M32R_IRQFLAGS_H */
105
106