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#ifdef __cplusplus 30extern "C" { 31#endif 32 33#if !defined(__lint) && defined(__GNUC__) 34 35#if defined(__i386) || defined(__amd64) 36 37extern __inline__ void 38ht_pause(void) 39{ 40 __asm__ __volatile__( 41 "pause"); 42} 43 44/* 45 * prefetch 64 bytes 46 * 47 * prefetch is an SSE extension which is not supported on 48 * older 32-bit processors, so define this as a no-op for now 49 */ 50 51extern __inline__ void 52prefetch_read_many(void *addr) 53{ 54#if defined(__amd64) 55 __asm__( 56 "prefetcht0 (%0);" 57 "prefetcht0 32(%0);" 58 : /* no output */ 59 : "r" (addr)); 60#endif /* __amd64 */ 61} 62 63extern __inline__ void 64prefetch_read_once(void *addr) 65{ 66#if defined(__amd64) 67 __asm__( 68 "prefetchnta (%0);" 69 "prefetchnta 32(%0);" 70 : /* no output */ 71 : "r" (addr)); 72#endif /* __amd64 */ 73} 74 75extern __inline__ void 76prefetch_write_many(void *addr) 77{ 78#if defined(__amd64) 79 __asm__( 80 "prefetcht0 (%0);" 81 "prefetcht0 32(%0);" 82 : /* no output */ 83 : "r" (addr)); 84#endif /* __amd64 */ 85} 86 87extern __inline__ void 88prefetch_write_once(void *addr) 89{ 90#if defined(__amd64) 91 __asm__( 92 "prefetcht0 (%0);" 93 "prefetcht0 32(%0);" 94 : /* no output */ 95 : "r" (addr)); 96#endif /* __amd64 */ 97} 98 99#if !defined(__xpv) 100 101extern __inline__ void 102cli(void) 103{ 104 __asm__ __volatile__( 105 "cli" : : : "memory"); 106} 107 108extern __inline__ void 109sti(void) 110{ 111 __asm__ __volatile__( 112 "sti"); 113} 114 115extern __inline__ void 116i86_halt(void) 117{ 118 __asm__ __volatile__( 119 "sti; hlt"); 120} 121 122#endif /* !__xpv */ 123 124#endif /* __i386 || defined(__amd64) */ 125 126#if defined(__amd64) 127 128extern __inline__ void 129__set_ds(selector_t value) 130{ 131 __asm__ __volatile__( 132 "movw %0, %%ds" 133 : /* no output */ 134 : "r" (value)); 135} 136 137extern __inline__ void 138__set_es(selector_t value) 139{ 140 __asm__ __volatile__( 141 "movw %0, %%es" 142 : /* no output */ 143 : "r" (value)); 144} 145 146extern __inline__ void 147__set_fs(selector_t value) 148{ 149 __asm__ __volatile__( 150 "movw %0, %%fs" 151 : /* no output */ 152 : "r" (value)); 153} 154 155extern __inline__ void 156__set_gs(selector_t value) 157{ 158 __asm__ __volatile__( 159 "movw %0, %%gs" 160 : /* no output */ 161 : "r" (value)); 162} 163 164#if !defined(__xpv) 165 166extern __inline__ void 167__swapgs(void) 168{ 169 __asm__ __volatile__( 170 "mfence; swapgs"); 171} 172 173#endif /* !__xpv */ 174 175#endif /* __amd64 */ 176 177#endif /* !__lint && __GNUC__ */ 178 179#ifdef __cplusplus 180} 181#endif 182 183#endif /* _ASM_CPU_H */ 184