VirtualBox

Ignore:
Timestamp:
Jun 23, 2013 5:54:29 PM (11 years ago)
Author:
vboxsync
Message:

32-bit memory accesses in 64-bit mode.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/testcase/Instructions/InstructionTestGen.py

    r46733 r46744  
    4545    """ 64-bit one bit mask. """
    4646    return 1 << iBit;
    47 ## @}
    48 
    49 
    50 ## @name Misc
    51 ## @{
    52 
    53 def convU32ToSigned(u32):
    54     """ Converts a 32-bit unsigned value to 32-bit signed. """
    55     if u32 < 0x80000000:
    56         return u32;
    57     return u32 - UINT32_MAX - 1;
    58 
    5947## @}
    6048
     
    114102g_asGRegs16     = ('ax',  'cx',  'dx',  'bx',  'sp',  'bp',  'si',  'di',
    115103                   'r8w', 'r9w', 'r10w', 'r11w', 'r12w', 'r13w', 'r14w', 'r15w');
    116 g_asGRegs8_86   = ('al',  'cl',  'dl',  'bl',  'ah',  'ah',  'dh',  'bh');
    117 g_asGRegs8_64   = ('al',  'cl',  'dl',  'bl',  'spl', 'bpl', 'sil',  'dil',        # pylint: disable=C0103
     104g_asGRegs8      = ('al',  'cl',  'dl',  'bl',  'ah',  'ah',  'dh',  'bh');
     105g_asGRegs8Rex   = ('al',  'cl',  'dl',  'bl',  'spl', 'bpl', 'sil',  'dil',
    118106                   'r8b', 'r9b', 'r10b', 'r11b', 'r12b', 'r13b', 'r14b', 'r15b');
    119107## @}
     
    174162        | (iRm   &  X86_MODRM_RM_MASK);
    175163    return [bRm,];
     164
     165## @}
     166
     167
     168## @name Misc
     169## @{
     170
     171def convU32ToSigned(u32):
     172    """ Converts a 32-bit unsigned value to 32-bit signed. """
     173    if u32 < 0x80000000:
     174        return u32;
     175    return u32 - UINT32_MAX - 1;
     176
     177def gregName(iReg, cBits, fRexByteRegs = True):
     178    """ Gets the name of a general register by index and width. """
     179    if cBits == 64:
     180        return g_asGRegs64[iReg];
     181    if cBits == 32:
     182        return g_asGRegs32[iReg];
     183    if cBits == 16:
     184        return g_asGRegs16[iReg];
     185    assert cBits == 8;
     186    if fRexByteRegs:
     187        return g_asGRegs8Rex[iReg];
     188    return g_asGRegs8[iReg];
    176189
    177190## @}
     
    268281        if self.sInstrSet == self.ksInstrSet_32:
    269282            return [32, 16];
    270         return [64, 64];
     283        return [64, 32];
    271284
    272285
     
    372385            oGen.write('        %s %s, %s\n' % (self.sInstr, g_asGRegs16[iOp1], g_asGRegs16[iOp2]));
    373386        elif cbEffOp == 1:
    374             oGen.write('        %s %s, %s\n' % (self.sInstr, g_asGRegs8_64[iOp1], g_asGRegs8_64[iOp2]));
     387            oGen.write('        %s %s, %s\n' % (self.sInstr, g_asGRegs8Rex[iOp1], g_asGRegs8Rex[iOp2]));
    375388        else:
    376389            assert False;
     
    386399            oGen.write('        %s %s, [' % (self.sInstr, g_asGRegs16[iOp1],));
    387400        elif cbEffOp == 1:
    388             oGen.write('        %s %s, [' % (self.sInstr, g_asGRegs8_64[iOp1],));
     401            oGen.write('        %s %s, [' % (self.sInstr, g_asGRegs8Rex[iOp1],));
    389402        else:
    390403            assert False;
     
    524537                        else:
    525538                            pass; # SIB
    526                     break; ## remove me!
    527                 #break; ## remove me!
    528             #break; ## remove me!
    529539
    530540        return True;
     
    696706        Records the need for a given register checker function, returning its label.
    697707        """
    698         sName = '%ubit_U%u_%s' % (cAddrBits, cbEffOp * 8, self.oTarget.asGRegs[iReg1]);
     708        sName = '%ubit_U%u_%s' % (cAddrBits, cbEffOp * 8, gregName(iReg1, cAddrBits),);
    699709        if offDisp is not None:
    700710            sName += '_%#010x' % (offDisp & UINT32_MAX, );
     
    847857            elif cAddrBits == 32: asAddrGRegs = g_asGRegs32;
    848858            else:                 asAddrGRegs = g_asGRegs16;
    849             iBaseReg = asAddrGRegs.index(sBaseReg);
     859            try:
     860                iBaseReg = asAddrGRegs.index(sBaseReg);
     861            except ValueError:
     862                assert False, 'sBaseReg=%s' % (sBaseReg,);
     863                raise;
    850864
    851865            i = 3;
     
    891905            else:
    892906                assert cEffOpBits == 8;
    893                 sTmpReg1 = g_asGRegs8_64[iTmpReg1];
     907                sTmpReg1 = g_asGRegs8Rex[iTmpReg1];
    894908                sDataVar = 'VBINSTST_NAME(g_u8Data)';
    895909
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