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 (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _ASM_CPU_H 27 #define _ASM_CPU_H 28 29 #include <sys/ccompile.h> 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 #if !defined(__lint) && defined(__GNUC__) 36 37 #if defined(__i386) || defined(__amd64) 38 39 extern __GNU_INLINE void 40 ht_pause(void) 41 { 42 __asm__ __volatile__( 43 "pause"); 44 } 45 46 /* 47 * prefetch 64 bytes 48 * 49 * prefetch is an SSE extension which is not supported on 50 * older 32-bit processors, so define this as a no-op for now 51 */ 52 53 extern __GNU_INLINE void 54 prefetch_read_many(void *addr) 55 { 56 #if defined(__amd64) 57 __asm__( 58 "prefetcht0 (%0);" 59 "prefetcht0 32(%0);" 60 : /* no output */ 61 : "r" (addr)); 62 #endif /* __amd64 */ 63 } 64 65 extern __GNU_INLINE void 66 refetch_read_once(void *addr) 67 { 68 #if defined(__amd64) 69 __asm__( 70 "prefetchnta (%0);" 71 "prefetchnta 32(%0);" 72 : /* no output */ 73 : "r" (addr)); 74 #endif /* __amd64 */ 75 } 76 77 extern __GNU_INLINE void 78 prefetch_write_many(void *addr) 79 { 80 #if defined(__amd64) 81 __asm__( 82 "prefetcht0 (%0);" 83 "prefetcht0 32(%0);" 84 : /* no output */ 85 : "r" (addr)); 86 #endif /* __amd64 */ 87 } 88 89 extern __GNU_INLINE void 90 prefetch_write_once(void *addr) 91 { 92 #if defined(__amd64) 93 __asm__( 94 "prefetcht0 (%0);" 95 "prefetcht0 32(%0);" 96 : /* no output */ 97 : "r" (addr)); 98 #endif /* __amd64 */ 99 } 100 101 #if !defined(__xpv) 102 103 extern __GNU_INLINE void 104 cli(void) 105 { 106 __asm__ __volatile__( 107 "cli" : : : "memory"); 108 } 109 110 extern __GNU_INLINE void 111 sti(void) 112 { 113 __asm__ __volatile__( 114 "sti"); 115 } 116 117 extern __GNU_INLINE void 118 i86_halt(void) 119 { 120 __asm__ __volatile__( 121 "sti; hlt"); 122 } 123 124 #endif /* !__xpv */ 125 126 #endif /* __i386 || defined(__amd64) */ 127 128 #if defined(__amd64) 129 130 extern __GNU_INLINE void 131 __set_ds(selector_t value) 132 { 133 __asm__ __volatile__( 134 "movw %0, %%ds" 135 : /* no output */ 136 : "r" (value)); 137 } 138 139 extern __GNU_INLINE void 140 __set_es(selector_t value) 141 { 142 __asm__ __volatile__( 143 "movw %0, %%es" 144 : /* no output */ 145 : "r" (value)); 146 } 147 148 extern __GNU_INLINE void 149 __set_fs(selector_t value) 150 { 151 __asm__ __volatile__( 152 "movw %0, %%fs" 153 : /* no output */ 154 : "r" (value)); 155 } 156 157 extern __GNU_INLINE void 158 __set_gs(selector_t value) 159 { 160 __asm__ __volatile__( 161 "movw %0, %%gs" 162 : /* no output */ 163 : "r" (value)); 164 } 165 166 #if !defined(__xpv) 167 168 extern __GNU_INLINE void 169 __swapgs(void) 170 { 171 __asm__ __volatile__( 172 "mfence; swapgs"); 173 } 174 175 #endif /* !__xpv */ 176 177 #endif /* __amd64 */ 178 179 #endif /* !__lint && __GNUC__ */ 180 181 #ifdef __cplusplus 182 } 183 #endif 184 185 #endif /* _ASM_CPU_H */