VirtualBox

Changeset 66114 in vbox


Ignore:
Timestamp:
Mar 15, 2017 3:41:58 PM (8 years ago)
Author:
vboxsync
Message:

bs3-cpu-generated-1,IEM: updates.

Location:
trunk/src/VBox
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsOneByte.cpp.h

    r66113 r66114  
    5252 * @opstats     add_Eb_Gb
    5353 * @opgroup     op_gen_arith_bin
    54  * @optest      op1=1 op2=1 -> op1=2 efl&|=nv,pl,nz,na,pe
     54 * @optest              op1=1   op2=1   -> op1=2   efl&|=nv,pl,nz,na,pe,nc
     55 * @optest      efl|=cf op1=1   op2=2   -> op1=3   efl&|=nv,pl,nz,na,po,nc
     56 * @optest              op1=254 op2=1   -> op1=255 efl&|=nv,ng,nz,na,po,nc
     57 * @optest              op1=128 op2=128 -> op1=0   efl&|=ov,pl,zf,na,po,cf
    5558 */
    5659FNIEMOP_DEF(iemOp_add_Eb_Gb)
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructionsPython.py

    r66113 r66114  
    579579            assert sHex[:2] == '0x';
    580580            sHex = ''.join([self.kdHexInv[sDigit] for sDigit in sHex[2:]]);
     581            if fSignExtend and sHex[0] not in [ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']:
     582                sHex = 'f' + sHex;
    581583
    582584        cDigits = len(sHex);
     
    644646        aoSet = TestType.get(self, '0x%x' % (fSet,));
    645647        if fClear != 0:
    646             aoClear = TestType.get(self, '%#x' % (~fClear))
     648            aoClear = TestType.get(self, '%#x' % (fClear,))
    647649            assert self.isAndOrPair(sValue) is True;
    648650            return (aoClear[0], aoSet[0]);
     
    667669    ## Assigned operators.
    668670    kasOperators = [
    669         '&|=',  # Special AND+OR operator for use with EFLAGS.
     671        '&|=',  # Special AND(INV)+OR operator for use with EFLAGS.
    670672        '&~=',
    671673        '&=',
     
    951953        self.sRawIemOpFlags = None;
    952954        self.sRawOldOpcodes = None;
     955        self.asCopyTests    = [];
    953956        ## @}
    954957
     
    10591062g_aoAllInstructions = []; # type: Instruction
    10601063
     1064## All the instructions indexed by statistics name (opstat).
     1065g_dAllInstructionsByStat = {}; # type: Instruction
     1066
    10611067## Instruction maps.
    10621068g_dInstructionMaps = {
     
    11881194            '@opinvlstyle': self.parseTagOpUnusedInvalid,
    11891195            '@optest':      self.parseTagOpTest,
     1196            '@opcopytests': self.parseTagOpCopyTests,
    11901197            '@opstats':     self.parseTagOpStats,
    11911198            '@opfunction':  self.parseTagOpFunction,
     
    13421349        for oMap in oInstr.aoMaps:
    13431350            oMap.aoInstructions.append(oInstr);
     1351
     1352        #
     1353        # Check the opstat value and add it to the opstat indexed dictionary.
     1354        #
     1355        if oInstr.sStats:
     1356            if oInstr.sStats not in g_dAllInstructionsByStat:
     1357                g_dAllInstructionsByStat[oInstr.sStats] = oInstr;
     1358            else:
     1359                self.error('Duplicate opstat value "%s"\nnew: %s\nold: %s'
     1360                           % (oInstr.sStats, oInstr, g_dAllInstructionsByStat[oInstr.sStats],));
    13441361
    13451362        #self.debug('%d..%d: %s; %d @op tags' % (oInstr.iLineCreated, oInstr.iLineCompleted, oInstr.sFunction, oInstr.cOpTags));
     
    20582075        return True;
    20592076
     2077    def parseTagOpCopyTests(self, sTag, aasSections, iTagLine, iEndLine):
     2078        """
     2079        Tag:        \@opcopytests
     2080        Value:      <opstat value> [..]
     2081        Example:    \@opcopytests add_Eb_Gb
     2082
     2083        Trick to avoid duplicating tests for different encodings of the same
     2084        operation.
     2085        """
     2086        oInstr = self.ensureInstructionForOpTag(iTagLine);
     2087
     2088        # Flatten, validate and append the copy job to the instruction.  We execute
     2089        # them after parsing all the input so we can handle forward references.
     2090        asToCopy = self.flattenAllSections(aasSections).split();
     2091        if not asToCopy:
     2092            return self.errorComment(iTagLine, '%s: requires at least on reference value' % (sTag,));
     2093        for sToCopy in asToCopy:
     2094            if sToCopy not in oInstr.asCopyTests:
     2095                if self.oReStatsName.match(sToCopy):
     2096                    oInstr.asCopyTests.append(sToCopy);
     2097                else:
     2098                    self.errorComment(iTagLine, '%s: invalid instruction reference (opstat) "%s" (valid: %s)'
     2099                                                % (sTag, sToCopy, self.oReStatsName.pattern));
     2100            else:
     2101                self.errorComment(iTagLine, '%s: ignoring duplicate "%s"' % (sTag, sToCopy,));
     2102
     2103        _ = iEndLine;
     2104        return True;
     2105
    20602106    def parseTagOpFunction(self, sTag, aasSections, iTagLine, iEndLine):
    20612107        """
     
    26112657
    26122658
     2659def __doTestCopying():
     2660    """
     2661    Executes the asCopyTests instructions.
     2662    """
     2663    asErrors = [];
     2664    for oDstInstr in g_aoAllInstructions:
     2665        if oDstInstr.asCopyTests:
     2666            for sSrcInstr in oDstInstr.asCopyTests:
     2667                oSrcInstr = g_dAllInstructionsByStat.get(sSrcInstr, None);
     2668                if oSrcInstr and oSrcInstr != oDstInstr:
     2669                    oDstInstr.aoTests.extend(oSrcInstr.aoTests);
     2670                elif oSrcInstr:
     2671                    asErrors.append('%s:%s: error: @opcopytests reference "%s" matches the destination\n'
     2672                                    % ( oDstInstr.sSrcFile, oDstInstr.iLineCreated, sSrcInstr));
     2673                else:
     2674                    asErrors.append('%s:%s: error: @opcopytests reference "%s" not found\n'
     2675                                    % ( oDstInstr.sSrcFile, oDstInstr.iLineCreated, sSrcInstr));
     2676
     2677    if asErrors:
     2678        sys.stderr.write(u''.join(asErrors));
     2679    return len(asErrors);
     2680
     2681
    26132682def __parseAll():
    26142683    """
     
    26242693    ]:
    26252694        cErrors += __parseFileByName(os.path.join(sSrcDir, sName), sDefaultMap);
     2695    cErrors += __doTestCopying();
     2696
    26262697
    26272698    if cErrors != 0:
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-data.py

    r66113 r66114  
    149149            sOp = oOperation.sOp;
    150150            if sOp == '&|=':
    151                 sOp = '|=' if len(aaoValues) == 1 else '&=';
     151                sOp = '|=' if len(aaoValues) == 1 else '&~=';
    152152
    153153            for fSignExtend, abValue in aaoValues:
     
    432432            '{',
    433433        ];
     434        fAdvanceMnemonic = True;
    434435        for oInstr in self.aoInstructions:
    435             asLines.append('    \"%s\"' % (oInstr.oInstr.sMnemonic,));
     436            if fAdvanceMnemonic:
     437                asLines.append('    \"%s\"' % (oInstr.oInstr.sMnemonic,));
     438            fAdvanceMnemonic = oInstr.fAdvanceMnemonic;
    436439        asLines += [
    437440            '};',
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66113 r66114  
    999999            switch (cbDst)
    10001000            {
    1001                 case 1:  BS3CG1_DPRINTF(("dbg:    --> %s: %#04RX32\n", g_aszBs3Cg1DstFields[idxField].sz, *PtrField.pu8));   break;
    1002                 case 2:  BS3CG1_DPRINTF(("dbg:    --> %s: %#06RX32\n", g_aszBs3Cg1DstFields[idxField].sz, *PtrField.pu16)); break;
     1001                case 1:  BS3CG1_DPRINTF(("dbg:    --> %s: %#04RX8\n",   g_aszBs3Cg1DstFields[idxField].sz, *PtrField.pu8));  break;
     1002                case 2:  BS3CG1_DPRINTF(("dbg:    --> %s: %#06RX16\n",  g_aszBs3Cg1DstFields[idxField].sz, *PtrField.pu16)); break;
    10031003                case 4:  BS3CG1_DPRINTF(("dbg:    --> %s: %#010RX32\n", g_aszBs3Cg1DstFields[idxField].sz, *PtrField.pu32)); break;
    10041004                default: BS3CG1_DPRINTF(("dbg:    --> %s: %#018RX64\n", g_aszBs3Cg1DstFields[idxField].sz, *PtrField.pu64)); break;
     
    12281228                                    This.Ctx.cr2.u = This.uCodePgFlat + X86_PAGE_SIZE;
    12291229                                This.Ctx.rflags.u32 &= ~X86_EFL_RF;
    1230                                 This.Ctx.rflags.u32 |= X86_EFL_RF & This.TrapFrame.Ctx.rflags.u32;
     1230                                This.Ctx.rflags.u32 |= This.TrapFrame.Ctx.rflags.u32 & X86_EFL_RF;
    12311231                                if (Bs3Cg1RunContextModifier(&This, &This.Ctx, pHdr,
    12321232                                                             pHdr->cbSelector + pHdr->cbInput, pHdr->cbOutput,
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