VirtualBox

Ignore:
Timestamp:
Oct 18, 2013 2:14:27 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
90059
Message:

Added ASMCpuIdExSlow and made CPUM use it.

File:
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/asm/ASMCpuIdExSlow.asm

    r49175 r49182  
    11; $Id$
    22;; @file
    3 ; IPRT - ASMCpuId_Idx_ECX().
     3; IPRT - ASMCpuIdExSlow().
    44;
    55
     
    3535; CPUID with EAX and ECX inputs, returning ALL output registers.
    3636;
    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
    4345;
    44 ; @returns  void
     46; @returns  EAX
    4547;
    46 BEGINPROC_EXPORTED ASMCpuId_Idx_ECX
    47 %ifdef RT_ARCH_AMD64
    48         mov     r10, rbx
     48BEGINPROC_EXPORTED ASMCpuIdExSlow
     49        push    xBP
     50        mov     xBP, xSP
     51        push    xBX
     52%ifdef RT_ARCH_X86
     53        push    edi
     54%endif
    4955
    50  %ifdef ASM_CALL64_MSC
    51 
     56%ifdef ASM_CALL64_MSC
    5257        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
    5679
    5780        cpuid
    5881
     82%ifdef RT_ARCH_AMD64
     83        test    r8, r8
     84        jz      .store_ebx
    5985        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:
    6592
    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:
    73104
    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:
    75116
    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:
    80128
    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
    108130        pop     edi
    109         pop     ebx
     131%endif
     132        pop     xBX
    110133        leave
    111134        ret
    112 %else
    113  %error unsupported arch
    114 %endif
    115 ENDPROC ASMCpuId_Idx_ECX
     135ENDPROC ASMCpuIdExSlow
    116136
Note: See TracChangeset for help on using the changeset viewer.

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