use crate::emulator::emulator::Cpu;
use crate::emulator::emulator::aarch64::Aarch64Cpu;
pub trait GuestCpu {
fn reg(&self, i: usize) -> u64;
fn set_reg(&mut self, i: usize, v: u64);
fn pc(&self) -> u64;
fn set_pc(&mut self, v: u64);
fn set_tls(&mut self, _base: u64) {}
}
impl GuestCpu for Cpu {
fn reg(&self, i: usize) -> u64 {
if self.is_long64() {
self.regs.gp64[i]
} else {
u64::from(self.regs.gp[i & 7])
}
}
fn set_reg(&mut self, i: usize, v: u64) {
if self.is_long64() {
self.regs.gp64[i] = v;
} else {
self.regs.gp[i & 7] = v as u32;
}
}
fn pc(&self) -> u64 {
if self.is_long64() {
self.regs.rip
} else {
u64::from(self.regs.eip)
}
}
fn set_pc(&mut self, v: u64) {
if self.is_long64() {
self.regs.rip = v;
} else {
self.regs.eip = v as u32;
}
}
fn set_tls(&mut self, base: u64) {
self.set_fs_base(base as u32);
}
}
impl GuestCpu for Aarch64Cpu {
fn reg(&self, i: usize) -> u64 {
if i >= 31 { self.sp } else { self.x[i] }
}
fn set_reg(&mut self, i: usize, v: u64) {
if i >= 31 {
self.sp = v;
} else {
self.x[i] = v;
}
}
fn pc(&self) -> u64 {
self.pc
}
fn set_pc(&mut self, v: u64) {
self.pc = v;
}
}