VirtualBox

source: vbox/trunk/include/iprt/asm-amd64-x86-watcom-32.h@ 60547

Last change on this file since 60547 was 59529, checked in by vboxsync, 9 years ago

iprt/asm-amd64-x86-watcom-32.h: Fixed ASMReadTscWithAux bug.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.5 KB
Line 
1/** @file
2 * IPRT - AMD64 and x86 Specific Assembly Functions, 32-bit Watcom C pragma aux.
3 */
4
5/*
6 * Copyright (C) 2006-2015 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_asm_amd64_x86_h
27# error "Don't include this header directly."
28#endif
29#ifndef ___iprt_asm_amd64_x86_watcom_32_h
30#define ___iprt_asm_amd64_x86_watcom_32_h
31
32#ifndef __FLAT__
33# error "Only works with flat pointers! (-mf)"
34#endif
35
36/*
37 * Note! The #undef that preceds the #pragma aux statements is for undoing
38 * the mangling, because the symbol in #pragma aux [symbol] statements
39 * doesn't get subjected to preprocessing. This is also why we include
40 * the watcom header at the top rather than at the bottom of the
41 * asm-amd64-x86.h file.
42 */
43
44#undef ASMGetIDTR
45#pragma aux ASMGetIDTR = \
46 "sidt fword ptr [ecx]" \
47 parm [ecx] \
48 modify exact [];
49
50#undef ASMGetIdtrLimit
51#pragma aux ASMGetIdtrLimit = \
52 "sub esp, 8" \
53 "sidt fword ptr [esp]" \
54 "mov cx, [esp]" \
55 "add esp, 8" \
56 parm [] \
57 value [cx] \
58 modify exact [ecx];
59
60#undef ASMSetIDTR
61#pragma aux ASMSetIDTR = \
62 "lidt fword ptr [ecx]" \
63 parm [ecx] nomemory \
64 modify nomemory;
65
66#undef ASMGetGDTR
67#pragma aux ASMGetGDTR = \
68 "sgdt fword ptr [ecx]" \
69 parm [ecx] \
70 modify exact [];
71
72#undef ASMSetGDTR
73#pragma aux ASMSetGDTR = \
74 "lgdt fword ptr [ecx]" \
75 parm [ecx] nomemory \
76 modify exact [] nomemory;
77
78#undef ASMGetCS
79#pragma aux ASMGetCS = \
80 "mov ax, cs" \
81 parm [] nomemory \
82 value [ax] \
83 modify exact [eax] nomemory;
84
85#undef ASMGetDS
86#pragma aux ASMGetDS = \
87 "mov ax, ds" \
88 parm [] nomemory \
89 value [ax] \
90 modify exact [eax] nomemory;
91
92#undef ASMGetES
93#pragma aux ASMGetES = \
94 "mov ax, es" \
95 parm [] nomemory \
96 value [ax] \
97 modify exact [eax] nomemory;
98
99#undef ASMGetFS
100#pragma aux ASMGetFS = \
101 "mov ax, fs" \
102 parm [] nomemory \
103 value [ax] \
104 modify exact [eax] nomemory;
105
106#undef ASMGetGS
107#pragma aux ASMGetGS = \
108 "mov ax, gs" \
109 parm [] nomemory \
110 value [ax] \
111 modify exact [eax] nomemory;
112
113#undef ASMGetSS
114#pragma aux ASMGetSS = \
115 "mov ax, ss" \
116 parm [] nomemory \
117 value [ax] \
118 modify exact [eax] nomemory;
119
120#undef ASMGetTR
121#pragma aux ASMGetTR = \
122 "str ax" \
123 parm [] nomemory \
124 value [ax] \
125 modify exact [eax] nomemory;
126
127#undef ASMGetLDTR
128#pragma aux ASMGetLDTR = \
129 "sldt ax" \
130 parm [] nomemory \
131 value [ax] \
132 modify exact [eax] nomemory;
133
134/** @todo ASMGetSegAttr */
135
136#undef ASMGetFlags
137#pragma aux ASMGetFlags = \
138 "pushfd" \
139 "pop eax" \
140 parm [] nomemory \
141 value [eax] \
142 modify exact [eax] nomemory;
143
144#undef ASMSetFlags
145#pragma aux ASMSetFlags = \
146 "push eax" \
147 "popfd" \
148 parm [eax] nomemory \
149 modify exact [] nomemory;
150
151#undef ASMChangeFlags
152#pragma aux ASMChangeFlags = \
153 "pushfd" \
154 "pop eax" \
155 "and edx, eax" \
156 "or edx, ecx" \
157 "push edx" \
158 "popfd" \
159 parm [edx] [ecx] nomemory \
160 value [eax] \
161 modify exact [edx] nomemory;
162
163#undef ASMAddFlags
164#pragma aux ASMAddFlags = \
165 "pushfd" \
166 "pop eax" \
167 "or edx, eax" \
168 "push edx" \
169 "popfd" \
170 parm [edx] nomemory \
171 value [eax] \
172 modify exact [edx] nomemory;
173
174#undef ASMClearFlags
175#pragma aux ASMClearFlags = \
176 "pushfd" \
177 "pop eax" \
178 "and edx, eax" \
179 "push edx" \
180 "popfd" \
181 parm [edx] nomemory \
182 value [eax] \
183 modify exact [edx] nomemory;
184
185/* Note! Must use the 64-bit integer return value convension.
186 The order of registers in the value [set] does not seem to mean anything. */
187#undef ASMReadTSC
188#pragma aux ASMReadTSC = \
189 ".586" \
190 "rdtsc" \
191 parm [] nomemory \
192 value [eax edx] \
193 modify exact [edx eax] nomemory;
194
195#undef ASMReadTscWithAux
196#pragma aux ASMReadTscWithAux = \
197 0x0f 0x01 0xf9 \
198 "mov [ebx], ecx" \
199 parm [ebx] \
200 value [eax edx] \
201 modify exact [eax edx ecx];
202
203/* ASMCpuId: Implemented externally, too many parameters. */
204/* ASMCpuId_Idx_ECX: Implemented externally, too many parameters. */
205/* ASMCpuIdExSlow: Always implemented externally. */
206
207#undef ASMCpuId_ECX_EDX
208#pragma aux ASMCpuId_ECX_EDX = \
209 "cpuid" \
210 "mov [edi], ecx" \
211 "mov [esi], edx" \
212 parm [ecx] [edi] [esi] \
213 modify exact [eax ebx ecx edx];
214
215#undef ASMCpuId_EAX
216#pragma aux ASMCpuId_EAX = \
217 "cpuid" \
218 parm [ecx] \
219 value [eax] \
220 modify exact [eax ebx ecx edx];
221
222#undef ASMCpuId_EBX
223#pragma aux ASMCpuId_EBX = \
224 "cpuid" \
225 parm [ecx] \
226 value [ebx] \
227 modify exact [eax ebx ecx edx];
228
229#undef ASMCpuId_ECX
230#pragma aux ASMCpuId_ECX = \
231 "cpuid" \
232 parm [ecx] \
233 value [ecx] \
234 modify exact [eax ebx ecx edx];
235
236#undef ASMCpuId_EDX
237#pragma aux ASMCpuId_EDX = \
238 "cpuid" \
239 parm [ecx] \
240 value [edx] \
241 modify exact [eax ebx ecx edx];
242
243/* ASMHasCpuId: MSC inline in main source file. */
244/* ASMGetApicId: Implemented externally, lazy bird. */
245
246#undef ASMGetCR0
247#pragma aux ASMGetCR0 = \
248 "mov eax, cr0" \
249 parm [] nomemory \
250 value [eax] \
251 modify exact [eax] nomemory;
252
253#undef ASMSetCR0
254#pragma aux ASMSetCR0 = \
255 "mov cr0, eax" \
256 parm [eax] nomemory \
257 modify exact [] nomemory;
258
259#undef ASMGetCR2
260#pragma aux ASMGetCR2 = \
261 "mov eax, cr2" \
262 parm [] nomemory \
263 value [eax] \
264 modify exact [eax] nomemory;
265
266#undef ASMSetCR2
267#pragma aux ASMSetCR2 = \
268 "mov cr2, eax" \
269 parm [eax] nomemory \
270 modify exact [] nomemory;
271
272#undef ASMGetCR3
273#pragma aux ASMGetCR3 = \
274 "mov eax, cr3" \
275 parm [] nomemory \
276 value [eax] \
277 modify exact [eax] nomemory;
278
279#undef ASMSetCR3
280#pragma aux ASMSetCR3 = \
281 "mov cr3, eax" \
282 parm [eax] nomemory \
283 modify exact [] nomemory;
284
285#undef ASMReloadCR3
286#pragma aux ASMReloadCR3 = \
287 "mov eax, cr3" \
288 "mov cr3, eax" \
289 parm [] nomemory \
290 modify exact [eax] nomemory;
291
292#undef ASMGetCR4
293#pragma aux ASMGetCR4 = \
294 "mov eax, cr4" \
295 parm [] nomemory \
296 value [eax] \
297 modify exact [eax] nomemory;
298
299#undef ASMSetCR4
300#pragma aux ASMSetCR4 = \
301 "mov cr4, eax" \
302 parm [eax] nomemory \
303 modify exact [] nomemory;
304
305/* ASMGetCR8: Don't bother for 32-bit. */
306/* ASMSetCR8: Don't bother for 32-bit. */
307
308#undef ASMIntEnable
309#pragma aux ASMIntEnable = \
310 "sti" \
311 parm [] nomemory \
312 modify exact [] nomemory;
313
314#undef ASMIntDisable
315#pragma aux ASMIntDisable = \
316 "cli" \
317 parm [] nomemory \
318 modify exact [] nomemory;
319
320#undef ASMIntDisableFlags
321#pragma aux ASMIntDisableFlags = \
322 "pushfd" \
323 "cli" \
324 "pop eax" \
325 parm [] nomemory \
326 value [eax] \
327 modify exact [] nomemory;
328
329#undef ASMHalt
330#pragma aux ASMHalt = \
331 "hlt" \
332 parm [] nomemory \
333 modify exact [] nomemory;
334
335#undef ASMRdMsr
336#pragma aux ASMRdMsr = \
337 ".586" \
338 "rdmsr" \
339 parm [ecx] nomemory \
340 value [eax edx] \
341 modify exact [eax edx] nomemory;
342
343#undef ASMWrMsr
344#pragma aux ASMWrMsr = \
345 ".586" \
346 "wrmsr" \
347 parm [ecx] [eax edx] nomemory \
348 modify exact [] nomemory;
349
350#undef ASMRdMsrEx
351#pragma aux ASMRdMsrEx = \
352 ".586" \
353 "rdmsr" \
354 parm [ecx] [edi] nomemory \
355 value [eax edx] \
356 modify exact [eax edx] nomemory;
357
358#undef ASMWrMsrEx
359#pragma aux ASMWrMsrEx = \
360 ".586" \
361 "wrmsr" \
362 parm [ecx] [edi] [eax edx] nomemory \
363 modify exact [] nomemory;
364
365#undef ASMRdMsr_Low
366#pragma aux ASMRdMsr_Low = \
367 ".586" \
368 "rdmsr" \
369 parm [ecx] nomemory \
370 value [eax] \
371 modify exact [eax edx] nomemory;
372
373#undef ASMRdMsr_High
374#pragma aux ASMRdMsr_High = \
375 ".586" \
376 "rdmsr" \
377 parm [ecx] nomemory \
378 value [edx] \
379 modify exact [eax edx] nomemory;
380
381
382#undef ASMGetDR0
383#pragma aux ASMGetDR0 = \
384 "mov eax, dr0" \
385 parm [] nomemory \
386 value [eax] \
387 modify exact [eax] nomemory;
388
389#undef ASMGetDR1
390#pragma aux ASMGetDR1 = \
391 "mov eax, dr1" \
392 parm [] nomemory \
393 value [eax] \
394 modify exact [eax] nomemory;
395
396#undef ASMGetDR2
397#pragma aux ASMGetDR2 = \
398 "mov eax, dr2" \
399 parm [] nomemory \
400 value [eax] \
401 modify exact [eax] nomemory;
402
403#undef ASMGetDR3
404#pragma aux ASMGetDR3 = \
405 "mov eax, dr3" \
406 parm [] nomemory \
407 value [eax] \
408 modify exact [eax] nomemory;
409
410#undef ASMGetDR6
411#pragma aux ASMGetDR6 = \
412 "mov eax, dr6" \
413 parm [] nomemory \
414 value [eax] \
415 modify exact [eax] nomemory;
416
417#undef ASMGetAndClearDR6
418#pragma aux ASMGetAndClearDR6 = \
419 "mov edx, 0ffff0ff0h" \
420 "mov eax, dr6" \
421 "mov dr6, edx" \
422 parm [] nomemory \
423 value [eax] \
424 modify exact [eax edx] nomemory;
425
426#undef ASMGetDR7
427#pragma aux ASMGetDR7 = \
428 "mov eax, dr7" \
429 parm [] nomemory \
430 value [eax] \
431 modify exact [eax] nomemory;
432
433#undef ASMSetDR0
434#pragma aux ASMSetDR0 = \
435 "mov dr0, eax" \
436 parm [eax] nomemory \
437 modify exact [] nomemory;
438
439#undef ASMSetDR1
440#pragma aux ASMSetDR1 = \
441 "mov dr1, eax" \
442 parm [eax] nomemory \
443 modify exact [] nomemory;
444
445#undef ASMSetDR2
446#pragma aux ASMSetDR2 = \
447 "mov dr2, eax" \
448 parm [eax] nomemory \
449 modify exact [] nomemory;
450
451#undef ASMSetDR3
452#pragma aux ASMSetDR3 = \
453 "mov dr3, eax" \
454 parm [eax] nomemory \
455 modify exact [] nomemory;
456
457#undef ASMSetDR6
458#pragma aux ASMSetDR6 = \
459 "mov dr6, eax" \
460 parm [eax] nomemory \
461 modify exact [] nomemory;
462
463#undef ASMSetDR7
464#pragma aux ASMSetDR7 = \
465 "mov dr7, eax" \
466 parm [eax] nomemory \
467 modify exact [] nomemory;
468
469/* Yeah, could've used outp here, but this keeps the main file simpler. */
470#undef ASMOutU8
471#pragma aux ASMOutU8 = \
472 "out dx, al" \
473 parm [dx] [al] nomemory \
474 modify exact [] nomemory;
475
476#undef ASMInU8
477#pragma aux ASMInU8 = \
478 "in al, dx" \
479 parm [dx] nomemory \
480 value [al] \
481 modify exact [] nomemory;
482
483#undef ASMOutU16
484#pragma aux ASMOutU16 = \
485 "out dx, ax" \
486 parm [dx] [ax] nomemory \
487 modify exact [] nomemory;
488
489#undef ASMInU16
490#pragma aux ASMInU16 = \
491 "in ax, dx" \
492 parm [dx] nomemory \
493 value [ax] \
494 modify exact [] nomemory;
495
496#undef ASMOutU32
497#pragma aux ASMOutU32 = \
498 "out dx, eax" \
499 parm [dx] [eax] nomemory \
500 modify exact [] nomemory;
501
502#undef ASMInU32
503#pragma aux ASMInU32 = \
504 "in eax, dx" \
505 parm [dx] nomemory \
506 value [eax] \
507 modify exact [] nomemory;
508
509#undef ASMOutStrU8
510#pragma aux ASMOutStrU8 = \
511 "rep outsb" \
512 parm [dx] [esi] [ecx] nomemory \
513 modify exact [esi ecx] nomemory;
514
515#undef ASMInStrU8
516#pragma aux ASMInStrU8 = \
517 "rep insb" \
518 parm [dx] [edi] [ecx] \
519 modify exact [edi ecx];
520
521#undef ASMOutStrU16
522#pragma aux ASMOutStrU16 = \
523 "rep outsw" \
524 parm [dx] [esi] [ecx] nomemory \
525 modify exact [esi ecx] nomemory;
526
527#undef ASMInStrU16
528#pragma aux ASMInStrU16 = \
529 "rep insw" \
530 parm [dx] [edi] [ecx] \
531 modify exact [edi ecx];
532
533#undef ASMOutStrU32
534#pragma aux ASMOutStrU32 = \
535 "rep outsd" \
536 parm [dx] [esi] [ecx] nomemory \
537 modify exact [esi ecx] nomemory;
538
539#undef ASMInStrU32
540#pragma aux ASMInStrU32 = \
541 "rep insd" \
542 parm [dx] [edi] [ecx] \
543 modify exact [edi ecx];
544
545#undef ASMInvalidatePage
546#pragma aux ASMInvalidatePage = \
547 "invlpg [eax]" \
548 parm [eax] \
549 modify exact [];
550
551#undef ASMWriteBackAndInvalidateCaches
552#pragma aux ASMWriteBackAndInvalidateCaches = \
553 ".486" \
554 "wbinvd" \
555 parm [] nomemory \
556 modify exact [] nomemory;
557
558#undef ASMInvalidateInternalCaches
559#pragma aux ASMInvalidateInternalCaches = \
560 ".486" \
561 "invd" \
562 parm [] \
563 modify exact [];
564
565#endif
566
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette