Skip to content

Commit 27c5041

Browse files
committed
add aarch64 support to unicorn emulation
1 parent 1b8dc35 commit 27c5041

File tree

5 files changed

+111
-2
lines changed

5 files changed

+111
-2
lines changed

emulation_worker/src/architecture.rs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::collections::HashMap;
44
use std::sync::RwLockWriteGuard;
55
use unicorn_engine::{
66
unicorn_const::{Arch, Mode},
7-
RegisterARM, RegisterRISCV, Unicorn,
7+
RegisterARM, RegisterRISCV, RegisterARM64, Unicorn,
88
};
99

1010
static RISCV_REGISTERS: &[(&str, u8)] = &[
@@ -64,10 +64,49 @@ static ARM_REGISTERS: &[(&str, u8)] = &[
6464
("xpsr", RegisterARM::XPSR as u8),
6565
];
6666

67+
68+
static AARCH64_REGISTERS: &[(&str, u8)] = &[
69+
("pc", RegisterARM64::PC as u8),
70+
("x0", RegisterARM64::X0 as u8),
71+
("x1", RegisterARM64::X1 as u8),
72+
("x2", RegisterARM64::X2 as u8),
73+
("x3", RegisterARM64::X3 as u8),
74+
("x4", RegisterARM64::X4 as u8),
75+
("x5", RegisterARM64::X5 as u8),
76+
("x6", RegisterARM64::X6 as u8),
77+
("x7", RegisterARM64::X7 as u8),
78+
("x8", RegisterARM64::X8 as u8),
79+
("x9", RegisterARM64::X9 as u8),
80+
("x10", RegisterARM64::X10 as u8),
81+
("x11", RegisterARM64::X11 as u8),
82+
("x12", RegisterARM64::X12 as u8),
83+
("x13", RegisterARM64::X13 as u8),
84+
("x14", RegisterARM64::X14 as u8),
85+
("x15", RegisterARM64::X15 as u8),
86+
("x16", RegisterARM64::X16 as u8),
87+
("x17", RegisterARM64::X17 as u8),
88+
("x18", RegisterARM64::X18 as u8),
89+
("x19", RegisterARM64::X19 as u8),
90+
("x20", RegisterARM64::X20 as u8),
91+
("x21", RegisterARM64::X21 as u8),
92+
("x22", RegisterARM64::X22 as u8),
93+
("x23", RegisterARM64::X23 as u8),
94+
("x24", RegisterARM64::X24 as u8),
95+
("x25", RegisterARM64::X25 as u8),
96+
("x26", RegisterARM64::X26 as u8),
97+
("x27", RegisterARM64::X27 as u8),
98+
("x28", RegisterARM64::X28 as u8),
99+
("x29", RegisterARM64::X29 as u8),
100+
("x30", RegisterARM64::X30 as u8),
101+
("sp", RegisterARM64::SP as u8),
102+
("cpsr", RegisterARM64::PSTATE as u8),
103+
];
104+
67105
#[derive(Clone, Copy)]
68106
pub enum Architecture {
69107
Arm,
70108
Riscv64,
109+
Aarch64,
71110
}
72111

73112
pub trait ArchitectureDependentOperations {
@@ -100,6 +139,8 @@ impl ArchitectureDependentOperations for ArchitectureDependentOperator {
100139
}
101140
Architecture::Riscv64 => Unicorn::new(Arch::RISCV, Mode::RISCV64)
102141
.expect("failed to initialize Unicorn instance"),
142+
Architecture::Aarch64 => Unicorn::new(Arch::ARM64, Mode::ARM)
143+
.expect("failed to initialize Unicorn instance"),
103144
}
104145
}
105146

@@ -119,6 +160,7 @@ impl ArchitectureDependentOperations for ArchitectureDependentOperator {
119160
// in xpsr register
120161
}
121162
Architecture::Riscv64 => registers = RISCV_REGISTERS,
163+
Architecture::Aarch64 => registers = AARCH64_REGISTERS,
122164
}
123165
for (name, reg) in registers {
124166
uc.reg_write(
@@ -144,6 +186,11 @@ impl ArchitectureDependentOperations for ArchitectureDependentOperator {
144186
))
145187
.build()
146188
.unwrap(),
189+
Architecture::Aarch64 => Capstone::new()
190+
.arm64()
191+
.mode(capstone::arch::arm64::ArchMode::Arm)
192+
.build()
193+
.unwrap(),
147194
}
148195
}
149196

@@ -157,6 +204,7 @@ impl ArchitectureDependentOperations for ArchitectureDependentOperator {
157204
let registers = match self.architecture {
158205
Architecture::Arm => ARM_REGISTERS,
159206
Architecture::Riscv64 => RISCV_REGISTERS,
207+
Architecture::Aarch64 => AARCH64_REGISTERS,
160208
};
161209
for (name, reg) in registers {
162210
dump.insert(name.to_string(), uc.reg_read(*reg).unwrap());

emulation_worker/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ fn run_unicorn(
6363
let arch: Architecture = match arch_str {
6464
"arm" => Architecture::Arm,
6565
"riscv64" => Architecture::Riscv64,
66+
"aarch64" => Architecture::Aarch64,
6667
_ => panic!("Unsupported architecture!"),
6768
};
6869

@@ -76,6 +77,7 @@ fn run_unicorn(
7677
let register_table_name = match arch_str {
7778
arch_str if arch_str.starts_with("arm") => "armregisters",
7879
arch_str if arch_str.starts_with("riscv") => "riscvregisters",
80+
arch_str if arch_str.starts_with("aarch64") => "aarch64registers",
7981
_ => panic!("Unsupported architecture!"),
8082
};
8183

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
{
2+
"max_instruction_count": 100,
3+
"start" : {
4+
"address" : 0x40000044,
5+
"counter" : 1
6+
},
7+
"end" :[
8+
{
9+
"address" : 0x40000068,
10+
"counter" : 3
11+
},
12+
{
13+
"address" : 0x40000084,
14+
"counter" : 1
15+
}
16+
],
17+
"faults" :[
18+
[
19+
{
20+
"fault_address" : [0x47fffffc],
21+
"fault_type" : "data",
22+
"fault_model" : "set0",
23+
"fault_lifespan" : [100],
24+
"fault_mask" : [1],
25+
"trigger_address" : [0x40000060],
26+
"trigger_counter" : [1]
27+
}
28+
],
29+
[
30+
{
31+
"fault_address" : [0x40000068],
32+
"fault_type" : "instruction",
33+
"fault_model" : "overwrite",
34+
"num_bytes" : 4,
35+
"fault_lifespan" : [10],
36+
"fault_mask" : [0xd503201f],
37+
"trigger_address" : [0x40000060],
38+
"trigger_counter" : [1]
39+
}
40+
],
41+
[
42+
{
43+
"fault_address" : [199],
44+
"fault_type" : "register",
45+
"fault_model" : "set0",
46+
"fault_lifespan" : [0],
47+
"fault_mask" : [0xffffffff],
48+
"trigger_address" : [0x40000064],
49+
"trigger_counter" : [1]
50+
}
51+
]
52+
],
53+
"mem_info": true
54+
}

examples/aarch64-softmmu/run.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
11
#!/bin/sh
2-
python3 ../../controller.py --debug --fault fault.json --qemu qemuconf.json output.hdf5
2+
if [ "$1" = "--unicorn" ]; then
3+
python3 ../../controller.py --debug --fault fault_unicorn.json --qemu qemuconf.json output.hdf5 --unicorn
4+
else
5+
python3 ../../controller.py --debug --fault fault.json --qemu qemuconf.json output.hdf5
6+
fi

faultclass.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,7 @@ def readout_data(
639639
index,
640640
)
641641

642+
output["memdumplist"] = []
642643
if len(data_protobuf.mem_dump_infos) != 0:
643644
memdumplist = readout_memdump(data_protobuf)
644645
output["memdumplist"] = memdumplist

0 commit comments

Comments
 (0)