AsmMacros.h revision ad01e365
1c06b6b69Smrg/*
2c06b6b69Smrg * (c) Copyright 1993,1994 by David Wexelblat <dwex@xfree86.org>
3c06b6b69Smrg *
4c06b6b69Smrg * Permission is hereby granted, free of charge, to any person obtaining a
5c06b6b69Smrg * copy of this software and associated documentation files (the "Software"),
6c06b6b69Smrg * to deal in the Software without restriction, including without limitation
7c06b6b69Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8c06b6b69Smrg * and/or sell copies of the Software, and to permit persons to whom the
9c06b6b69Smrg * Software is furnished to do so, subject to the following conditions:
10c06b6b69Smrg *
11c06b6b69Smrg * The above copyright notice and this permission notice shall be included in
12c06b6b69Smrg * all copies or substantial portions of the Software.
13c06b6b69Smrg *
14c06b6b69Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15c06b6b69Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16c06b6b69Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17c06b6b69Smrg * DAVID WEXELBLAT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
18c06b6b69Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
19c06b6b69Smrg * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20c06b6b69Smrg * SOFTWARE.
21c06b6b69Smrg *
22c06b6b69Smrg * Except as contained in this notice, the name of David Wexelblat shall not be
23c06b6b69Smrg * used in advertising or otherwise to promote the sale, use or other dealings
24c06b6b69Smrg * in this Software without prior written authorization from David Wexelblat.
25c06b6b69Smrg *
26c06b6b69Smrg */
27c06b6b69Smrg/*
28c06b6b69Smrg * Copyright 1997
29c06b6b69Smrg * Digital Equipment Corporation. All rights reserved.
30c06b6b69Smrg * This software is furnished under license and may be used and copied only in
31c06b6b69Smrg * accordance with the following terms and conditions.  Subject to these
32c06b6b69Smrg * conditions, you may download, copy, install, use, modify and distribute
33c06b6b69Smrg * this software in source and/or binary form. No title or ownership is
34c06b6b69Smrg * transferred hereby.
35c06b6b69Smrg *
36c06b6b69Smrg * 1) Any source code used, modified or distributed must reproduce and retain
37c06b6b69Smrg *    this copyright notice and list of conditions as they appear in the source
38c06b6b69Smrg *    file.
39c06b6b69Smrg *
40c06b6b69Smrg * 2) No right is granted to use any trade name, trademark, or logo of Digital
41c06b6b69Smrg *    Equipment Corporation. Neither the "Digital Equipment Corporation" name
42c06b6b69Smrg *    nor any trademark or logo of Digital Equipment Corporation may be used
43c06b6b69Smrg *    to endorse or promote products derived from this software without the
44c06b6b69Smrg *    prior written permission of Digital Equipment Corporation.
45c06b6b69Smrg *
46c06b6b69Smrg * 3) This software is provided "AS-IS" and any express or implied warranties,
47c06b6b69Smrg *    including but not limited to, any implied warranties of merchantability,
48c06b6b69Smrg *    fitness for a particular purpose, or non-infringement are disclaimed. In
49c06b6b69Smrg *    no event shall DIGITAL be liable for any damages whatsoever, and in
50c06b6b69Smrg *    particular, DIGITAL shall not be liable for special, indirect,
51c06b6b69Smrg *    consequential, or incidental damages or damages for
52c06b6b69Smrg *    lost profits, loss of revenue or loss of use, whether such damages arise
53c06b6b69Smrg *    in contract,
54c06b6b69Smrg *    negligence, tort, under statute, in equity, at law or otherwise, even if
55c06b6b69Smrg *    advised of the possibility of such damage.
56c06b6b69Smrg *
57c06b6b69Smrg */
58c06b6b69Smrg
59c06b6b69Smrg
60c06b6b69Smrg#if defined(__GNUC__)
61c06b6b69Smrg#if defined(linux) && (defined(__alpha__) || defined(__ia64__))
62c06b6b69Smrg#undef	inb
63c06b6b69Smrg#undef	inw
64c06b6b69Smrg#undef	inl
65c06b6b69Smrg#undef	outb
66c06b6b69Smrg#undef	outw
67c06b6b69Smrg#undef	outl
68c06b6b69Smrg#define inb _inb
69c06b6b69Smrg#define inw _inw
70c06b6b69Smrg#define inl _inl
71c06b6b69Smrg#define outb(p,v) _outb((v),(p))
72c06b6b69Smrg#define outw(p,v) _outw((v),(p))
73c06b6b69Smrg#define outl(p,v) _outl((v),(p))
74c06b6b69Smrg#else
75c06b6b69Smrg#if defined(__sparc__)
76c06b6b69Smrg#ifndef ASI_PL
77c06b6b69Smrg#define ASI_PL 0x88
78c06b6b69Smrg#endif
79c06b6b69Smrg
80c06b6b69Smrgstatic __inline__ void
81c06b6b69Smrgoutb(port, val)
82c06b6b69Smrgunsigned long port;
83c06b6b69Smrgchar val;
84c06b6b69Smrg{
85c06b6b69Smrg  __asm__ __volatile__("stba %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
86c06b6b69Smrg}
87c06b6b69Smrg
88c06b6b69Smrgstatic __inline__ void
89c06b6b69Smrgoutw(port, val)
90c06b6b69Smrgunsigned long port;
91c06b6b69Smrgchar val;
92c06b6b69Smrg{
93c06b6b69Smrg  __asm__ __volatile__("stha %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
94c06b6b69Smrg}
95c06b6b69Smrg
96c06b6b69Smrgstatic __inline__ void
97c06b6b69Smrgoutl(port, val)
98c06b6b69Smrgunsigned long port;
99c06b6b69Smrgchar val;
100c06b6b69Smrg{
101c06b6b69Smrg  __asm__ __volatile__("sta %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
102c06b6b69Smrg}
103c06b6b69Smrg
104c06b6b69Smrgstatic __inline__ unsigned int
105c06b6b69Smrginb(port)
106c06b6b69Smrgunsigned long port;
107c06b6b69Smrg{
108c06b6b69Smrg   unsigned char ret;
109c06b6b69Smrg   __asm__ __volatile__("lduba [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
110c06b6b69Smrg   return ret;
111c06b6b69Smrg}
112c06b6b69Smrg
113c06b6b69Smrgstatic __inline__ unsigned int
114c06b6b69Smrginw(port)
115c06b6b69Smrgunsigned long port;
116c06b6b69Smrg{
117c06b6b69Smrg   unsigned char ret;
118c06b6b69Smrg   __asm__ __volatile__("lduha [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
119c06b6b69Smrg   return ret;
120c06b6b69Smrg}
121c06b6b69Smrg
122c06b6b69Smrgstatic __inline__ unsigned int
123c06b6b69Smrginl(port)
124c06b6b69Smrgunsigned long port;
125c06b6b69Smrg{
126c06b6b69Smrg   unsigned char ret;
127c06b6b69Smrg   __asm__ __volatile__("lda [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
128c06b6b69Smrg   return ret;
129c06b6b69Smrg}
130c06b6b69Smrg#else
131c06b6b69Smrg#ifdef __arm32__
132ad01e365Sjoergextern unsigned int IOPortBase;  /* Memory mapped I/O port area */
133c06b6b69Smrg
134c06b6b69Smrgstatic __inline__ void
135c06b6b69Smrgoutb(port, val)
136c06b6b69Smrg     short port;
137c06b6b69Smrg     char val;
138c06b6b69Smrg{
139c06b6b69Smrg	 if ((unsigned short)port >= 0x400) return;
140c06b6b69Smrg
141c06b6b69Smrg	*(volatile unsigned char*)(((unsigned short)(port))+IOPortBase) = val;
142c06b6b69Smrg}
143c06b6b69Smrg
144c06b6b69Smrgstatic __inline__ void
145c06b6b69Smrgoutw(port, val)
146c06b6b69Smrg     short port;
147c06b6b69Smrg     short val;
148c06b6b69Smrg{
149c06b6b69Smrg	 if ((unsigned short)port >= 0x400) return;
150c06b6b69Smrg
151c06b6b69Smrg	*(volatile unsigned short*)(((unsigned short)(port))+IOPortBase) = val;
152c06b6b69Smrg}
153c06b6b69Smrg
154c06b6b69Smrgstatic __inline__ void
155c06b6b69Smrgoutl(port, val)
156c06b6b69Smrg     short port;
157c06b6b69Smrg     int val;
158c06b6b69Smrg{
159c06b6b69Smrg	 if ((unsigned short)port >= 0x400) return;
160c06b6b69Smrg
161c06b6b69Smrg	*(volatile unsigned long*)(((unsigned short)(port))+IOPortBase) = val;
162c06b6b69Smrg}
163c06b6b69Smrg
164c06b6b69Smrgstatic __inline__ unsigned int
165c06b6b69Smrginb(port)
166c06b6b69Smrg     short port;
167c06b6b69Smrg{
168c06b6b69Smrg	 if ((unsigned short)port >= 0x400) return((unsigned int)-1);
169c06b6b69Smrg
170c06b6b69Smrg	return(*(volatile unsigned char*)(((unsigned short)(port))+IOPortBase));
171c06b6b69Smrg}
172c06b6b69Smrg
173c06b6b69Smrgstatic __inline__ unsigned int
174c06b6b69Smrginw(port)
175c06b6b69Smrg     short port;
176c06b6b69Smrg{
177c06b6b69Smrg	 if ((unsigned short)port >= 0x400) return((unsigned int)-1);
178c06b6b69Smrg
179c06b6b69Smrg	return(*(volatile unsigned short*)(((unsigned short)(port))+IOPortBase));
180c06b6b69Smrg}
181c06b6b69Smrg
182c06b6b69Smrgstatic __inline__ unsigned int
183c06b6b69Smrginl(port)
184c06b6b69Smrg     short port;
185c06b6b69Smrg{
186c06b6b69Smrg	 if ((unsigned short)port >= 0x400) return((unsigned int)-1);
187c06b6b69Smrg
188c06b6b69Smrg	return(*(volatile unsigned long*)(((unsigned short)(port))+IOPortBase));
189c06b6b69Smrg}
190c06b6b69Smrg#else /* __arm32__ */
191c06b6b69Smrg#if defined(Lynx) && defined(__powerpc__)
192c06b6b69Smrgextern unsigned char *ioBase;
193c06b6b69Smrg
194c06b6b69Smrgstatic volatile void
195c06b6b69Smrgeieio()
196c06b6b69Smrg{
197c06b6b69Smrg	__asm__ __volatile__ ("eieio");
198c06b6b69Smrg}
199c06b6b69Smrg
200c06b6b69Smrgstatic void
201c06b6b69Smrgoutb(port, value)
202c06b6b69Smrgshort port;
203c06b6b69Smrgunsigned char value;
204c06b6b69Smrg{
205c06b6b69Smrg	*(uchar *)(ioBase + port) = value; eieio();
206c06b6b69Smrg}
207c06b6b69Smrg
208c06b6b69Smrgstatic void
209c06b6b69Smrgoutw(port, value)
210c06b6b69Smrgshort port;
211c06b6b69Smrgunsigned short value;
212c06b6b69Smrg{
213c06b6b69Smrg	*(unsigned short *)(ioBase + port) = value; eieio();
214c06b6b69Smrg}
215c06b6b69Smrg
216c06b6b69Smrgstatic void
217c06b6b69Smrgoutl(port, value)
218c06b6b69Smrgshort port;
219c06b6b69Smrgunsigned long value;
220c06b6b69Smrg{
221c06b6b69Smrg	*(unsigned long *)(ioBase + port) = value; eieio();
222c06b6b69Smrg}
223c06b6b69Smrg
224c06b6b69Smrgstatic unsigned char
225c06b6b69Smrginb(port)
226c06b6b69Smrgshort port;
227c06b6b69Smrg{
228c06b6b69Smrg	unsigned char val;
229c06b6b69Smrg
230c06b6b69Smrg	val = *((unsigned char *)(ioBase + port)); eieio();
231c06b6b69Smrg	return(val);
232c06b6b69Smrg}
233c06b6b69Smrg
234c06b6b69Smrgstatic unsigned short
235c06b6b69Smrginw(port)
236c06b6b69Smrgshort port;
237c06b6b69Smrg{
238c06b6b69Smrg	unsigned short val;
239c06b6b69Smrg
240c06b6b69Smrg	val = *((unsigned short *)(ioBase + port)); eieio();
241c06b6b69Smrg	return(val);
242c06b6b69Smrg}
243c06b6b69Smrg
244c06b6b69Smrgstatic unsigned long
245c06b6b69Smrginl(port)
246c06b6b69Smrgshort port;
247c06b6b69Smrg{
248c06b6b69Smrg	unsigned long val;
249c06b6b69Smrg
250c06b6b69Smrg	val = *((unsigned long *)(ioBase + port)); eieio();
251c06b6b69Smrg	return(val);
252c06b6b69Smrg}
253c06b6b69Smrg
254c06b6b69Smrg#else
255c06b6b69Smrg#if defined(__FreeBSD__) && defined(__alpha__)
256c06b6b69Smrg
257c06b6b69Smrg#include <sys/types.h>
258c06b6b69Smrg
259c06b6b69Smrgextern void outb(u_int32_t port, u_int8_t val);
260c06b6b69Smrgextern void outw(u_int32_t port, u_int16_t val);
261c06b6b69Smrgextern void outl(u_int32_t port, u_int32_t val);
262c06b6b69Smrgextern u_int8_t inb(u_int32_t port);
263c06b6b69Smrgextern u_int16_t inw(u_int32_t port);
264c06b6b69Smrgextern u_int32_t inl(u_int32_t port);
265c06b6b69Smrg
266c06b6b69Smrg#else
267c06b6b69Smrg#ifdef GCCUSESGAS
268c06b6b69Smrgstatic __inline__ void
269c06b6b69Smrgoutb(port, val)
270c06b6b69Smrgshort port;
271c06b6b69Smrgchar val;
272c06b6b69Smrg{
273c06b6b69Smrg   __asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port));
274c06b6b69Smrg}
275c06b6b69Smrg
276c06b6b69Smrgstatic __inline__ void
277c06b6b69Smrgoutw(port, val)
278c06b6b69Smrgshort port;
279c06b6b69Smrgshort val;
280c06b6b69Smrg{
281c06b6b69Smrg   __asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port));
282c06b6b69Smrg}
283c06b6b69Smrg
284c06b6b69Smrgstatic __inline__ void
285c06b6b69Smrgoutl(port, val)
286c06b6b69Smrgshort port;
287c06b6b69Smrgunsigned int val;
288c06b6b69Smrg{
289c06b6b69Smrg   __asm__ __volatile__("outl %0,%1" : :"a" (val), "d" (port));
290c06b6b69Smrg}
291c06b6b69Smrg
292c06b6b69Smrgstatic __inline__ unsigned int
293c06b6b69Smrginb(port)
294c06b6b69Smrgshort port;
295c06b6b69Smrg{
296c06b6b69Smrg   unsigned char ret;
297c06b6b69Smrg   __asm__ __volatile__("inb %1,%0" :
298c06b6b69Smrg       "=a" (ret) :
299c06b6b69Smrg       "d" (port));
300c06b6b69Smrg   return ret;
301c06b6b69Smrg}
302c06b6b69Smrg
303c06b6b69Smrgstatic __inline__ unsigned int
304c06b6b69Smrginw(port)
305c06b6b69Smrgshort port;
306c06b6b69Smrg{
307c06b6b69Smrg   unsigned short ret;
308c06b6b69Smrg   __asm__ __volatile__("inw %1,%0" :
309c06b6b69Smrg       "=a" (ret) :
310c06b6b69Smrg       "d" (port));
311c06b6b69Smrg   return ret;
312c06b6b69Smrg}
313c06b6b69Smrg
314c06b6b69Smrgstatic __inline__ unsigned int
315c06b6b69Smrginl(port)
316c06b6b69Smrgshort port;
317c06b6b69Smrg{
318c06b6b69Smrg   unsigned int ret;
319c06b6b69Smrg   __asm__ __volatile__("inl %1,%0" :
320c06b6b69Smrg       "=a" (ret) :
321c06b6b69Smrg       "d" (port));
322c06b6b69Smrg   return ret;
323c06b6b69Smrg}
324c06b6b69Smrg
325c06b6b69Smrg#else /* GCCUSESGAS */
326c06b6b69Smrg
327c06b6b69Smrgstatic __inline__ void
328c06b6b69Smrgoutb(port, val)
329c06b6b69Smrg     short port;
330c06b6b69Smrg     char val;
331c06b6b69Smrg{
332c06b6b69Smrg  __asm__ __volatile__("out%B0 (%1)" : :"a" (val), "d" (port));
333c06b6b69Smrg}
334c06b6b69Smrg
335c06b6b69Smrgstatic __inline__ void
336c06b6b69Smrgoutw(port, val)
337c06b6b69Smrg     short port;
338c06b6b69Smrg     short val;
339c06b6b69Smrg{
340c06b6b69Smrg  __asm__ __volatile__("out%W0 (%1)" : :"a" (val), "d" (port));
341c06b6b69Smrg}
342c06b6b69Smrg
343c06b6b69Smrgstatic __inline__ void
344c06b6b69Smrgoutl(port, val)
345c06b6b69Smrg     short port;
346c06b6b69Smrg     unsigned int val;
347c06b6b69Smrg{
348c06b6b69Smrg  __asm__ __volatile__("out%L0 (%1)" : :"a" (val), "d" (port));
349c06b6b69Smrg}
350c06b6b69Smrg
351c06b6b69Smrgstatic __inline__ unsigned int
352c06b6b69Smrginb(port)
353c06b6b69Smrg     short port;
354c06b6b69Smrg{
355c06b6b69Smrg  unsigned int ret;
356c06b6b69Smrg  __asm__ __volatile__("in%B0 (%1)" :
357c06b6b69Smrg                   "=a" (ret) :
358c06b6b69Smrg                   "d" (port));
359c06b6b69Smrg  return ret;
360c06b6b69Smrg}
361c06b6b69Smrg
362c06b6b69Smrgstatic __inline__ unsigned int
363c06b6b69Smrginw(port)
364c06b6b69Smrg     short port;
365c06b6b69Smrg{
366c06b6b69Smrg  unsigned int ret;
367c06b6b69Smrg  __asm__ __volatile__("in%W0 (%1)" :
368c06b6b69Smrg                   "=a" (ret) :
369c06b6b69Smrg                   "d" (port));
370c06b6b69Smrg  return ret;
371c06b6b69Smrg}
372c06b6b69Smrg
373c06b6b69Smrgstatic __inline__ unsigned int
374c06b6b69Smrginl(port)
375c06b6b69Smrg     short port;
376c06b6b69Smrg{
377c06b6b69Smrg  unsigned int ret;
378c06b6b69Smrg  __asm__ __volatile__("in%L0 (%1)" :
379c06b6b69Smrg                   "=a" (ret) :
380c06b6b69Smrg                   "d" (port));
381c06b6b69Smrg  return ret;
382c06b6b69Smrg}
383c06b6b69Smrg
384c06b6b69Smrg#endif /* GCCUSESGAS */
385c06b6b69Smrg#endif /* Lynx && __powerpc__ */
386c06b6b69Smrg#endif /* arm32 */
387c06b6b69Smrg#endif /* linux && __sparc__ */
388c06b6b69Smrg#endif /* linux && __alpha__ */
389c06b6b69Smrg#endif /* __FreeBSD__ && __alpha__ */
390c06b6b69Smrg
391c06b6b69Smrg#if defined(linux) || defined(__arm32__) || (defined(Lynx) && defined(__powerpc__))
392c06b6b69Smrg
393c06b6b69Smrg#define intr_disable()
394c06b6b69Smrg#define intr_enable()
395c06b6b69Smrg
396c06b6b69Smrg#else
397c06b6b69Smrg
398c06b6b69Smrgstatic __inline__ void
399c06b6b69Smrgintr_disable()
400c06b6b69Smrg{
401c06b6b69Smrg  __asm__ __volatile__("cli");
402c06b6b69Smrg}
403c06b6b69Smrg
404c06b6b69Smrgstatic __inline__ void
405c06b6b69Smrgintr_enable()
406c06b6b69Smrg{
407c06b6b69Smrg  __asm__ __volatile__("sti");
408c06b6b69Smrg}
409c06b6b69Smrg
410c06b6b69Smrg#endif /* else !linux && !__arm32__ */
411c06b6b69Smrg
412c06b6b69Smrg#else /* __GNUC__ */
413c06b6b69Smrg
414c06b6b69Smrg#if defined(_MINIX) && defined(_ACK)
415c06b6b69Smrg
416c06b6b69Smrg/* inb, outb, inw and outw are defined in the library */
417c06b6b69Smrg/* ... but I've no idea if the same is true for inl & outl */
418c06b6b69Smrg
419c06b6b69Smrgu8_t inb(U16_t);
420c06b6b69Smrgvoid outb(U16_t, U8_t);
421c06b6b69Smrgu16_t inw(U16_t);
422c06b6b69Smrgvoid outw(U16_t, U16_t);
423c06b6b69Smrgu32_t inl(U16_t);
424c06b6b69Smrgvoid outl(U16_t, U32_t);
425c06b6b69Smrg
426c06b6b69Smrg#else /* not _MINIX and _ACK */
427c06b6b69Smrg
428c06b6b69Smrg# if defined(__STDC__) && (__STDC__ == 1)
429c06b6b69Smrg#  ifndef NCR
430c06b6b69Smrg#  define asm __asm
431c06b6b69Smrg#  endif
432c06b6b69Smrg# endif
433c06b6b69Smrg# ifdef SVR4
434c06b6b69Smrg#  include <sys/types.h>
435c06b6b69Smrg#  ifndef __USLC__
436c06b6b69Smrg#   define __USLC__
437c06b6b69Smrg#  endif
438c06b6b69Smrg# endif
439c06b6b69Smrg# ifndef __SCO__
440c06b6b69Smrg#  include <sys/inline.h>
441c06b6b69Smrg# else
442c06b6b69Smrg#  include "../common/scoasm.h"
443c06b6b69Smrg# endif
444c06b6b69Smrg# define intr_disable() asm("cli")
445c06b6b69Smrg# define intr_enable()  asm("sti")
446c06b6b69Smrg
447c06b6b69Smrg#endif /* _MINIX and _ACK */
448c06b6b69Smrg#endif /* __GNUC__ */
449