1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _ASM_SUNDDI_H 28 #define _ASM_SUNDDI_H 29 30 #include <sys/ccompile.h> 31 #include <sys/types.h> 32 33 #ifdef __cplusplus 34 extern "C" { 35 #endif 36 37 #if !defined(__lint) && defined(__GNUC__) 38 39 #if defined(__i386) || defined(__amd64) 40 41 extern __GNU_INLINE uint8_t 42 inb(int port) 43 { 44 uint16_t port16 = (uint16_t)port; 45 uint8_t value; 46 47 __asm__ __volatile__( 48 "inb (%1)" /* value in %al */ 49 : "=a" (value) 50 : "d" (port16)); 51 return (value); 52 } 53 54 extern __GNU_INLINE uint16_t 55 inw(int port) 56 { 57 uint16_t port16 = (uint16_t)port; 58 uint16_t value; 59 60 __asm__ __volatile__( 61 "inw (%1)" /* value in %ax */ 62 : "=a" (value) 63 : "d" (port16)); 64 return (value); 65 } 66 67 extern __GNU_INLINE uint32_t 68 inl(int port) 69 { 70 uint16_t port16 = (uint16_t)port; 71 uint32_t value; 72 73 __asm__ __volatile__( 74 "inl (%1)" /* value in %eax */ 75 : "=a" (value) 76 : "d" (port16)); 77 return (value); 78 } 79 80 extern __GNU_INLINE void 81 outb(int port, uint8_t value) 82 { 83 uint16_t port16 = (uint16_t)port; 84 85 __asm__ __volatile__( 86 "outb (%1)" 87 : /* no output */ 88 : "a" (value), "d" (port16)); 89 } 90 91 extern __GNU_INLINE void 92 outw(int port, uint16_t value) 93 { 94 uint16_t port16 = (uint16_t)port; 95 96 __asm__ __volatile__( 97 "outw (%1)" 98 : /* no output */ 99 : "a" (value), "d" (port16)); 100 } 101 102 extern __GNU_INLINE void 103 outl(int port, uint32_t value) 104 { 105 uint16_t port16 = (uint16_t)port; 106 107 __asm__ __volatile__( 108 "outl (%1)" 109 : /* no output */ 110 : "a" (value), "d" (port16)); 111 } 112 113 #if defined(_BOOT) 114 115 extern __GNU_INLINE void 116 sync_instruction_memory(caddr_t v, size_t len) 117 { 118 __asm__ __volatile__("nop"); 119 } 120 121 #endif /* _BOOT */ 122 123 #endif /* __i386 || __amd64 */ 124 125 #endif /* !__lint && __GNUC__ */ 126 127 #ifdef __cplusplus 128 } 129 #endif 130 131 #endif /* _ASM_SUNDDI_H */ 132