Changeset 49182 in vbox for trunk/src/VBox/Runtime/common/asm
- Timestamp:
- Oct 18, 2013 2:14:27 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 90059
- File:
-
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/asm/ASMCpuIdExSlow.asm
r49175 r49182 1 1 ; $Id$ 2 2 ;; @file 3 ; IPRT - ASMCpuId _Idx_ECX().3 ; IPRT - ASMCpuIdExSlow(). 4 4 ; 5 5 … … 35 35 ; CPUID with EAX and ECX inputs, returning ALL output registers. 36 36 ; 37 ; @param uOperator x86:ebp+8 gcc:rdi msc:rcx 38 ; @param uIdxECX x86:ebp+c gcc:rsi msc:rdx 39 ; @param pvEAX x86:ebp+10 gcc:rcx msc:r8 40 ; @param pvEBX x86:ebp+14 gcc:rdx msc:r9 41 ; @param pvECX x86:ebp+18 gcc:r8 msc:rsp+28h 42 ; @param pvEDX x86:ebp+1c gcc:r9 msc:rsp+30h 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:rcx msc:r8 40 ; @param uInitEDX x86:ebp+14 gcc:rdx 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 43 45 ; 44 ; @returns void46 ; @returns EAX 45 47 ; 46 BEGINPROC_EXPORTED ASMCpuId_Idx_ECX 47 %ifdef RT_ARCH_AMD64 48 mov r10, rbx 48 BEGINPROC_EXPORTED ASMCpuIdExSlow 49 push xBP 50 mov xBP, xSP 51 push xBX 52 %ifdef RT_ARCH_X86 53 push edi 54 %endif 49 55 50 %ifdef ASM_CALL64_MSC 51 56 %ifdef ASM_CALL64_MSC 52 57 mov eax, ecx 53 mov ecx, edx 54 xor ebx, ebx 55 xor edx, edx 58 mov ebx, edx 59 mov ecx, r8 60 mov edx, r9 61 mov r8, [rbp + 30h] 62 mov r9, [rbp + 38h] 63 mov r10, [rbp + 40h] 64 mov r11, [rbp + 48h] 65 %elifdef ASM_CALL64_GCC 66 mov eax, edi 67 mov ebx, esi 68 mov r10, [rbp + 10h] 69 mov r11, [rbp + 18h] 70 %elifdef RT_ARCH_X86 71 mov eax, [ebp + 08h] 72 mov ebx, [ebp + 0ch] 73 mov ecx, [ebp + 10h] 74 mov edx, [ebp + 14h] 75 mov edi [ebp + 18h] 76 %else 77 %error unsupported arch 78 %endif 56 79 57 80 cpuid 58 81 82 %ifdef RT_ARCH_AMD64 83 test r8, r8 84 jz .store_ebx 59 85 mov [r8], eax 60 mov [r9], ebx 61 mov rax, [rsp + 28h] 62 mov rbx, [rsp + 30h] 63 mov [rax], ecx 64 mov [rbx], edx 86 %else 87 test edi, edi 88 jz .store_ebx 89 mov [edi], eax 90 %endif 91 .store_ebx: 65 92 66 %else 67 mov eax, edi 68 xchg rcx, rsi 69 mov ecx, ecx ; paranoia: clear upper bits 70 mov r11, rdx 71 xor ebx, ebx 72 xor edx, edx 93 %ifdef RT_ARCH_AMD64 94 test r9, r9 95 jz .store_ecx 96 mov [r9], eax 97 %else 98 mov edi, [ebp + 1ch] 99 test edi, edi 100 jz .store_ecx 101 mov [edi], ebx 102 %endif 103 .store_ecx: 73 104 74 cpuid 105 %ifdef RT_ARCH_AMD64 106 test r10, r10 107 jz .store_edx 108 mov [r10], ecx 109 %else 110 mov edi, [ebp + 20h] 111 test edi, edi 112 jz .store_edx 113 mov [edi], ecx 114 %endif 115 .store_edx: 75 116 76 mov [rsi], eax 77 mov [r11], ebx 78 mov [r8], ecx 79 mov [r9], edx 117 %ifdef RT_ARCH_AMD64 118 test r11, r11 119 jz .done 120 mov [r11], ecx 121 %else 122 mov edi, [ebp + 24h] 123 test edi, edi 124 jz .done 125 mov [edi], edx 126 %endif 127 .done: 80 128 81 %endif 82 83 mov rbx, r10 84 ret 85 86 %elifdef RT_ARCH_X86 87 push ebp 88 mov ebp, esp 89 push ebx 90 push edi 91 92 xor edx, edx 93 xor ebx, ebx 94 mov eax, [ebp + 08h] 95 mov ecx, [ebp + 0ch] 96 97 cpuid 98 99 mov edi, [ebp + 10h] 100 mov [edi], eax 101 mov edi, [ebp + 14h] 102 mov [edi], ebx 103 mov edi, [ebp + 18h] 104 mov [edi], ecx 105 mov edi, [ebp + 1ch] 106 mov [edi], edx 107 129 %ifdef RT_ARCH_X86 108 130 pop edi 109 pop ebx 131 %endif 132 pop xBX 110 133 leave 111 134 ret 112 %else 113 %error unsupported arch 114 %endif 115 ENDPROC ASMCpuId_Idx_ECX 135 ENDPROC ASMCpuIdExSlow 116 136
Note:
See TracChangeset
for help on using the changeset viewer.