Sync usage with man page.
[netbsd-mini2440.git] / sys / arch / i386 / i386 / cpufunc.S
blob3ef61375eae1927c472ef020bb8f5816cb66bf3f
1 /*      $NetBSD: cpufunc.S,v 1.13 2008/09/23 08:50:11 ad Exp $  */
3 /*-
4  * Copyright (c) 1998, 2007 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Charles M. Hannum, and by Andrew Doran.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
33  * Functions to provide access to i386-specific instructions.
34  *
35  * These are shared with NetBSD/xen.
36  */
38 #include <machine/asm.h>
39 __KERNEL_RCSID(0, "$NetBSD: cpufunc.S,v 1.13 2008/09/23 08:50:11 ad Exp $");
41 #include "opt_xen.h"
43 #include <machine/specialreg.h>
44 #include <machine/segments.h>
46 #include "assym.h"
48 ENTRY(x86_lfence)
49         lock
50         addl    $0, -4(%esp)
51         ret
52 END(x86_lfence)
54 ENTRY(x86_sfence)
55         lock
56         addl    $0, -4(%esp)
57         ret
58 END(x86_sfence)
60 ENTRY(x86_mfence)
61         lock
62         addl    $0, -4(%esp)
63         ret
64 END(x86_mfence)
66 ENTRY(lidt)
67         movl    4(%esp), %eax
68         lidt    (%eax)
69         ret
70 END(lidt)
72 ENTRY(rcr3)
73         movl    %cr3, %eax
74         ret
75 END(rcr3)
77 ENTRY(lcr4)
78         movl    4(%esp), %eax
79         movl    %eax, %cr4
80         ret
81 END(lcr4)
83 ENTRY(rcr4)
84         movl    %cr4, %eax
85         ret
86 END(rcr4)
88 ENTRY(x86_read_flags)
89         pushfl
90         popl    %eax
91         ret
92 END(x86_read_flags)
94 ENTRY(x86_write_flags)
95         movl    4(%esp), %eax
96         pushl   %eax
97         popfl
98         ret
99 END(x86_write_flags)
101 #ifndef XEN
102 STRONG_ALIAS(x86_write_psl,x86_write_flags)
103 STRONG_ALIAS(x86_read_psl,x86_read_flags)
104 #endif  /* XEN */
106 ENTRY(rdmsr)
107         movl    4(%esp), %ecx
108         rdmsr
109         ret
110 END(rdmsr)
112 ENTRY(wrmsr)
113         movl    4(%esp), %ecx
114         movl    8(%esp), %eax
115         movl    12(%esp), %edx
116         wrmsr
117         ret
118 END(wrmsr)
120 ENTRY(rdmsr_locked)
121         movl    4(%esp), %ecx
122         pushl   %edi
123         movl    $OPTERON_MSR_PASSCODE, %edi
124         rdmsr
125         popl    %edi
126         ret
127 END(rdmsr_locked)
129 ENTRY(wrmsr_locked)
130         movl    4(%esp), %ecx
131         movl    8(%esp), %eax
132         movl    12(%esp), %edx
133         pushl   %edi
134         movl    $OPTERON_MSR_PASSCODE, %edi
135         wrmsr
136         popl    %edi
137         ret
138 END(wrmsr_locked)
140 ENTRY(cpu_counter)
141         rdtsc
142         addl    CPUVAR(CC_SKEW), %eax
143         adcl    CPUVAR(CC_SKEW+4), %edx
144         ret
145 END(cpu_counter)
147 ENTRY(cpu_counter32)
148         rdtsc
149         addl    CPUVAR(CC_SKEW), %eax
150         ret
151 END(cpu_counter32)
153 ENTRY(rdpmc)
154         movl    4(%esp), %ecx
155         rdpmc
156         ret
157 END(rdpmc)
159 ENTRY(breakpoint)
160         pushl   %ebp
161         movl    %esp, %ebp
162         int     $0x03           /* paranoid, not 'int3' */
163         popl    %ebp
164         ret
165 END(breakpoint)
167 ENTRY(x86_curcpu)
168         movl    %fs:(CPU_INFO_SELF), %eax
169         ret
170 END(x86_curcpu)
172 ENTRY(x86_curlwp)
173         movl    %fs:(CPU_INFO_CURLWP), %eax
174         ret
175 END(x86_curlwp)
177 ENTRY(cpu_set_curpri)
178         movl    4(%esp), %eax
179         movl    %eax, %fs:(CPU_INFO_CURPRIORITY)
180         ret
181 END(cpu_set_curpri)
183 ENTRY(__byte_swap_u32_variable)
184         movl    4(%esp), %eax
185         bswapl  %eax
186         ret
187 END(__byte_swap_u32_variable)
189 ENTRY(__byte_swap_u16_variable)
190         movl    4(%esp), %eax
191         xchgb   %al, %ah
192         ret
193 END(__byte_swap_u16_variable)
196  * void x86_flush()
198  * Flush instruction pipelines by doing an intersegment (far) return.
199  */
200 ENTRY(x86_flush)
201         popl    %eax
202         pushl   $GSEL(GCODE_SEL, SEL_KPL)
203         pushl   %eax
204         lret
205 END(x86_flush)
207 /* Waits - set up stack frame. */
208 ENTRY(x86_hlt)
209         pushl   %ebp
210         movl    %esp, %ebp
211         hlt
212         leave
213         ret
214 END(x86_hlt)
216 /* Waits - set up stack frame. */
217 ENTRY(x86_stihlt)
218         pushl   %ebp
219         movl    %esp, %ebp
220         sti
221         hlt
222         leave
223         ret
224 END(x86_stihlt)
226 ENTRY(x86_monitor)
227         movl    4(%esp), %eax
228         movl    8(%esp), %ecx
229         movl    12(%esp), %edx
230         monitor %eax, %ecx, %edx
231         ret
232 END(x86_monitor)
234 /* Waits - set up stack frame. */
235 ENTRY(x86_mwait)  
236         pushl   %ebp
237         movl    %esp, %ebp
238         movl    8(%ebp), %eax
239         movl    12(%ebp), %ecx
240         mwait   %eax, %ecx
241         leave
242         ret
243 END(x86_mwait)  
245 ENTRY(x86_pause)
246         pause
247         ret
248 END(x86_pause)
250 ENTRY(x86_cpuid2)
251         pushl   %ebx
252         pushl   %edi
253         movl    12(%esp), %eax
254         movl    16(%esp), %ecx
255         movl    20(%esp), %edi
256         cpuid
257         movl    %eax, 0(%edi)
258         movl    %ebx, 4(%edi)
259         movl    %ecx, 8(%edi)
260         movl    %edx, 12(%edi)
261         popl    %edi
262         popl    %ebx
263         ret
264 END(x86_cpuid2)
266 ENTRY(x86_getss)
267         movl    %ss, %eax
268         ret
269 END(x86_getss)
271 ENTRY(fldcw)
272         movl    4(%esp), %eax
273         fldcw   (%eax)
274         ret
275 END(fldcw)
277 ENTRY(fnclex)   
278         fnclex
279         ret
280 END(fnclex)     
282 ENTRY(fninit)
283         fninit
284         ret
285 END(fninit)
287 ENTRY(fnsave)
288         movl    4(%esp), %eax
289         fnsave  (%eax)
290         ret
291 END(fnsave)
293 ENTRY(fnstcw)
294         movl    4(%esp), %eax
295         fnstcw  (%eax)
296         ret
297 END(fnstcw)
299 ENTRY(fnstsw)
300         movl    4(%esp), %eax
301         fnstsw  (%eax)
302         ret
303 END(fnstsw)
305 ENTRY(fp_divide_by_0)
306         fldz
307         fld1
308         fdiv    %st, %st(1)
309         fwait
310         ret
311 END(fp_divide_by_0)
313 ENTRY(frstor)
314         movl    4(%esp), %eax
315         frstor  (%eax)
316         ret
317 END(frstor)
319 ENTRY(fwait)
320         fwait
321         ret
322 END(fwait)
324 ENTRY(clts)
325         clts
326         ret
327 END(clts)
329 ENTRY(stts)
330         movl    %cr0, %eax
331         testl   $CR0_TS, %eax
332         jnz     1f
333         orl     $CR0_TS, %eax
334         movl    %eax, %cr0
336         ret
337 END(stts)
339 ENTRY(fxsave)
340         movl    4(%esp), %eax
341         fxsave  (%eax)
342         ret
343 END(fxsave)
345 ENTRY(fxrstor)
346         movl    4(%esp), %eax
347         fxrstor (%eax)
348         ret
349 END(fxrstor)
351 ENTRY(fldummy)
352         movl    4(%esp), %eax
353         ffree   %st(7)
354         fld     (%eax)
355         ret
356 END(fldummy)
358 ENTRY(inb)
359         movl    4(%esp), %edx
360         xorl    %eax, %eax
361         inb     %dx, %al
362         ret
363 END(inb)
365 ENTRY(insb)
366         pushl   %edi
367         movl    8(%esp), %edx
368         movl    12(%esp), %edi
369         movl    16(%esp), %ecx
370         rep
371         insb
372         popl    %edi
373         ret
374 END(insb)
376 ENTRY(inw)
377         movl    4(%esp), %edx
378         xorl    %eax, %eax
379         inw     %dx, %ax
380         ret
381 END(inw)
383 ENTRY(insw)
384         pushl   %edi
385         movl    8(%esp), %edx
386         movl    12(%esp), %edi
387         movl    16(%esp), %ecx
388         rep
389         insw
390         popl    %edi
391         ret
392 END(insw)
394 ENTRY(inl)
395         movl    4(%esp), %edx
396         inl     %dx, %eax
397         ret
398 END(inl)
400 ENTRY(insl)
401         pushl   %edi
402         movl    8(%esp), %edx
403         movl    12(%esp), %edi
404         movl    16(%esp), %ecx
405         rep
406         insl
407         popl    %edi
408         ret
409 END(insl)
411 ENTRY(outb)
412         movl    4(%esp), %edx
413         movl    8(%esp), %eax
414         outb    %al, %dx
415         ret
416 END(outb)
418 ENTRY(outsb)
419         pushl   %esi
420         movl    8(%esp), %edx
421         movl    12(%esp), %esi
422         movl    16(%esp), %ecx
423         rep
424         outsb
425         popl    %esi
426         ret
427 END(outsb)
429 ENTRY(outw)
430         movl    4(%esp), %edx
431         movl    8(%esp), %eax
432         outw    %ax, %dx
433         ret
434 END(outw)
436 ENTRY(outsw)
437         pushl   %esi
438         movl    8(%esp), %edx
439         movl    12(%esp), %esi
440         movl    16(%esp), %ecx
441         rep
442         outsw
443         popl    %esi
444         ret
445 END(outsw)
447 ENTRY(outl)
448         movl    4(%esp), %edx
449         movl    8(%esp), %eax
450         outl    %eax, %dx
451         ret
452 END(outl)
454 ENTRY(outsl)
455         pushl   %esi
456         movl    8(%esp), %edx
457         movl    12(%esp), %esi
458         movl    16(%esp), %ecx
459         rep
460         outsl
461         popl    %esi
462         ret
463 END(outsl)