100 lines
3.1 KiB
Rust
100 lines
3.1 KiB
Rust
#![allow(non_snake_case)]
|
|
|
|
use cpu_context::CpuContext;
|
|
use prefix::{PREFIX_66, PREFIX_67, PREFIX_F2, PREFIX_F3};
|
|
use regs::{CS, DS, ES, FS, GS, SS};
|
|
|
|
#[derive(PartialEq, Eq)]
|
|
pub enum AnalysisType {
|
|
Normal,
|
|
BlockBoundary,
|
|
Jump {
|
|
offset: i32,
|
|
is_32: bool,
|
|
condition: Option<u8>,
|
|
},
|
|
STI,
|
|
}
|
|
|
|
pub struct Analysis {
|
|
pub no_next_instruction: bool,
|
|
pub absolute_jump: bool,
|
|
pub ty: AnalysisType,
|
|
}
|
|
|
|
pub fn analyze_step(mut cpu: &mut CpuContext) -> Analysis {
|
|
let mut analysis = Analysis {
|
|
no_next_instruction: false,
|
|
absolute_jump: false,
|
|
ty: AnalysisType::Normal,
|
|
};
|
|
cpu.prefixes = 0;
|
|
let opcode = cpu.read_imm8() as u32 | (cpu.osize_32() as u32) << 8;
|
|
::gen::analyzer::analyzer(opcode, &mut cpu, &mut analysis);
|
|
analysis
|
|
}
|
|
|
|
pub fn analyze_step_handle_prefix(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
::gen::analyzer::analyzer(
|
|
cpu.read_imm8() as u32 | (cpu.osize_32() as u32) << 8,
|
|
cpu,
|
|
analysis,
|
|
)
|
|
}
|
|
pub fn analyze_step_handle_segment_prefix(
|
|
segment: u32,
|
|
cpu: &mut CpuContext,
|
|
analysis: &mut Analysis,
|
|
) {
|
|
dbg_assert!(segment <= 5);
|
|
cpu.prefixes |= segment + 1;
|
|
analyze_step_handle_prefix(cpu, analysis)
|
|
}
|
|
|
|
pub fn instr16_0F_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
::gen::analyzer0f::analyzer(cpu.read_imm8() as u32, cpu, analysis)
|
|
}
|
|
pub fn instr32_0F_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
::gen::analyzer0f::analyzer(cpu.read_imm8() as u32 | 0x100, cpu, analysis)
|
|
}
|
|
pub fn instr_26_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
analyze_step_handle_segment_prefix(ES, cpu, analysis)
|
|
}
|
|
pub fn instr_2E_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
analyze_step_handle_segment_prefix(CS, cpu, analysis)
|
|
}
|
|
pub fn instr_36_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
analyze_step_handle_segment_prefix(SS, cpu, analysis)
|
|
}
|
|
pub fn instr_3E_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
analyze_step_handle_segment_prefix(DS, cpu, analysis)
|
|
}
|
|
pub fn instr_64_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
analyze_step_handle_segment_prefix(FS, cpu, analysis)
|
|
}
|
|
pub fn instr_65_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
analyze_step_handle_segment_prefix(GS, cpu, analysis)
|
|
}
|
|
pub fn instr_66_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
cpu.prefixes |= PREFIX_66;
|
|
analyze_step_handle_prefix(cpu, analysis)
|
|
}
|
|
pub fn instr_67_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
cpu.prefixes |= PREFIX_67;
|
|
analyze_step_handle_prefix(cpu, analysis)
|
|
}
|
|
pub fn instr_F0_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
// lock: Ignored
|
|
analyze_step_handle_prefix(cpu, analysis)
|
|
}
|
|
pub fn instr_F2_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
cpu.prefixes |= PREFIX_F2;
|
|
analyze_step_handle_prefix(cpu, analysis)
|
|
}
|
|
pub fn instr_F3_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
|
|
cpu.prefixes |= PREFIX_F3;
|
|
analyze_step_handle_prefix(cpu, analysis)
|
|
}
|
|
|
|
pub fn modrm_analyze(ctx: &mut CpuContext, modrm_byte: u8) { ::modrm::skip(ctx, modrm_byte); }
|