Skip to content

Commit

Permalink
At lease CPUID instruction does not crash.
Browse files Browse the repository at this point in the history
  • Loading branch information
captainys committed Dec 19, 2024
1 parent fa45a29 commit a8bce69
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 0 deletions.
6 changes: 6 additions & 0 deletions src/cpu/i486inst.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,7 @@ void i486DXCommon::MakeOpCodeRenumberTable(void)
opCodeRenumberTable[I486_OPCODE_CMPXCHG_RM_R]=I486_RENUMBER_CMPXCHG_RM_R;
opCodeRenumberTable[I486_OPCODE_XADD_RM8_R8]=I486_RENUMBER_XADD_RM8_R8;
opCodeRenumberTable[I486_OPCODE_XADD_RM_R]=I486_RENUMBER_XADD_RM_R;
opCodeRenumberTable[I486_OPCODE_CPUID]=I486_RENUMBER_CPUID;



Expand Down Expand Up @@ -462,6 +463,7 @@ void i486DXCommon::MakeOpCodeRenumberTable(void)
opCodeNeedOperandTable[I486_OPCODE_XCHG_EAX_ESI]=I486_NEEDOPERAND_NONE;
opCodeNeedOperandTable[I486_OPCODE_XCHG_EAX_EDI]=I486_NEEDOPERAND_NONE;
opCodeNeedOperandTable[I486_OPCODE_XLAT]=I486_NEEDOPERAND_NONE;
opCodeNeedOperandTable[I486_OPCODE_CPUID]=I486_NEEDOPERAND_NONE;


// RM_IMM8
Expand Down Expand Up @@ -3378,6 +3380,10 @@ std::string i486DXCommon::Instruction::Disassemble(const Operand &op1In,const Op
op2.DecodeMODR_MForRegister(operandSize,operand[0]);
disasm=DisassembleTypicalTwoOperands("XADD",op1,op2,cs.value,eip,symTable);
break;

case I486_OPCODE_CPUID:
disasm="CPUID";
break;
}

if(INST_PREFIX_LOCK==instPrefix)
Expand Down
4 changes: 4 additions & 0 deletions src/cpu/i486inst.h
Original file line number Diff line number Diff line change
Expand Up @@ -557,6 +557,8 @@ enum

I486_OPCODE_XADD_RM8_R8= 0x0FC0,
I486_OPCODE_XADD_RM_R= 0x0FC1,

I486_OPCODE_CPUID= 0x0FA2,
};

enum
Expand Down Expand Up @@ -1212,6 +1214,8 @@ enum
I486_RENUMBER_XADD_RM8_R8,
I486_RENUMBER_XADD_RM_R,

I486_RENUMBER_CPUID,

I486_RENUMBER_REALLY_UNDEFINED,

I486_NUM_SUPPORTED_INSTRUCTIONS,
Expand Down
13 changes: 13 additions & 0 deletions src/cpu/i486runinstruction.h
Original file line number Diff line number Diff line change
Expand Up @@ -8581,6 +8581,19 @@ unsigned int i486DXFidelityLayer<FIDELITY>::RunOneInstruction(Memory &mem,InOut
}
break;

case I486_RENUMBER_CPUID:
switch(GetEAX())
{
case 0:
state.NULL_and_reg32[REG_EAX]=0;
state.NULL_and_reg32[REG_EBX]=0x4C465359; // 'YSFL'
state.NULL_and_reg32[REG_EDX]=0x54484749; // 'IGHT'
state.NULL_and_reg32[REG_ECX]=0x4D4F432E; // '.COM'
break;
}
clocksPassed=1;
break;

case I486_RENUMBER_REALLY_UNDEFINED:
clocksPassed=0;
break;
Expand Down

0 comments on commit a8bce69

Please sign in to comment.