VirtualBox

Changeset 66335 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Mar 29, 2017 2:32:37 PM (8 years ago)
Author:
vboxsync
Message:

IEM: Fixed UD1 / grp 10 decoding (intel eats modr/m after it).

File:
1 copied

Legend:

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

    r66326 r66335  
    3333
    3434;;
    35 ; CPUID with EAX and ECX inputs, returning ALL output registers.
     35; CPUID with EAX input, returning ALL output registers (no NULL checking).
    3636;
    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
     37; @param    uOperator   8086:bp+4   x86:ebp+8   gcc:rdi  msc:rcx
     38; @param    pvEAX       8086:bp+8   x86:ebp+0c  gcc:rsi  msc:rdx
     39; @param    pvEBX       8086:bp+0c  x86:ebp+10  gcc:rdx  msc:r8
     40; @param    pvECX       8086:bp+10  x86:ebp+14  gcc:rcx  msc:r9
     41; @param    pvEDX       8086:bp+14  x86:ebp+18  gcc:r8   msc:rbp+30h
    4542;
    46 ; @returns  EAX
     43; DECLASM(void) ASMCpuId(uint32_t uOperator, void *pvEAX, void *pvEBX, void *pvECX, void *pvEDX);
    4744;
    48 BEGINPROC_EXPORTED ASMCpuIdExSlow
     45BEGINPROC_EXPORTED ASMCpuId
    4946        push    xBP
    5047        mov     xBP, xSP
    5148        push    xBX
    52 %if ARCH_BITS == 32
    53         push    edi
    54 %elif ARCH_BITS == 16
    55         push    di
    56         push    es
    57 %endif
    5849
    5950%ifdef ASM_CALL64_MSC
     
    6253 %endif
    6354        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]
     55        mov     r10, rdx
     56        cpuid
     57        mov     [r10], eax
     58        mov     [r8], ebx
     59        mov     [r9], ecx
     60        mov     r10, [rbp+30h]
     61        mov     [r10], edx
     62
    7163%elifdef ASM_CALL64_GCC
    7264        mov     eax, edi
    73         mov     ebx, esi
    74         xchg    ecx, edx
    75         mov     r10, [rbp + 10h]
    76         mov     r11, [rbp + 18h]
     65        mov     r10, rdx
     66        mov     r11, rcx
     67        cpuid
     68        mov     [rsi], eax
     69        mov     [r10], ebx
     70        mov     [r11], ecx
     71        mov     [r8], edx
     72
    7773%elif ARCH_BITS == 32
    7874        mov     eax, [xBP + 08h]
    79         mov     ebx, [xBP + 0ch]
    80         mov     ecx, [xBP + 10h]
     75        cpuid
     76        push    edx
     77        mov     edx, [xBP + 0ch]
     78        mov     [edx], eax
     79        mov     edx, [xBP + 10h]
     80        mov     [edx], ebx
    8181        mov     edx, [xBP + 14h]
    82         mov     edi, [xBP + 18h]
     82        mov     [edx], ecx
     83        mov     edx, [xBP + 18h]
     84        pop     dword [edx]
     85
    8386%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]
     87        push    es
     88        push    di
     89
     90        mov     eax, [xBP + 04h]
     91        cpuid
     92        les     di, [xBP + 08h]
     93        mov     [di], eax
     94        les     di, [xBP + 0ch]
     95        mov     [di], ebx
     96        les     di, [xBP + 10h]
     97        mov     [di], ecx
     98        les     di, [xBP + 14h]
     99        mov     [di], edx
     100
     101        pop     di
     102        pop     es
    88103%else
    89104 %error unsupported arch
    90105%endif
    91106
    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
    167107        pop     xBX
    168108        leave
    169109        ret
    170 ENDPROC ASMCpuIdExSlow
     110ENDPROC ASMCpuId
    171111
Note: See TracChangeset for help on using the changeset viewer.

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