mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2024-10-05 21:15:45 +00:00
hypervisor: x86: emulate MOVSW
Signed-off-by: Wei Liu <liuwe@microsoft.com>
This commit is contained in:
parent
1bfa07f48e
commit
3a225aaa23
@ -90,6 +90,11 @@ impl<T: CpuStateManager> InstructionHandler<T> for Movsd_m32_m32 {
|
|||||||
movs!(u32);
|
movs!(u32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct Movsw_m16_m16;
|
||||||
|
impl<T: CpuStateManager> InstructionHandler<T> for Movsw_m16_m16 {
|
||||||
|
movs!(u16);
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
#![allow(unused_mut)]
|
#![allow(unused_mut)]
|
||||||
@ -148,4 +153,66 @@ mod tests {
|
|||||||
vmm.read_memory(0x8 + 8, &mut data).unwrap();
|
vmm.read_memory(0x8 + 8, &mut data).unwrap();
|
||||||
assert_eq!(0x0, <u32>::from_le_bytes(data));
|
assert_eq!(0x0, <u32>::from_le_bytes(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_rep_movsw_m16_m16() {
|
||||||
|
let ip: u64 = 0x1000;
|
||||||
|
let memory: [u8; 24] = [
|
||||||
|
0x78, 0x56, 0x34, 0x12, // 0x12345678
|
||||||
|
0xdd, 0xcc, 0xbb, 0xaa, // 0xaabbccdd
|
||||||
|
0xa5, 0x5a, 0xa5, 0x5a, // 0x5aa55aa5
|
||||||
|
0x00, 0x00, 0x00, 0x00, // 0x00000000
|
||||||
|
0x00, 0x00, 0x00, 0x00, // 0x00000000
|
||||||
|
0x00, 0x00, 0x00, 0x00, // 0x00000000
|
||||||
|
];
|
||||||
|
let insn = [0x66, 0xf3, 0xa5]; // rep movsw
|
||||||
|
let regs = vec![(Register::ECX, 6), (Register::ESI, 0), (Register::EDI, 0xc)];
|
||||||
|
let mut data = [0u8; 2];
|
||||||
|
|
||||||
|
let mut vmm = MockVmm::new(ip, regs, Some((0, &memory)));
|
||||||
|
|
||||||
|
assert!(vmm.emulate_first_insn(0, &insn).is_ok());
|
||||||
|
|
||||||
|
vmm.read_memory(0xc, &mut data).unwrap();
|
||||||
|
assert_eq!(0x5678, <u16>::from_le_bytes(data));
|
||||||
|
vmm.read_memory(0xc + 2, &mut data).unwrap();
|
||||||
|
assert_eq!(0x1234, <u16>::from_le_bytes(data));
|
||||||
|
vmm.read_memory(0xc + 4, &mut data).unwrap();
|
||||||
|
assert_eq!(0xccdd, <u16>::from_le_bytes(data));
|
||||||
|
vmm.read_memory(0xc + 6, &mut data).unwrap();
|
||||||
|
assert_eq!(0xaabb, <u16>::from_le_bytes(data));
|
||||||
|
vmm.read_memory(0xc + 8, &mut data).unwrap();
|
||||||
|
assert_eq!(0x5aa5, <u16>::from_le_bytes(data));
|
||||||
|
vmm.read_memory(0xc + 10, &mut data).unwrap();
|
||||||
|
assert_eq!(0x5aa5, <u16>::from_le_bytes(data));
|
||||||
|
// The rest should be default value 0 from MockVmm
|
||||||
|
vmm.read_memory(0xc + 12, &mut data).unwrap();
|
||||||
|
assert_eq!(0x0, <u16>::from_le_bytes(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_movsw_m16_m16() {
|
||||||
|
let ip: u64 = 0x1000;
|
||||||
|
let memory: [u8; 4] = [
|
||||||
|
0x78, 0x56, 0x34, 0x12, // 0x12345678
|
||||||
|
];
|
||||||
|
let insn = [0x66, 0xa5]; // movsw
|
||||||
|
let regs = vec![(Register::ESI, 0), (Register::EDI, 0x8)];
|
||||||
|
let mut data = [0u8; 2];
|
||||||
|
|
||||||
|
let mut vmm = MockVmm::new(ip, regs, Some((0, &memory)));
|
||||||
|
|
||||||
|
assert!(vmm.emulate_first_insn(0, &insn).is_ok());
|
||||||
|
|
||||||
|
vmm.read_memory(0x8, &mut data).unwrap();
|
||||||
|
assert_eq!(0x5678, <u16>::from_le_bytes(data));
|
||||||
|
// Only two bytes were copied, so the value at 0xa should be zero
|
||||||
|
vmm.read_memory(0xa, &mut data).unwrap();
|
||||||
|
assert_eq!(0x0, <u16>::from_le_bytes(data));
|
||||||
|
// The rest should be default value 0 from MockVmm
|
||||||
|
vmm.read_memory(0x4, &mut data).unwrap();
|
||||||
|
assert_eq!(0x0, <u16>::from_le_bytes(data));
|
||||||
|
vmm.read_memory(0x8 + 8, &mut data).unwrap();
|
||||||
|
assert_eq!(0x0, <u16>::from_le_bytes(data));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -526,6 +526,7 @@ impl<'a, T: CpuStateManager> Emulator<'a, T> {
|
|||||||
(mov, Movzx_r64_rm16),
|
(mov, Movzx_r64_rm16),
|
||||||
// MOVS
|
// MOVS
|
||||||
(movs, Movsd_m32_m32),
|
(movs, Movsd_m32_m32),
|
||||||
|
(movs, Movsw_m16_m16),
|
||||||
// OR
|
// OR
|
||||||
(or, Or_rm8_r8)
|
(or, Or_rm8_r8)
|
||||||
);
|
);
|
||||||
|
Loading…
Reference in New Issue
Block a user