use gdbstub_arch::x86::reg::{X86CoreRegs, X86SegmentRegs, X87FpuInternalRegs};
use crate::emu::Emu;
pub fn read_regs_64(emu: &Emu) -> gdbstub_arch::x86::reg::X86_64CoreRegs {
let regs = emu.regs();
let flags = emu.flags();
let fpu = emu.fpu();
let mut gdb_regs = gdbstub_arch::x86::reg::X86_64CoreRegs::default();
gdb_regs.regs = [
regs.rax,
regs.rbx,
regs.rcx,
regs.rdx,
regs.rsi,
regs.rdi,
regs.rbp,
regs.rsp,
regs.r8,
regs.r9,
regs.r10,
regs.r11,
regs.r12,
regs.r13,
regs.r14,
regs.r15,
];
gdb_regs.rip = regs.rip;
gdb_regs.eflags = flags.dump();
gdb_regs.segments = gdbstub_arch::x86::reg::X86SegmentRegs {
cs: 0x33, ss: 0x2b, ds: 0x2b, es: 0x2b, fs: 0x53, gs: 0x2b, };
for i in 0..8 {
let st_val = fpu.st.peek(i).get();
let bytes = st_val.to_le_bytes();
gdb_regs.st[i] = [
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4],
bytes[5], bytes[6], bytes[7], bytes[8], bytes[9],
];
}
gdb_regs.fpu = X87FpuInternalRegs {
fctrl: fpu.ctrl as u32,
fstat: fpu.stat as u32,
ftag: fpu.tag as u32,
fiseg: 0,
fioff: fpu.ip as u32,
foseg: 0,
fooff: fpu.operand_ptr as u32,
fop: fpu.opcode as u32,
};
for i in 0..16 {
let xmm_val = match i {
0 => regs.xmm0,
1 => regs.xmm1,
2 => regs.xmm2,
3 => regs.xmm3,
4 => regs.xmm4,
5 => regs.xmm5,
6 => regs.xmm6,
7 => regs.xmm7,
8 => regs.xmm8,
9 => regs.xmm9,
10 => regs.xmm10,
11 => regs.xmm11,
12 => regs.xmm12,
13 => regs.xmm13,
14 => regs.xmm14,
15 => regs.xmm15,
_ => 0,
};
gdb_regs.xmm[i] = xmm_val;
}
gdb_regs.mxcsr = fpu.mxcsr;
gdb_regs
}
pub fn write_regs_64(emu: &mut Emu, gdb_regs: &gdbstub_arch::x86::reg::X86_64CoreRegs) {
let regs = emu.regs_mut();
regs.rax = gdb_regs.regs[0];
regs.rbx = gdb_regs.regs[1];
regs.rcx = gdb_regs.regs[2];
regs.rdx = gdb_regs.regs[3];
regs.rsi = gdb_regs.regs[4];
regs.rdi = gdb_regs.regs[5];
regs.rbp = gdb_regs.regs[6];
regs.rsp = gdb_regs.regs[7];
regs.r8 = gdb_regs.regs[8];
regs.r9 = gdb_regs.regs[9];
regs.r10 = gdb_regs.regs[10];
regs.r11 = gdb_regs.regs[11];
regs.r12 = gdb_regs.regs[12];
regs.r13 = gdb_regs.regs[13];
regs.r14 = gdb_regs.regs[14];
regs.r15 = gdb_regs.regs[15];
regs.rip = gdb_regs.rip;
regs.xmm0 = gdb_regs.xmm[0];
regs.xmm1 = gdb_regs.xmm[1];
regs.xmm2 = gdb_regs.xmm[2];
regs.xmm3 = gdb_regs.xmm[3];
regs.xmm4 = gdb_regs.xmm[4];
regs.xmm5 = gdb_regs.xmm[5];
regs.xmm6 = gdb_regs.xmm[6];
regs.xmm7 = gdb_regs.xmm[7];
regs.xmm8 = gdb_regs.xmm[8];
regs.xmm9 = gdb_regs.xmm[9];
regs.xmm10 = gdb_regs.xmm[10];
regs.xmm11 = gdb_regs.xmm[11];
regs.xmm12 = gdb_regs.xmm[12];
regs.xmm13 = gdb_regs.xmm[13];
regs.xmm14 = gdb_regs.xmm[14];
regs.xmm15 = gdb_regs.xmm[15];
emu.flags_mut().load(gdb_regs.eflags);
let fpu = emu.fpu_mut();
fpu.ctrl = gdb_regs.fpu.fctrl as u16;
fpu.stat = gdb_regs.fpu.fstat as u16;
fpu.tag = gdb_regs.fpu.ftag as u16;
fpu.ip = gdb_regs.fpu.fioff as u64;
fpu.operand_ptr = gdb_regs.fpu.fooff as u64;
fpu.opcode = gdb_regs.fpu.fop as u16;
fpu.mxcsr = gdb_regs.mxcsr;
for i in 0..8 {
let bytes = gdb_regs.st[i];
let mut val_bytes = [0u8; 16];
val_bytes[..10].copy_from_slice(&bytes);
let val = u128::from_le_bytes(val_bytes);
fpu.set_st_u80(i, val);
}
}
pub fn read_regs_32(emu: &Emu) -> X86CoreRegs {
let regs = emu.regs();
let flags = emu.flags();
let fpu = emu.fpu();
let mut gdb_regs = X86CoreRegs::default();
gdb_regs.eax = regs.rax as u32;
gdb_regs.ecx = regs.rcx as u32;
gdb_regs.edx = regs.rdx as u32;
gdb_regs.ebx = regs.rbx as u32;
gdb_regs.esp = regs.rsp as u32;
gdb_regs.ebp = regs.rbp as u32;
gdb_regs.esi = regs.rsi as u32;
gdb_regs.edi = regs.rdi as u32;
gdb_regs.eip = regs.rip as u32;
gdb_regs.eflags = flags.dump();
gdb_regs.segments = X86SegmentRegs {
cs: 0x1b, ss: 0x23, ds: 0x23, es: 0x23, fs: 0x3b, gs: 0x00, };
for i in 0..8 {
let st_val = fpu.st.peek(i).get();
let bytes = st_val.to_le_bytes();
gdb_regs.st[i] = [
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4],
bytes[5], bytes[6], bytes[7], bytes[8], bytes[9],
];
}
gdb_regs.fpu = X87FpuInternalRegs {
fctrl: fpu.ctrl as u32,
fstat: fpu.stat as u32,
ftag: fpu.tag as u32,
fiseg: 0,
fioff: fpu.ip as u32,
foseg: 0,
fooff: fpu.operand_ptr as u32,
fop: fpu.opcode as u32,
};
for i in 0..8 {
let xmm_val = match i {
0 => regs.xmm0,
1 => regs.xmm1,
2 => regs.xmm2,
3 => regs.xmm3,
4 => regs.xmm4,
5 => regs.xmm5,
6 => regs.xmm6,
7 => regs.xmm7,
_ => 0,
};
gdb_regs.xmm[i] = xmm_val;
}
gdb_regs.mxcsr = fpu.mxcsr;
gdb_regs
}
pub fn write_regs_32(emu: &mut Emu, gdb_regs: &X86CoreRegs) {
let regs = emu.regs_mut();
regs.rax = gdb_regs.eax as u64;
regs.rcx = gdb_regs.ecx as u64;
regs.rdx = gdb_regs.edx as u64;
regs.rbx = gdb_regs.ebx as u64;
regs.rsp = gdb_regs.esp as u64;
regs.rbp = gdb_regs.ebp as u64;
regs.rsi = gdb_regs.esi as u64;
regs.rdi = gdb_regs.edi as u64;
regs.rip = gdb_regs.eip as u64;
regs.xmm0 = gdb_regs.xmm[0];
regs.xmm1 = gdb_regs.xmm[1];
regs.xmm2 = gdb_regs.xmm[2];
regs.xmm3 = gdb_regs.xmm[3];
regs.xmm4 = gdb_regs.xmm[4];
regs.xmm5 = gdb_regs.xmm[5];
regs.xmm6 = gdb_regs.xmm[6];
regs.xmm7 = gdb_regs.xmm[7];
emu.flags_mut().load(gdb_regs.eflags);
let fpu = emu.fpu_mut();
fpu.ctrl = gdb_regs.fpu.fctrl as u16;
fpu.stat = gdb_regs.fpu.fstat as u16;
fpu.tag = gdb_regs.fpu.ftag as u16;
fpu.ip = gdb_regs.fpu.fioff as u64;
fpu.operand_ptr = gdb_regs.fpu.fooff as u64;
fpu.opcode = gdb_regs.fpu.fop as u16;
fpu.mxcsr = gdb_regs.mxcsr;
for i in 0..8 {
let bytes = gdb_regs.st[i];
let mut val_bytes = [0u8; 16];
val_bytes[..10].copy_from_slice(&bytes);
let val = u128::from_le_bytes(val_bytes);
fpu.set_st_u80(i, val);
}
}