VirtualBox

Changeset 9919 in vbox


Ignore:
Timestamp:
Jun 25, 2008 2:16:59 PM (17 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
32341
Message:

Deal with DIL, SIL, BPL & SPL register accesses. (64 bits mode only)

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/dis.h

    r9761 r9919  
    193193/** @} */
    194194
    195 /** index in {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"}
     195/** index in {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI", "R8D", "R9D", "R10D", "R11D", "R12D", "R13D", "R14D", "R15D"}
    196196 * @{
    197197 */
     
    204204#define USE_REG_ESI                     6
    205205#define USE_REG_EDI                     7
    206 /** @} */
    207 /** index in {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"}
     206#define USE_REG_R8                      8
     207#define USE_REG_R9                      9
     208#define USE_REG_R10D                    10
     209#define USE_REG_R11D                    11
     210#define USE_REG_R12D                    12
     211#define USE_REG_R13D                    13
     212#define USE_REG_R14D                    14
     213#define USE_REG_R15D                    15
     214
     215/** @} */
     216/** index in {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI", "R8W", "R9W", "R10W", "R11W", "R12W", "R13W", "R14W", "R15W"}
    208217 * @{
    209218 */
     
    216225#define USE_REG_SI                      6
    217226#define USE_REG_DI                      7
    218 /** @} */
    219 
    220 /** index in {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"}
     227#define USE_REG_R10W                    10
     228#define USE_REG_R11W                    11
     229#define USE_REG_R12W                    12
     230#define USE_REG_R13W                    13
     231#define USE_REG_R14W                    14
     232#define USE_REG_R15W                    15
     233/** @} */
     234
     235/** index in {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH", "R8B", "R9B", "R10B", "R11B", "R12B", "R13B", "R14B", "R15B", "DIL", "SIL", "BPL", "SPL"}
    221236 * @{
    222237 */
     
    229244#define USE_REG_DH                      6
    230245#define USE_REG_BH                      7
     246#define USE_REG_R8B                     8
     247#define USE_REG_R9B                     9
     248#define USE_REG_R10B                    10
     249#define USE_REG_R11B                    11
     250#define USE_REG_R12B                    12
     251#define USE_REG_R13B                    13
     252#define USE_REG_R14B                    14
     253#define USE_REG_R15B                    15
     254#define USE_REG_DIL                     16
     255#define USE_REG_SIL                     17
     256#define USE_REG_BPL                     18
     257#define USE_REG_SPL                     19
     258
    231259/** @} */
    232260
  • trunk/src/VBox/Disassembler/DisasmCore.cpp

    r9912 r9919  
    21412141//*****************************************************************************
    21422142#if !defined(DIS_CORE_ONLY) && defined(LOG_ENABLED)
    2143 static const char *szModRMReg8[]      = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH"};
    2144 static const char *szModRMReg8_64[]   = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH", "R8B", "R9B", "R10B", "R11B", "R12B", "R13B", "R14B", "R15B"};
    2145 static const char *szModRMReg16[]     = {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI"};
    2146 static const char *szModRMReg16_64[]  = {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI", "R8W", "R9W", "R10W", "R11W", "R12W", "R13W", "R14W", "R15W"};
    2147 static const char *szModRMReg32[]     = {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI"};
    2148 static const char *szModRMReg32_64[]  = {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI", "R8D", "R9D", "R10D", "R11D", "R12D", "R13D", "R14D", "R15D"};
     2143static const char *szModRMReg8[]      = {"AL", "CL", "DL", "BL", "AH", "CH", "DH", "BH", "R8B", "R9B", "R10B", "R11B", "R12B", "R13B", "R14B", "R15B", "DIL", "SIL", "BPL", "SPL"};
     2144static const char *szModRMReg16[]     = {"AX", "CX", "DX", "BX", "SP", "BP", "SI", "DI", "R8W", "R9W", "R10W", "R11W", "R12W", "R13W", "R14W", "R15W"};
     2145static const char *szModRMReg32[]     = {"EAX", "ECX", "EDX", "EBX", "ESP", "EBP", "ESI", "EDI", "R8D", "R9D", "R10D", "R11D", "R12D", "R13D", "R14D", "R15D"};
    21492146static const char *szModRMReg64[]     = {"RAX", "RCX", "RDX", "RBX", "RSP", "RBP", "RSI", "RDI", "R8", "R9", "R10", "R11", "R12", "R13", "R14", "R15"};
    21502147static const char *szModRMReg1616[8]  = {"BX+SI", "BX+DI", "BP+SI", "BP+DI", "SI", "DI", "BP", "BX"};
     
    21872184    {
    21882185    case OP_PARM_b:
    2189 #if !defined(DIS_CORE_ONLY) && defined(LOG_ENABLED)
    2190         if (idx > RT_ELEMENTS(szModRMReg8))
    2191             disasmAddString(pParam->szParam, szModRMReg8_64[idx]);
    2192         else
    2193             disasmAddString(pParam->szParam, szModRMReg8[idx]);
    2194 #endif
     2186        disasmAddString(pParam->szParam, szModRMReg8[idx]);
     2187        Assert(idx < (pCpu->prefix & PREFIX_REX) ? 16 : 8);
     2188
     2189        /* AH, BH, CH & DH map to DIL, SIL, EBL & SPL when a rex prefix is present. */
     2190        /* Intel® 64 and IA-32 Architectures Software Developer’s Manual: 3.4.1.1 */
     2191        if (    (pCpu->prefix & PREFIX_REX)
     2192            &&  idx >= USE_REG_AH
     2193            &&  idx <= USE_REG_BH)
     2194        {
     2195            idx += (USE_REG_DIL - USE_REG_AH);
     2196        }
     2197
    21952198        pParam->flags |= USE_REG_GEN8;
    21962199        pParam->base.reg_gen = idx;
     
    21982201
    21992202    case OP_PARM_w:
    2200 #if !defined(DIS_CORE_ONLY) && defined(LOG_ENABLED)
    2201         if (idx > RT_ELEMENTS(szModRMReg8))
    2202             disasmAddString(pParam->szParam, szModRMReg16_64[idx]);
    2203         else
    2204             disasmAddString(pParam->szParam, szModRMReg16[idx]);
    2205 #endif
     2203        disasmAddString(pParam->szParam, szModRMReg16[idx]);
     2204        Assert(idx < (pCpu->prefix & PREFIX_REX) ? 16 : 8);
     2205
    22062206        pParam->flags |= USE_REG_GEN16;
    22072207        pParam->base.reg_gen = idx;
     
    22092209
    22102210    case OP_PARM_d:
    2211 #if !defined(DIS_CORE_ONLY) && defined(LOG_ENABLED)
    2212         if (idx > RT_ELEMENTS(szModRMReg8))
    2213             disasmAddString(pParam->szParam, szModRMReg32_64[idx]);
    2214         else
    2215             disasmAddString(pParam->szParam, szModRMReg32[idx]);
    2216 #endif
     2211        disasmAddString(pParam->szParam, szModRMReg32[idx]);
     2212        Assert(idx < (pCpu->prefix & PREFIX_REX) ? 16 : 8);
     2213
    22172214        pParam->flags |= USE_REG_GEN32;
    22182215        pParam->base.reg_gen = idx;
  • trunk/src/VBox/Disassembler/DisasmReg.cpp

    r9792 r9919  
    9696    RT_OFFSETOF(CPUMCTXCORE, esi),        /* USE_REG_ESI */
    9797    RT_OFFSETOF(CPUMCTXCORE, edi),        /* USE_REG_EDI */
    98     RT_OFFSETOF(CPUMCTXCORE, r8),         /* USE_REG_R8  : dword access */
    99     RT_OFFSETOF(CPUMCTXCORE, r9),         /* USE_REG_R9  : dword access */
    100     RT_OFFSETOF(CPUMCTXCORE, r10),        /* USE_REG_R10 : dword access */
    101     RT_OFFSETOF(CPUMCTXCORE, r11),        /* USE_REG_R11 : dword access */
    102     RT_OFFSETOF(CPUMCTXCORE, r12),        /* USE_REG_R12 : dword access */
    103     RT_OFFSETOF(CPUMCTXCORE, r13),        /* USE_REG_R13 : dword access */
    104     RT_OFFSETOF(CPUMCTXCORE, r14),        /* USE_REG_R14 : dword access */
    105     RT_OFFSETOF(CPUMCTXCORE, r15)         /* USE_REG_R15 : dword access */
     98    RT_OFFSETOF(CPUMCTXCORE, r8),         /* USE_REG_R8D */
     99    RT_OFFSETOF(CPUMCTXCORE, r9),         /* USE_REG_R9D */
     100    RT_OFFSETOF(CPUMCTXCORE, r10),        /* USE_REG_R10D */
     101    RT_OFFSETOF(CPUMCTXCORE, r11),        /* USE_REG_R11D */
     102    RT_OFFSETOF(CPUMCTXCORE, r12),        /* USE_REG_R12D */
     103    RT_OFFSETOF(CPUMCTXCORE, r13),        /* USE_REG_R13D */
     104    RT_OFFSETOF(CPUMCTXCORE, r14),        /* USE_REG_R14D */
     105    RT_OFFSETOF(CPUMCTXCORE, r15)         /* USE_REG_R15D */
    106106};
    107107
     
    127127    RT_OFFSETOF(CPUMCTXCORE, esi),        /* USE_REG_SI */
    128128    RT_OFFSETOF(CPUMCTXCORE, edi),        /* USE_REG_DI */
    129     RT_OFFSETOF(CPUMCTXCORE, r8),         /* USE_REG_R8  : word access */
    130     RT_OFFSETOF(CPUMCTXCORE, r9),         /* USE_REG_R9  : word access */
    131     RT_OFFSETOF(CPUMCTXCORE, r10),        /* USE_REG_R10 : word access */
    132     RT_OFFSETOF(CPUMCTXCORE, r11),        /* USE_REG_R11 : word access */
    133     RT_OFFSETOF(CPUMCTXCORE, r12),        /* USE_REG_R12 : word access */
    134     RT_OFFSETOF(CPUMCTXCORE, r13),        /* USE_REG_R13 : word access */
    135     RT_OFFSETOF(CPUMCTXCORE, r14),        /* USE_REG_R14 : word access */
    136     RT_OFFSETOF(CPUMCTXCORE, r15)         /* USE_REG_R15 : word access */
     129    RT_OFFSETOF(CPUMCTXCORE, r8),         /* USE_REG_R8W */
     130    RT_OFFSETOF(CPUMCTXCORE, r9),         /* USE_REG_R9W */
     131    RT_OFFSETOF(CPUMCTXCORE, r10),        /* USE_REG_R10W */
     132    RT_OFFSETOF(CPUMCTXCORE, r11),        /* USE_REG_R11W */
     133    RT_OFFSETOF(CPUMCTXCORE, r12),        /* USE_REG_R12W */
     134    RT_OFFSETOF(CPUMCTXCORE, r13),        /* USE_REG_R13W */
     135    RT_OFFSETOF(CPUMCTXCORE, r14),        /* USE_REG_R14W */
     136    RT_OFFSETOF(CPUMCTXCORE, r15)         /* USE_REG_R15W */
    137137};
    138138
     
    158158    RT_OFFSETOF(CPUMCTXCORE, edx) + 1,    /* USE_REG_DH */
    159159    RT_OFFSETOF(CPUMCTXCORE, ebx) + 1,    /* USE_REG_BH */
    160     RT_OFFSETOF(CPUMCTXCORE, r8),         /* USE_REG_R8  : byte access */
    161     RT_OFFSETOF(CPUMCTXCORE, r9),         /* USE_REG_R9  : byte access */
    162     RT_OFFSETOF(CPUMCTXCORE, r10),        /* USE_REG_R10 : byte access */
    163     RT_OFFSETOF(CPUMCTXCORE, r11),        /* USE_REG_R11 : byte access */
    164     RT_OFFSETOF(CPUMCTXCORE, r12),        /* USE_REG_R12 : byte access */
    165     RT_OFFSETOF(CPUMCTXCORE, r13),        /* USE_REG_R13 : byte access */
    166     RT_OFFSETOF(CPUMCTXCORE, r14),        /* USE_REG_R14 : byte access */
    167     RT_OFFSETOF(CPUMCTXCORE, r15)         /* USE_REG_R15 : byte access */
     160    RT_OFFSETOF(CPUMCTXCORE, r8),         /* USE_REG_R8B */
     161    RT_OFFSETOF(CPUMCTXCORE, r9),         /* USE_REG_R9B */
     162    RT_OFFSETOF(CPUMCTXCORE, r10),        /* USE_REG_R10B*/
     163    RT_OFFSETOF(CPUMCTXCORE, r11),        /* USE_REG_R11B */
     164    RT_OFFSETOF(CPUMCTXCORE, r12),        /* USE_REG_R12B */
     165    RT_OFFSETOF(CPUMCTXCORE, r13),        /* USE_REG_R13B */
     166    RT_OFFSETOF(CPUMCTXCORE, r14),        /* USE_REG_R14B */
     167    RT_OFFSETOF(CPUMCTXCORE, r15),        /* USE_REG_R15B */
     168    RT_OFFSETOF(CPUMCTXCORE, edi),        /* USE_REG_DIL; with REX prefix only */
     169    RT_OFFSETOF(CPUMCTXCORE, esi),        /* USE_REG_SIL; with REX prefix only */
     170    RT_OFFSETOF(CPUMCTXCORE, ebp),        /* USE_REG_BPL; with REX prefix only */
     171    RT_OFFSETOF(CPUMCTXCORE, esp),        /* USE_REG_SPL; with REX prefix only */
    168172};
    169173
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