Prepare register support

This commit is contained in:
Maurice Heumann
2025-03-28 08:57:02 +01:00
committed by momo5502
parent da6ba1a329
commit ab144de125
5 changed files with 1017 additions and 11 deletions

View File

@@ -11,6 +11,8 @@ extern "C"
int32_t icicle_unmap_memory(icicle_emulator*, uint64_t address, uint64_t length);
int32_t icicle_read_memory(icicle_emulator*, uint64_t address, void* data, size_t length);
int32_t icicle_write_memory(icicle_emulator*, uint64_t address, const void* data, size_t length);
size_t icicle_read_register(icicle_emulator*, int reg, void* data, size_t length);
size_t icicle_write_register(icicle_emulator*, int reg, const void* data, size_t length);
void icicle_destroy_emulator(icicle_emulator*);
}
@@ -63,12 +65,12 @@ namespace icicle
size_t write_raw_register(const int reg, const void* value, const size_t size) override
{
throw std::runtime_error("Not implemented");
return icicle_write_register(this->emu_, reg, value, size);
}
size_t read_raw_register(const int reg, void* value, const size_t size) override
{
throw std::runtime_error("Not implemented");
return icicle_read_register(this->emu_, reg, value, size);
}
void map_mmio(const uint64_t address, const size_t size, mmio_read_callback read_cb,

1
src/icicle/Cargo.lock generated
View File

@@ -362,6 +362,7 @@ dependencies = [
name = "icicle"
version = "0.1.0"
dependencies = [
"icicle-cpu",
"icicle-vm",
"pcode",
]

View File

@@ -8,4 +8,5 @@ crate-type = ["staticlib"]
[dependencies]
icicle-vm = { git = "https://github.com/icicle-emu/icicle-emu" }
icicle-cpu = { git = "https://github.com/icicle-emu/icicle-emu" }
pcode = { git = "https://github.com/icicle-emu/icicle-emu" }

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
mod icicle;
use icicle::IcicleEmulator;
use icicle::{IcicleEmulator, X64Register};
use std::os::raw::c_void;
fn to_cbool(value: bool) -> i32 {
@@ -48,8 +48,7 @@ pub fn icicle_protect_memory(ptr: *mut c_void, address: u64, length: u64, permis
pub fn icicle_write_memory(ptr: *mut c_void, address: u64, data: *const c_void, size: usize) -> i32 {
unsafe {
let emulator = &mut *(ptr as *mut IcicleEmulator);
let u8_ptr = data as *const u8;
let u8_slice = std::slice::from_raw_parts(u8_ptr, size);
let u8_slice = std::slice::from_raw_parts(data as *const u8, size);
let res = emulator.write_memory(address, u8_slice);
return to_cbool(res);
}
@@ -59,13 +58,30 @@ pub fn icicle_write_memory(ptr: *mut c_void, address: u64, data: *const c_void,
pub fn icicle_read_memory(ptr: *mut c_void, address: u64, data: *mut c_void, size: usize) -> i32 {
unsafe {
let emulator = &mut *(ptr as *mut IcicleEmulator);
let u8_ptr = data as *mut u8;
let u8_slice = std::slice::from_raw_parts_mut(u8_ptr, size);
let u8_slice = std::slice::from_raw_parts_mut(data as *mut u8, size);
let res = emulator.read_memory(address, u8_slice);
return to_cbool(res);
}
}
#[unsafe(no_mangle)]
pub fn icicle_read_register(ptr: *mut c_void, reg: X64Register, data: *mut c_void, size: usize) -> usize {
unsafe {
let emulator = &mut *(ptr as *mut IcicleEmulator);
let u8_slice = std::slice::from_raw_parts_mut(data as *mut u8, size);
return emulator.read_register(reg, u8_slice);
}
}
#[unsafe(no_mangle)]
pub fn icicle_write_register(ptr: *mut c_void, reg: X64Register, data: *const c_void, size: usize) -> usize {
unsafe {
let emulator = &mut *(ptr as *mut IcicleEmulator);
let u8_slice = std::slice::from_raw_parts(data as *const u8, size);
return emulator.write_register(reg, u8_slice);
}
}
#[unsafe(no_mangle)]
pub fn icicle_destroy_emulator(ptr: *mut c_void) {
if ptr.is_null() {