cpu_context.rs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. use cpu;
  2. use prefix::{PREFIX_MASK_ADDRSIZE, PREFIX_MASK_OPSIZE};
  3. use state_flags::CachedStateFlags;
  4. #[derive(Clone)]
  5. pub struct CpuContext {
  6. pub eip: u32,
  7. pub prefixes: u32,
  8. pub cs_offset: u32,
  9. pub state_flags: CachedStateFlags,
  10. }
  11. impl CpuContext {
  12. pub fn advance8(&mut self) {
  13. assert!(self.eip & 0xFFF < 0xFFF);
  14. self.eip += 1;
  15. }
  16. pub fn advance16(&mut self) {
  17. assert!(self.eip & 0xFFF < 0xFFE);
  18. self.eip += 2;
  19. }
  20. pub fn advance32(&mut self) {
  21. assert!(self.eip & 0xFFF < 0xFFC);
  22. self.eip += 4;
  23. }
  24. #[allow(unused)]
  25. pub fn advance_moffs(&mut self) {
  26. if self.asize_32() {
  27. self.advance32()
  28. }
  29. else {
  30. self.advance16()
  31. }
  32. }
  33. pub fn read_imm8(&mut self) -> u8 {
  34. assert!(self.eip & 0xFFF < 0xFFF);
  35. let v = cpu::read8(self.eip);
  36. self.eip += 1;
  37. v
  38. }
  39. pub fn read_imm8s(&mut self) -> i8 { self.read_imm8() as i8 }
  40. pub fn read_imm16(&mut self) -> u16 {
  41. assert!(self.eip & 0xFFF < 0xFFE);
  42. let v = cpu::read16(self.eip);
  43. self.eip += 2;
  44. v
  45. }
  46. pub fn read_imm16s(&mut self) -> i16 { self.read_imm16() as i16 }
  47. pub fn read_imm32(&mut self) -> u32 {
  48. assert!(self.eip & 0xFFF < 0xFFC);
  49. let v = cpu::read32(self.eip);
  50. self.eip += 4;
  51. v
  52. }
  53. pub fn read_moffs(&mut self) -> u32 {
  54. if self.asize_32() {
  55. self.read_imm32()
  56. }
  57. else {
  58. self.read_imm16() as u32
  59. }
  60. }
  61. pub fn cpl3(&self) -> bool { self.state_flags.cpl3() }
  62. pub fn has_flat_segmentation(&self) -> bool { self.state_flags.has_flat_segmentation() }
  63. pub fn osize_32(&self) -> bool {
  64. self.state_flags.is_32() != (self.prefixes & PREFIX_MASK_OPSIZE != 0)
  65. }
  66. pub fn asize_32(&self) -> bool {
  67. self.state_flags.is_32() != (self.prefixes & PREFIX_MASK_ADDRSIZE != 0)
  68. }
  69. pub fn ssize_32(&self) -> bool { self.state_flags.ssize_32() }
  70. }