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