Skip to content

Commit bc5643d

Browse files
committed
Arm64 emulation OK
1 parent 6c11a6b commit bc5643d

File tree

4 files changed

+121
-0
lines changed

4 files changed

+121
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/target

Cargo.lock

Lines changed: 56 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "pinephone-emulator"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]
9+
unicorn-engine = "2.0.0"

src/main.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use unicorn_engine::{Unicorn, RegisterARM64};
2+
use unicorn_engine::unicorn_const::{Arch, Mode, Permission};
3+
4+
fn main() {
5+
// Arm64 Code
6+
let arm64_code: Vec<u8> = vec![
7+
0xab, 0x05, 0x00, 0xb8, // str w11, [x13], #0
8+
0xaf, 0x05, 0x40, 0x38, // ldrb w15, [x13], #0
9+
];
10+
11+
// Initialize emulator in ARM64 mode
12+
let mut unicorn = Unicorn::new(
13+
Arch::ARM64,
14+
Mode::LITTLE_ENDIAN
15+
).expect("failed to initialize Unicorn instance");
16+
let emu = &mut unicorn;
17+
18+
// memory address where emulation starts
19+
const ADDRESS: u64 = 0x10000;
20+
21+
// map 2MB memory for this emulation
22+
emu.mem_map(
23+
ADDRESS,
24+
2 * 1024 * 1024,
25+
Permission::ALL
26+
).expect("failed to map code page");
27+
28+
// write machine code to be emulated to memory
29+
emu.mem_write(
30+
ADDRESS,
31+
&arm64_code
32+
).expect("failed to write instructions");
33+
34+
// Register Values
35+
const X11: u64 = 0x12345678; // X11 register
36+
const X13: u64 = 0x10000 + 0x8; // X13 register
37+
const X15: u64 = 0x33; // X15 register
38+
39+
// initialize machine registers
40+
emu.reg_write(RegisterARM64::X11, X11)
41+
.expect("failed to set X11");
42+
emu.reg_write(RegisterARM64::X13, X13)
43+
.expect("failed to set X13");
44+
emu.reg_write(RegisterARM64::X15, X15)
45+
.expect("failed to set X15");
46+
47+
let _ = emu.emu_start(
48+
ADDRESS,
49+
ADDRESS + arm64_code.len() as u64,
50+
0, // Previously: 10 * SECOND_SCALE,
51+
0 // Previously: 1000
52+
);
53+
54+
assert_eq!(emu.reg_read(RegisterARM64::X15), Ok(0x78));
55+
}

0 commit comments

Comments
 (0)