use vmi_arch_amd64::{Amd64, EventReason, GpRegisters};
use vmi_core::{Registers as _, VmiEvent};
use super::{super::BridgePacket, ArchAdapter, GpRegistersAdapter};
impl ArchAdapter for Amd64 {
fn read_packet(event: &VmiEvent<Amd64>) -> BridgePacket {
let registers = event.registers();
match registers.effective_address_width() {
4 => {
#[expect(clippy::wildcard_in_or_patterns)]
match event.reason() {
EventReason::CpuId(cpuid) => BridgePacket::new(
cpuid.leaf, (cpuid.subleaf & 0xFFFF) as u16, (cpuid.subleaf >> 16) as u16, )
.with_value1(registers.rbx & 0xFFFFFFFF)
.with_value2(registers.rdx & 0xFFFFFFFF)
.with_value3(registers.rsi & 0xFFFFFFFF)
.with_value4(registers.rdi & 0xFFFFFFFF),
EventReason::Hypercall(_) | _ => BridgePacket::new(
registers.rbp as u32,
(registers.rdx & 0xFFFF) as u16,
(registers.rdx >> 16) as u16,
)
.with_value1(registers.rsi & 0xFFFFFFFF)
.with_value2(registers.rdi & 0xFFFFFFFF),
}
}
8 => {
#[expect(clippy::wildcard_in_or_patterns)]
let packet = match event.reason() {
EventReason::CpuId(cpuid) => BridgePacket::new(
cpuid.leaf, (cpuid.subleaf & 0xFFFF) as u16, (cpuid.subleaf >> 16) as u16, ),
EventReason::Hypercall(_) | _ => BridgePacket::new(
registers.rcx as u32,
(registers.rdx & 0xFFFF) as u16,
(registers.rdx >> 16) as u16,
),
};
packet
.with_value1(registers.r8)
.with_value2(registers.r9)
.with_value3(registers.r10)
.with_value4(registers.r11)
}
_ => panic!("Unsupported address width"),
}
}
}
impl GpRegistersAdapter for GpRegisters {
fn write_response(
&mut self,
value1: Option<u64>,
value2: Option<u64>,
value3: Option<u64>,
value4: Option<u64>,
) {
if let Some(value) = value1 {
self.rax = value;
}
if let Some(value) = value2 {
self.rbx = value;
}
if let Some(value) = value3 {
self.rcx = value;
}
if let Some(value) = value4 {
self.rdx = value;
}
}
}