VirtualBox

Changeset 66123 in vbox


Ignore:
Timestamp:
Mar 16, 2017 11:06:52 AM (8 years ago)
Author:
vboxsync
Message:

bs3-cpu-generated-1: Implemented testing instructions taking GV,Ev or Ev,Gv as operands.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-generated-1-template.c

    r66119 r66123  
    137137    /** @} */
    138138
    139     /** Operand size (16, 32, 64, or 0). */
    140     uint8_t                 cBitsOp;
     139    /** Operand size in bytes (0 if not applicable). */
     140    uint8_t                 cbOperand;
    141141    /** Target ring (0..3). */
    142142    uint8_t                 uCpl;
     
    668668                    pThis->aOperands[0].cbOp = 2;
    669669                    pThis->aOperands[1].cbOp = 2;
    670                     pThis->cBitsOp = 16;
     670                    pThis->cbOperand         = 2;
    671671                }
    672672                else
     
    676676                    pThis->aOperands[0].cbOp = 4;
    677677                    pThis->aOperands[1].cbOp = 4;
    678                     pThis->cBitsOp = 32;
     678                    pThis->cbOperand         = 4;
    679679                }
    680680            }
     
    690690                    pThis->aOperands[0].cbOp = 2;
    691691                    pThis->aOperands[1].cbOp = 2;
    692                     pThis->cBitsOp = 16;
     692                    pThis->cbOperand         = 2;
    693693                }
    694694                else
     
    698698                    pThis->aOperands[0].cbOp = 4;
    699699                    pThis->aOperands[1].cbOp = 4;
    700                     pThis->cBitsOp = 32;
     700                    pThis->cbOperand         = 2;
    701701                }
    702702            }
     
    710710                pThis->aOperands[0].cbOp = 8;
    711711                pThis->aOperands[1].cbOp = 4;
    712                 pThis->cBitsOp = 64;
     712                pThis->cbOperand         = 8;
    713713            }
    714714            else
     
    718718            break;
    719719
     720        case BS3CG1ENC_MODRM_Gv_Ev:
    720721        case BS3CG1ENC_MODRM_Ev_Gv:
    721         case BS3CG1ENC_MODRM_Gv_Ev:
     722            if (iEncoding == 0)
     723            {
     724                off = Bs3Cg1InsertOpcodes(pThis, 0);
     725                pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, X86_GREG_xBX, X86_GREG_xDX);
     726                pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_OZ_RBX;
     727                pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_OZ_RDX;
     728                if (BS3_MODE_IS_16BIT_CODE(pThis->bMode))
     729                    pThis->aOperands[0].cbOp = pThis->aOperands[1].cbOp = pThis->cbOperand = 2;
     730                else
     731                    pThis->aOperands[0].cbOp = pThis->aOperands[1].cbOp = pThis->cbOperand = 4;
     732            }
     733            else if (iEncoding == 1 && (g_uBs3CpuDetected & BS3CPU_TYPE_MASK) >= BS3CPU_80386)
     734            {
     735                pThis->abCurInstr[0] = P_OZ;
     736                off = Bs3Cg1InsertOpcodes(pThis, 1);
     737
     738                pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, X86_GREG_xBX, X86_GREG_xDX);
     739                pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_OZ_RBX;
     740                pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_OZ_RDX;
     741                if (!BS3_MODE_IS_16BIT_CODE(pThis->bMode))
     742                    pThis->aOperands[0].cbOp = pThis->aOperands[1].cbOp = pThis->cbOperand = 2;
     743                else
     744                    pThis->aOperands[0].cbOp = pThis->aOperands[1].cbOp = pThis->cbOperand = 4;
     745            }
     746            else if (iEncoding == 2 && BS3_MODE_IS_64BIT_CODE(pThis->bMode))
     747            {
     748                pThis->abCurInstr[0] = REX_W___;
     749                off = Bs3Cg1InsertOpcodes(pThis, 1);
     750
     751                pThis->abCurInstr[off++] = X86_MODRM_MAKE(3, X86_GREG_xBX, X86_GREG_xDX);
     752                pThis->aOperands[pThis->iRegOp].idxField = BS3CG1DST_RBX;
     753                pThis->aOperands[pThis->iRmOp ].idxField = BS3CG1DST_RDX;
     754                pThis->aOperands[0].cbOp = pThis->aOperands[1].cbOp = pThis->cbOperand = 8;
     755            }
     756            else
     757                break;
     758            pThis->cbCurInstr = off;
     759            iEncoding++;
    722760            break;
    723761
    724         case BS3CG1ENC_END:
    725         case BS3CG1ENC_INVALID:
    726             /* Impossible; to shut up gcc. */
     762        default:
     763            Bs3TestFailedF("Internal error! BS3CG1ENC_XXX = %u not implemented", pThis->enmEncoding);
    727764            break;
    728765    }
     
    836873                if (a_Expr) return false; \
    837874                break
    838             CASE_PRED(BS3CG1PRED_SIZE_O16, pThis->cBitsOp == 16);
    839             CASE_PRED(BS3CG1PRED_SIZE_O32, pThis->cBitsOp == 32);
    840             CASE_PRED(BS3CG1PRED_SIZE_O64, pThis->cBitsOp == 64);
     875            CASE_PRED(BS3CG1PRED_SIZE_O16, pThis->cbOperand == 2);
     876            CASE_PRED(BS3CG1PRED_SIZE_O32, pThis->cbOperand == 4);
     877            CASE_PRED(BS3CG1PRED_SIZE_O64, pThis->cbOperand == 8);
    841878            CASE_PRED(BS3CG1PRED_RING_0, pThis->uCpl == 0);
    842879            CASE_PRED(BS3CG1PRED_RING_1, pThis->uCpl == 1);
     
    9751012            cbDst = pThis->aOperands[idxField - BS3CG1DST_OP1].cbOp;
    9761013        else if (cbDst == BS3CG1DSTSIZE_OPERAND_SIZE_GRP)
    977             cbDst = pThis->cBitsOp / 8;
     1014            cbDst = pThis->cbOperand;
    9781015        if (cbDst <= 8)
    9791016        {
Note: See TracChangeset for help on using the changeset viewer.

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