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