analysis.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #![allow(non_snake_case)]
  2. use cpu_context::CpuContext;
  3. use prefix::{PREFIX_66, PREFIX_67, PREFIX_F2, PREFIX_F3};
  4. use regs::{CS, DS, ES, FS, GS, SS};
  5. #[derive(PartialEq, Eq)]
  6. pub enum AnalysisType {
  7. Normal,
  8. BlockBoundary,
  9. Jump {
  10. offset: i32,
  11. is_32: bool,
  12. condition: Option<u8>,
  13. },
  14. STI,
  15. }
  16. pub struct Analysis {
  17. pub no_next_instruction: bool,
  18. pub absolute_jump: bool,
  19. pub ty: AnalysisType,
  20. }
  21. pub fn analyze_step(mut cpu: &mut CpuContext) -> Analysis {
  22. let mut analysis = Analysis {
  23. no_next_instruction: false,
  24. absolute_jump: false,
  25. ty: AnalysisType::Normal,
  26. };
  27. cpu.prefixes = 0;
  28. let opcode = cpu.read_imm8() as u32 | (cpu.osize_32() as u32) << 8;
  29. ::gen::analyzer::analyzer(opcode, &mut cpu, &mut analysis);
  30. analysis
  31. }
  32. pub fn analyze_step_handle_prefix(cpu: &mut CpuContext, analysis: &mut Analysis) {
  33. ::gen::analyzer::analyzer(
  34. cpu.read_imm8() as u32 | (cpu.osize_32() as u32) << 8,
  35. cpu,
  36. analysis,
  37. )
  38. }
  39. pub fn analyze_step_handle_segment_prefix(
  40. segment: u32,
  41. cpu: &mut CpuContext,
  42. analysis: &mut Analysis,
  43. ) {
  44. dbg_assert!(segment <= 5);
  45. cpu.prefixes |= segment + 1;
  46. analyze_step_handle_prefix(cpu, analysis)
  47. }
  48. pub fn instr16_0F_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  49. ::gen::analyzer0f::analyzer(cpu.read_imm8() as u32, cpu, analysis)
  50. }
  51. pub fn instr32_0F_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  52. ::gen::analyzer0f::analyzer(cpu.read_imm8() as u32 | 0x100, cpu, analysis)
  53. }
  54. pub fn instr_26_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  55. analyze_step_handle_segment_prefix(ES, cpu, analysis)
  56. }
  57. pub fn instr_2E_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  58. analyze_step_handle_segment_prefix(CS, cpu, analysis)
  59. }
  60. pub fn instr_36_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  61. analyze_step_handle_segment_prefix(SS, cpu, analysis)
  62. }
  63. pub fn instr_3E_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  64. analyze_step_handle_segment_prefix(DS, cpu, analysis)
  65. }
  66. pub fn instr_64_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  67. analyze_step_handle_segment_prefix(FS, cpu, analysis)
  68. }
  69. pub fn instr_65_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  70. analyze_step_handle_segment_prefix(GS, cpu, analysis)
  71. }
  72. pub fn instr_66_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  73. cpu.prefixes |= PREFIX_66;
  74. analyze_step_handle_prefix(cpu, analysis)
  75. }
  76. pub fn instr_67_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  77. cpu.prefixes |= PREFIX_67;
  78. analyze_step_handle_prefix(cpu, analysis)
  79. }
  80. pub fn instr_F0_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  81. // lock: Ignored
  82. analyze_step_handle_prefix(cpu, analysis)
  83. }
  84. pub fn instr_F2_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  85. cpu.prefixes |= PREFIX_F2;
  86. analyze_step_handle_prefix(cpu, analysis)
  87. }
  88. pub fn instr_F3_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  89. cpu.prefixes |= PREFIX_F3;
  90. analyze_step_handle_prefix(cpu, analysis)
  91. }
  92. pub fn modrm_analyze(ctx: &mut CpuContext, modrm_byte: u8) { ::modrm::skip(ctx, modrm_byte); }