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