]> CyberLeo.Net >> Repos - FreeBSD/stable/8.git/blob - sys/ia64/include/cpufunc.h
MFC rev 201032:
[FreeBSD/stable/8.git] / sys / ia64 / include / cpufunc.h
1 /*-
2  * Copyright (c) 1998 Doug Rabson
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28
29 #ifndef _MACHINE_CPUFUNC_H_
30 #define _MACHINE_CPUFUNC_H_
31
32 #ifdef _KERNEL
33
34 #include <sys/types.h>
35 #include <machine/ia64_cpu.h>
36 #include <machine/vmparam.h>
37
38 #ifndef _SYS_CDEFS_H_
39 #error this file needs sys/cdefs.h as a prerequisite
40 #endif
41
42 struct thread;
43
44 #define IA64_FIXED_BREAK        0x84B5D
45
46 #ifdef __GNUCLIKE_ASM
47
48 static __inline void
49 breakpoint(void)
50 {
51         __asm __volatile("break.m %0" :: "i"(IA64_FIXED_BREAK));
52 }
53
54 #define HAVE_INLINE_FFS
55 #define ffs(x)  __builtin_ffs(x)
56
57 #define __MEMIO_ADDR(x)         (void*)(IA64_PHYS_TO_RR6(x))
58 extern void *ia64_ioport_address(u_int);
59 #define __PIO_ADDR(x)           ia64_ioport_address(x)
60
61 /*
62  * I/O port reads with ia32 semantics.
63  */
64 static __inline uint8_t
65 inb(unsigned int port)
66 {
67         uint8_t v;
68
69         ia64_mf();
70         v = ia64_ld1(__PIO_ADDR(port));
71         ia64_mf_a();
72         ia64_mf();
73         return (v);
74 }
75
76 static __inline uint16_t
77 inw(unsigned int port)
78 {
79         uint16_t v;
80
81         ia64_mf();
82         v = ia64_ld2(__PIO_ADDR(port));
83         ia64_mf_a();
84         ia64_mf();
85         return (v);
86 }
87
88 static __inline uint32_t
89 inl(unsigned int port)
90 {
91         uint32_t v;
92
93         ia64_mf();
94         v = ia64_ld4(__PIO_ADDR(port));
95         ia64_mf_a();
96         ia64_mf();
97         return (v);
98 }
99
100 static __inline void
101 insb(unsigned int port, void *addr, size_t count)
102 {
103         uint8_t *buf = addr;
104         while (count--)
105                 *buf++ = inb(port);
106 }
107
108 static __inline void
109 insw(unsigned int port, void *addr, size_t count)
110 {
111         uint16_t *buf = addr;
112         while (count--)
113                 *buf++ = inw(port);
114 }
115
116 static __inline void
117 insl(unsigned int port, void *addr, size_t count)
118 {
119         uint32_t *buf = addr;
120         while (count--)
121                 *buf++ = inl(port);
122 }
123
124 static __inline void
125 outb(unsigned int port, uint8_t data)
126 {
127
128         ia64_mf();
129         ia64_st1(__PIO_ADDR(port), data);
130         ia64_mf_a();
131         ia64_mf();
132 }
133
134 static __inline void
135 outw(unsigned int port, uint16_t data)
136 {
137
138         ia64_mf();
139         ia64_st2(__PIO_ADDR(port), data);
140         ia64_mf_a();
141         ia64_mf();
142 }
143
144 static __inline void
145 outl(unsigned int port, uint32_t data)
146 {
147
148         ia64_mf();
149         ia64_st4(__PIO_ADDR(port), data);
150         ia64_mf_a();
151         ia64_mf();
152 }
153
154 static __inline void
155 outsb(unsigned int port, const void *addr, size_t count)
156 {
157         const uint8_t *buf = addr;
158         while (count--)
159                 outb(port, *buf++);
160 }
161
162 static __inline void
163 outsw(unsigned int port, const void *addr, size_t count)
164 {
165         const uint16_t *buf = addr;
166         while (count--)
167                 outw(port, *buf++);
168 }
169
170 static __inline void
171 outsl(unsigned int port, const void *addr, size_t count)
172 {
173         const uint32_t *buf = addr;
174         while (count--)
175                 outl(port, *buf++);
176 }
177
178 static __inline void
179 disable_intr(void)
180 {
181         __asm __volatile ("rsm psr.i");
182 }
183
184 static __inline void
185 enable_intr(void)
186 {
187         __asm __volatile ("ssm psr.i;; srlz.d");
188 }
189
190 static __inline register_t
191 intr_disable(void)
192 {
193         register_t psr;
194         __asm __volatile ("mov %0=psr;;" : "=r"(psr));
195         disable_intr();
196         return ((psr & IA64_PSR_I) ? 1 : 0);
197 }
198
199 static __inline void
200 intr_restore(register_t ie)
201 {
202         if (ie)
203                 enable_intr();
204 }
205
206 #endif /* __GNUCLIKE_ASM */
207
208 #endif /* _KERNEL */
209
210 #endif /* !_MACHINE_CPUFUNC_H_ */