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