analysis.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. }
  15. pub struct Analysis {
  16. pub no_next_instruction: bool,
  17. pub ty: AnalysisType,
  18. }
  19. pub fn analyze_step(mut cpu: &mut CpuContext) -> Analysis {
  20. let mut analysis = Analysis {
  21. no_next_instruction: false,
  22. ty: AnalysisType::Normal,
  23. };
  24. cpu.prefixes = 0;
  25. let opcode = cpu.read_imm8() as u32 | (cpu.osize_32() as u32) << 8;
  26. ::gen::analyzer::analyzer(opcode, &mut cpu, &mut analysis);
  27. analysis
  28. }
  29. pub fn analyze_step_handle_prefix(cpu: &mut CpuContext, analysis: &mut Analysis) {
  30. ::gen::analyzer::analyzer(
  31. cpu.read_imm8() as u32 | (cpu.osize_32() as u32) << 8,
  32. cpu,
  33. analysis,
  34. )
  35. }
  36. pub fn analyze_step_handle_segment_prefix(
  37. segment: u32,
  38. cpu: &mut CpuContext,
  39. analysis: &mut Analysis,
  40. ) {
  41. assert!(segment <= 5);
  42. cpu.prefixes |= segment + 1;
  43. analyze_step_handle_prefix(cpu, analysis)
  44. }
  45. pub fn instr16_0F_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  46. ::gen::analyzer0f_16::analyzer(cpu.read_imm8(), cpu, analysis)
  47. }
  48. pub fn instr32_0F_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  49. ::gen::analyzer0f_32::analyzer(cpu.read_imm8(), cpu, analysis)
  50. }
  51. pub fn instr_26_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  52. analyze_step_handle_segment_prefix(ES, cpu, analysis)
  53. }
  54. pub fn instr_2E_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  55. analyze_step_handle_segment_prefix(CS, cpu, analysis)
  56. }
  57. pub fn instr_36_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  58. analyze_step_handle_segment_prefix(SS, cpu, analysis)
  59. }
  60. pub fn instr_3E_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  61. analyze_step_handle_segment_prefix(DS, cpu, analysis)
  62. }
  63. pub fn instr_64_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  64. analyze_step_handle_segment_prefix(FS, cpu, analysis)
  65. }
  66. pub fn instr_65_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  67. analyze_step_handle_segment_prefix(GS, cpu, analysis)
  68. }
  69. pub fn instr_66_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  70. cpu.prefixes |= PREFIX_66;
  71. analyze_step_handle_prefix(cpu, analysis)
  72. }
  73. pub fn instr_67_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  74. cpu.prefixes |= PREFIX_67;
  75. analyze_step_handle_prefix(cpu, analysis)
  76. }
  77. pub fn instr_F0_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  78. // lock: Ignored
  79. analyze_step_handle_prefix(cpu, analysis)
  80. }
  81. pub fn instr_F2_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  82. cpu.prefixes |= PREFIX_F2;
  83. analyze_step_handle_prefix(cpu, analysis)
  84. }
  85. pub fn instr_F3_analyze(cpu: &mut CpuContext, analysis: &mut Analysis) {
  86. cpu.prefixes |= PREFIX_F3;
  87. analyze_step_handle_prefix(cpu, analysis)
  88. }
  89. pub fn modrm_analyze(ctx: &mut CpuContext, modrm_byte: u8) { ::modrm::skip(ctx, modrm_byte); }