VirtualBox

source: vbox/trunk/src/VBox/Runtime/common/asm/ASMCpuIdExSlow.asm@ 78098

Last change on this file since 78098 was 76553, checked in by vboxsync, 6 years ago

scm --update-copyright-year

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.5 KB
Line 
1; $Id: ASMCpuIdExSlow.asm 76553 2019-01-01 01:45:53Z vboxsync $
2;; @file
3; IPRT - ASMCpuIdExSlow().
4;
5
6;
7; Copyright (C) 2012-2019 Oracle Corporation
8;
9; This file is part of VirtualBox Open Source Edition (OSE), as
10; available from http://www.virtualbox.org. This file is free software;
11; you can redistribute it and/or modify it under the terms of the GNU
12; General Public License (GPL) as published by the Free Software
13; Foundation, in version 2 as it comes in the "COPYING" file of the
14; VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15; hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16;
17; The contents of this file may alternatively be used under the terms
18; of the Common Development and Distribution License Version 1.0
19; (CDDL) only, as it comes in the "COPYING.CDDL" file of the
20; VirtualBox OSE distribution, in which case the provisions of the
21; CDDL are applicable instead of those of the GPL.
22;
23; You may elect to license modified versions of this file under the
24; terms and conditions of either the GPL or the CDDL or both.
25;
26
27;*******************************************************************************
28;* Header Files *
29;*******************************************************************************
30%include "iprt/asmdefs.mac"
31
32BEGINCODE
33
34;;
35; CPUID with EAX and ECX inputs, returning ALL output registers.
36;
37; @param uOperator x86:ebp+8 gcc:rdi msc:rcx
38; @param uInitEBX x86:ebp+c gcc:rsi msc:rdx
39; @param uInitECX x86:ebp+10 gcc:rdx msc:r8
40; @param uInitEDX x86:ebp+14 gcc:rcx msc:r9
41; @param pvEAX x86:ebp+18 gcc:r8 msc:rbp+30h
42; @param pvEBX x86:ebp+1c gcc:r9 msc:rbp+38h
43; @param pvECX x86:ebp+20 gcc:rbp+10h msc:rbp+40h
44; @param pvEDX x86:ebp+24 gcc:rbp+18h msc:rbp+48h
45;
46; @returns EAX
47;
48BEGINPROC_EXPORTED ASMCpuIdExSlow
49 push xBP
50 mov xBP, xSP
51 push xBX
52%if ARCH_BITS == 32
53 push edi
54%elif ARCH_BITS == 16
55 push di
56 push es
57%endif
58
59%ifdef ASM_CALL64_MSC
60 %if ARCH_BITS != 64
61 %error ARCH_BITS mismatch?
62 %endif
63 mov eax, ecx
64 mov ebx, edx
65 mov ecx, r8d
66 mov edx, r9d
67 mov r8, [rbp + 30h]
68 mov r9, [rbp + 38h]
69 mov r10, [rbp + 40h]
70 mov r11, [rbp + 48h]
71%elifdef ASM_CALL64_GCC
72 mov eax, edi
73 mov ebx, esi
74 xchg ecx, edx
75 mov r10, [rbp + 10h]
76 mov r11, [rbp + 18h]
77%elif ARCH_BITS == 32
78 mov eax, [xBP + 08h]
79 mov ebx, [xBP + 0ch]
80 mov ecx, [xBP + 10h]
81 mov edx, [xBP + 14h]
82 mov edi, [xBP + 18h]
83%elif ARCH_BITS == 16
84 mov eax, [xBP + 08h - 4]
85 mov ebx, [xBP + 0ch - 4]
86 mov ecx, [xBP + 10h - 4]
87 mov edx, [xBP + 14h - 4]
88%else
89 %error unsupported arch
90%endif
91
92 cpuid
93
94%ifdef RT_ARCH_AMD64
95 test r8, r8
96 jz .store_ebx
97 mov [r8], eax
98%elif ARCH_BITS == 32
99 test edi, edi
100 jz .store_ebx
101 mov [edi], eax
102%else
103 cmp dword [bp + 18h - 4], 0
104 je .store_ebx
105 les di, [bp + 18h - 4]
106 mov [es:di], eax
107%endif
108.store_ebx:
109
110%ifdef RT_ARCH_AMD64
111 test r9, r9
112 jz .store_ecx
113 mov [r9], ebx
114%elif ARCH_BITS == 32
115 mov edi, [ebp + 1ch]
116 test edi, edi
117 jz .store_ecx
118 mov [edi], ebx
119%else
120 cmp dword [bp + 1ch - 4], 0
121 je .store_ecx
122 les di, [bp + 1ch - 4]
123 mov [es:di], ebx
124%endif
125.store_ecx:
126
127%ifdef RT_ARCH_AMD64
128 test r10, r10
129 jz .store_edx
130 mov [r10], ecx
131%elif ARCH_BITS == 32
132 mov edi, [ebp + 20h]
133 test edi, edi
134 jz .store_edx
135 mov [edi], ecx
136%else
137 cmp dword [bp + 20h - 4], 0
138 je .store_edx
139 les di, [bp + 20h - 4]
140 mov [es:di], ecx
141%endif
142.store_edx:
143
144%ifdef RT_ARCH_AMD64
145 test r11, r11
146 jz .done
147 mov [r11], edx
148%elif ARCH_BITS == 32
149 mov edi, [ebp + 24h]
150 test edi, edi
151 jz .done
152 mov [edi], edx
153%else
154 cmp dword [bp + 24h - 4], 0
155 je .done
156 les di, [bp + 24h - 4]
157 mov [es:di], edx
158%endif
159.done:
160
161%if ARCH_BITS == 32
162 pop edi
163%elif ARCH_BITS == 16
164 pop es
165 pop di
166%endif
167 pop xBX
168 leave
169 ret
170ENDPROC ASMCpuIdExSlow
171
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