VirtualBox

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

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

asm-amd64-x86-watcom-32.h: Initial pragma aux implementation for 32-bit Watcom C/C++ code.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 10.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#pragma aux ASMGetIDTR = \
38 "sidt fword ptr [ecx]" \
39 parm [ecx] \
40 modify exact [];
41
42#pragma aux ASMGetIdtrLimit = \
43 "sub esp, 8" \
44 "sidt fword ptr [esp]" \
45 "mov cx, [esp]" \
46 "add esp, 8" \
47 parm [] \
48 value [cx] \
49 modify exact [ecx];
50
51#pragma aux ASMSetIDTR = \
52 "lidt fword ptr [ecx]" \
53 parm [ecx] nomemory \
54 modify nomemory;
55
56#pragma aux ASMGetGDTR = \
57 "sgdt fword ptr [ecx]" \
58 parm [ecx] \
59 modify exact [];
60
61#pragma aux ASMSetGDTR = \
62 "lgdt fword ptr [ecx]" \
63 parm [ecx] nomemory \
64 modify exact [] nomemory;
65
66#pragma aux ASMGetCS = \
67 "mov ax, cs" \
68 parm [] nomemory \
69 value [ax] \
70 modify exact [eax] nomemory;
71
72#pragma aux ASMGetDS = \
73 "mov ax, ds" \
74 parm [] nomemory \
75 value [ax] \
76 modify exact [eax] nomemory;
77
78#pragma aux ASMGetES = \
79 "mov ax, es" \
80 parm [] nomemory \
81 value [ax] \
82 modify exact [eax] nomemory;
83
84#pragma aux ASMGetFS = \
85 "mov ax, fs" \
86 parm [] nomemory \
87 value [ax] \
88 modify exact [eax] nomemory;
89
90#pragma aux ASMGetGS = \
91 "mov ax, gs" \
92 parm [] nomemory \
93 value [ax] \
94 modify exact [eax] nomemory;
95
96#pragma aux ASMGetSS = \
97 "mov ax, ss" \
98 parm [] nomemory \
99 value [ax] \
100 modify exact [eax] nomemory;
101
102#pragma aux ASMGetTR = \
103 "str ax" \
104 parm [] nomemory \
105 value [ax] \
106 modify exact [eax] nomemory;
107
108#pragma aux ASMGetLDTR = \
109 "sldt ax" \
110 parm [] nomemory \
111 value [ax] \
112 modify exact [eax] nomemory;
113
114/** @todo ASMGetSegAttr */
115
116#pragma aux ASMGetFlags = \
117 "pushfd" \
118 "pop eax" \
119 parm [] nomemory \
120 value [eax] \
121 modify exact [eax] nomemory;
122
123#pragma aux ASMSetFlags = \
124 "push eax" \
125 "popfd" \
126 parm [eax] nomemory \
127 modify exact [] nomemory;
128
129#pragma aux ASMChangeFlags = \
130 "pushfd" \
131 "pop eax" \
132 "and edx, eax" \
133 "or edx, ecx" \
134 "push edx" \
135 "popfd" \
136 parm [edx] [ecx] nomemory \
137 value [eax] \
138 modify exact [edx] nomemory;
139
140#pragma aux ASMAddFlags = \
141 "pushfd" \
142 "pop eax" \
143 "or edx, eax" \
144 "push edx" \
145 "popfd" \
146 parm [edx] nomemory \
147 value [eax] \
148 modify exact [edx] nomemory;
149
150#pragma aux ASMClearFlags = \
151 "pushfd" \
152 "pop eax" \
153 "and edx, eax" \
154 "push edx" \
155 "popfd" \
156 parm [edx] nomemory \
157 value [eax] \
158 modify exact [edx] nomemory;
159
160/* Note! Must use the 64-bit integer return value convension.
161 The order of registers in the value [set] does not seem to mean anything. */
162#pragma aux ASMReadTSC = \
163 ".586" \
164 "rdtsc" \
165 parm [] nomemory \
166 value [eax edx] \
167 modify exact [edx eax] nomemory;
168
169#pragma aux ASMReadTscWithAux = \
170 0x0f 0x01 0xf9 \
171 parm [ecx] \
172 value [eax edx] \
173 modify exact [eax edx];
174
175/* ASMCpuId: Implemented externally, too many parameters. */
176/* ASMCpuId_Idx_ECX: Implemented externally, too many parameters. */
177/* ASMCpuIdExSlow: Always implemented externally. */
178
179#pragma aux ASMCpuId_ECX_EDX = \
180 "cpuid" \
181 "mov [edi], ecx" \
182 "mov [esi], edx" \
183 parm [ecx] [edi] [esi] \
184 modify exact [eax ebx ecx edx];
185
186#pragma aux ASMCpuId_EAX = \
187 "cpuid" \
188 parm [ecx] \
189 value [eax] \
190 modify exact [eax ebx ecx edx];
191
192#pragma aux ASMCpuId_EBX = \
193 "cpuid" \
194 parm [ecx] \
195 value [ebx] \
196 modify exact [eax ebx ecx edx];
197
198#pragma aux ASMCpuId_ECX = \
199 "cpuid" \
200 parm [ecx] \
201 value [ecx] \
202 modify exact [eax ebx ecx edx];
203
204#pragma aux ASMCpuId_EDX = \
205 "cpuid" \
206 parm [ecx] \
207 value [edx] \
208 modify exact [eax ebx ecx edx];
209
210/* ASMHasCpuId: MSC inline in main source file. */
211/* ASMGetApicId: Implemented externally, lazy bird. */
212
213#pragma aux ASMGetCR0 = \
214 "mov eax, cr0" \
215 parm [] nomemory \
216 value [eax] \
217 modify exact [eax] nomemory;
218
219#pragma aux ASMSetCR0 = \
220 "mov cr0, eax" \
221 parm [eax] nomemory \
222 modify exact [] nomemory;
223
224#pragma aux ASMGetCR2 = \
225 "mov eax, cr2" \
226 parm [] nomemory \
227 value [eax] \
228 modify exact [eax] nomemory;
229
230#pragma aux ASMSetCR2 = \
231 "mov cr2, eax" \
232 parm [eax] nomemory \
233 modify exact [] nomemory;
234
235#pragma aux ASMGetCR3 = \
236 "mov eax, cr3" \
237 parm [] nomemory \
238 value [eax] \
239 modify exact [eax] nomemory;
240
241#pragma aux ASMSetCR3 = \
242 "mov cr3, eax" \
243 parm [eax] nomemory \
244 modify exact [] nomemory;
245
246#pragma aux ASMReloadCR3 = \
247 "mov eax, cr3" \
248 "mov cr3, eax" \
249 parm [] nomemory \
250 modify exact [eax] nomemory;
251
252#pragma aux ASMGetCR4 = \
253 "mov eax, cr4" \
254 parm [] nomemory \
255 value [eax] \
256 modify exact [eax] nomemory;
257
258#pragma aux ASMSetCR4 = \
259 "mov cr4, eax" \
260 parm [eax] nomemory \
261 modify exact [] nomemory;
262
263/* ASMGetCR8: Don't bother for 32-bit. */
264/* ASMSetCR8: Don't bother for 32-bit. */
265
266#pragma aux ASMIntEnable = \
267 "sti" \
268 parm [] nomemory \
269 modify exact [] nomemory;
270
271#pragma aux ASMIntDisable = \
272 "cli" \
273 parm [] nomemory \
274 modify exact [] nomemory;
275
276#pragma aux ASMIntDisableFlags = \
277 "pushfd" \
278 "cli" \
279 "pop eax" \
280 parm [] nomemory \
281 value [eax] \
282 modify exact [] nomemory;
283
284#pragma aux ASMHalt = \
285 "hlt" \
286 parm [] nomemory \
287 modify exact [] nomemory;
288
289#pragma aux ASMRdMsr = \
290 ".586" \
291 "rdmsr" \
292 parm [ecx] nomemory \
293 value [eax edx] \
294 modify exact [eax edx] nomemory;
295
296#pragma aux ASMWrMsr = \
297 ".586" \
298 "wrmsr" \
299 parm [ecx] [eax edx] nomemory \
300 modify exact [] nomemory;
301
302#pragma aux ASMRdMsrEx = \
303 ".586" \
304 "rdmsr" \
305 parm [ecx] [edi] nomemory \
306 value [eax edx] \
307 modify exact [eax edx] nomemory;
308
309#pragma aux ASMWrMsrEx = \
310 ".586" \
311 "wrmsr" \
312 parm [ecx] [edi] [eax edx] nomemory \
313 modify exact [] nomemory;
314
315#pragma aux ASMRdMsr_Low = \
316 ".586" \
317 "rdmsr" \
318 parm [ecx] nomemory \
319 value [eax] \
320 modify exact [eax edx] nomemory;
321
322#pragma aux ASMRdMsr_High = \
323 ".586" \
324 "rdmsr" \
325 parm [ecx] nomemory \
326 value [edx] \
327 modify exact [eax edx] nomemory;
328
329
330#pragma aux ASMGetDR0 = \
331 "mov eax, dr0" \
332 parm [] nomemory \
333 value [eax] \
334 modify exact [eax] nomemory;
335
336#pragma aux ASMGetDR1 = \
337 "mov eax, dr1" \
338 parm [] nomemory \
339 value [eax] \
340 modify exact [eax] nomemory;
341
342#pragma aux ASMGetDR2 = \
343 "mov eax, dr2" \
344 parm [] nomemory \
345 value [eax] \
346 modify exact [eax] nomemory;
347
348#pragma aux ASMGetDR3 = \
349 "mov eax, dr3" \
350 parm [] nomemory \
351 value [eax] \
352 modify exact [eax] nomemory;
353
354#pragma aux ASMGetDR6 = \
355 "mov eax, dr6" \
356 parm [] nomemory \
357 value [eax] \
358 modify exact [eax] nomemory;
359
360#pragma aux ASMGetAndClearDR6 = \
361 "mov edx, 0ffff0ff0h" \
362 "mov eax, dr6" \
363 "mov dr6, edx" \
364 parm [] nomemory \
365 value [eax] \
366 modify exact [eax edx] nomemory;
367
368#pragma aux ASMGetDR7 = \
369 "mov eax, dr7" \
370 parm [] nomemory \
371 value [eax] \
372 modify exact [eax] nomemory;
373
374#pragma aux ASMSetDR0 = \
375 "mov dr0, eax" \
376 parm [eax] nomemory \
377 modify exact [] nomemory;
378
379#pragma aux ASMSetDR1 = \
380 "mov dr1, eax" \
381 parm [eax] nomemory \
382 modify exact [] nomemory;
383
384#pragma aux ASMSetDR2 = \
385 "mov dr2, eax" \
386 parm [eax] nomemory \
387 modify exact [] nomemory;
388
389#pragma aux ASMSetDR3 = \
390 "mov dr3, eax" \
391 parm [eax] nomemory \
392 modify exact [] nomemory;
393
394#pragma aux ASMSetDR6 = \
395 "mov dr6, eax" \
396 parm [eax] nomemory \
397 modify exact [] nomemory;
398
399#pragma aux ASMSetDR7 = \
400 "mov dr7, eax" \
401 parm [eax] nomemory \
402 modify exact [] nomemory;
403
404/* Yeah, could've used outp here, but this keeps the main file simpler. */
405#pragma aux ASMOutU8 = \
406 "out dx, al" \
407 parm [dx] [al] nomemory \
408 modify exact [] nomemory;
409
410#pragma aux ASMInU8 = \
411 "in al, dx" \
412 parm [dx] nomemory \
413 value [al] \
414 modify exact [] nomemory;
415
416#pragma aux ASMOutU16 = \
417 "out dx, ax" \
418 parm [dx] [ax] nomemory \
419 modify exact [] nomemory;
420
421#pragma aux ASMInU16 = \
422 "in ax, dx" \
423 parm [dx] nomemory \
424 value [ax] \
425 modify exact [] nomemory;
426
427#pragma aux ASMOutU32 = \
428 "out dx, eax" \
429 parm [dx] [eax] nomemory \
430 modify exact [] nomemory;
431
432#pragma aux ASMInU32 = \
433 "in eax, dx" \
434 parm [dx] nomemory \
435 value [eax] \
436 modify exact [] nomemory;
437
438#pragma aux ASMOutStrU8 = \
439 "rep outsb" \
440 parm [dx] [esi] [ecx] nomemory \
441 modify exact [esi ecx] nomemory;
442
443#pragma aux ASMInStrU8 = \
444 "rep insb" \
445 parm [dx] [edi] [ecx] \
446 modify exact [edi ecx];
447
448#pragma aux ASMOutStrU16 = \
449 "rep outsw" \
450 parm [dx] [esi] [ecx] nomemory \
451 modify exact [esi ecx] nomemory;
452
453#pragma aux ASMInStrU16 = \
454 "rep insw" \
455 parm [dx] [edi] [ecx] \
456 modify exact [edi ecx];
457
458#pragma aux ASMOutStrU32 = \
459 "rep outsd" \
460 parm [dx] [esi] [ecx] nomemory \
461 modify exact [esi ecx] nomemory;
462
463#pragma aux ASMInStrU32 = \
464 "rep insd" \
465 parm [dx] [edi] [ecx] \
466 modify exact [edi ecx];
467
468#pragma aux ASMInvalidatePage = \
469 "invlpg [eax]" \
470 parm [eax] \
471 modify exact [];
472
473#pragma aux ASMWriteBackAndInvalidateCaches = \
474 ".486" \
475 "wbinvd" \
476 parm [] nomemory \
477 modify exact [] nomemory;
478
479#pragma aux ASMInvalidateInternalCaches = \
480 ".486" \
481 "invd" \
482 parm [] \
483 modify exact [];
484
485#endif
486
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