Skip to content

Commit 5da3606

Browse files
authored
Add arm architecture (#76)
1 parent 50f06dd commit 5da3606

File tree

7 files changed

+2672
-0
lines changed

7 files changed

+2672
-0
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ num-traits = "0.2.18"
7575
num-derive = "0.4.2"
7676
tracing-subscriber = "0.3.18"
7777
tracing = { version = "0.1.40", features = ["log"] }
78+
yaxpeax-arm = "0.2.5"
7879

7980
[dev-dependencies]
8081
simics-test = { path = "simics-rs/simics-test" }

src/arch/aarch64.rs

Lines changed: 1275 additions & 0 deletions
Large diffs are not rendered by default.

src/arch/arm.rs

Lines changed: 1321 additions & 0 deletions
Large diffs are not rendered by default.

src/arch/mod.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
//! Architecture specific data and definitions
55
66
use self::{
7+
aarch64::AArch64ArchitectureOperations, arm::ARMArchitectureOperations,
78
risc_v::RISCVArchitectureOperations, x86::X86ArchitectureOperations,
89
x86_64::X86_64ArchitectureOperations,
910
};
@@ -24,6 +25,8 @@ use simics::{
2425
};
2526
use std::{fmt::Debug, str::FromStr};
2627

28+
pub mod aarch64;
29+
pub mod arm;
2730
pub mod risc_v;
2831
pub mod x86;
2932
pub mod x86_64;
@@ -37,6 +40,10 @@ pub(crate) enum ArchitectureHint {
3740
I386,
3841
/// The architecture is RISCV
3942
Riscv,
43+
/// The architecture is arm
44+
Arm,
45+
/// The architecture is aarch64
46+
Aarch64,
4047
}
4148

4249
impl FromStr for ArchitectureHint {
@@ -47,6 +54,8 @@ impl FromStr for ArchitectureHint {
4754
"x86-64" => Self::X86_64,
4855
"i386" | "i486" | "i586" | "i686" | "ia-32" | "x86" => Self::I386,
4956
"riscv" | "risc-v" | "riscv32" | "riscv64" => Self::Riscv,
57+
"armv4" | "armv5" | "armv6" | "armv7" | "arm" | "arm32" => Self::Arm,
58+
"aarch64" | "armv8" | "arm64" => Self::Aarch64,
5059
_ => bail!("Unknown hint: {}", s),
5160
})
5261
}
@@ -58,6 +67,8 @@ impl From<ArchitectureHint> for AttrValueType {
5867
ArchitectureHint::X86_64 => "x86-64",
5968
ArchitectureHint::I386 => "i386",
6069
ArchitectureHint::Riscv => "risc-v",
70+
ArchitectureHint::Arm => "arm",
71+
ArchitectureHint::Aarch64 => "aarch64",
6172
}
6273
.into()
6374
}
@@ -76,6 +87,12 @@ impl ArchitectureHint {
7687
ArchitectureHint::Riscv => {
7788
Architecture::Riscv(RISCVArchitectureOperations::new_unchecked(cpu)?)
7889
}
90+
ArchitectureHint::Arm => {
91+
Architecture::Arm(ARMArchitectureOperations::new_unchecked(cpu)?)
92+
}
93+
ArchitectureHint::Aarch64 => {
94+
Architecture::Aarch64(AArch64ArchitectureOperations::new_unchecked(cpu)?)
95+
}
7996
})
8097
}
8198
}
@@ -87,6 +104,10 @@ pub(crate) enum Architecture {
87104
I386(X86ArchitectureOperations),
88105
/// The RISC-V architecture
89106
Riscv(RISCVArchitectureOperations),
107+
/// The ARM architecture (v7 and below)
108+
Arm(ARMArchitectureOperations),
109+
/// The AARCH64 architecture (v8 and above)
110+
Aarch64(AArch64ArchitectureOperations),
90111
}
91112

92113
impl Debug for Architecture {
@@ -98,6 +119,8 @@ impl Debug for Architecture {
98119
Architecture::X86_64(_) => "x86-64",
99120
Architecture::I386(_) => "i386",
100121
Architecture::Riscv(_) => "risc-v",
122+
Architecture::Arm(_) => "arm",
123+
Architecture::Aarch64(_) => "aarch64",
101124
}
102125
)
103126
}
@@ -513,6 +536,10 @@ impl ArchitectureOperations for Architecture {
513536
Ok(Self::I386(x86))
514537
} else if let Ok(riscv) = RISCVArchitectureOperations::new(cpu) {
515538
Ok(Self::Riscv(riscv))
539+
} else if let Ok(arm) = ARMArchitectureOperations::new(cpu) {
540+
Ok(Self::Arm(arm))
541+
} else if let Ok(aarch64) = AArch64ArchitectureOperations::new(cpu) {
542+
Ok(Self::Aarch64(aarch64))
516543
} else {
517544
bail!("Unsupported architecture");
518545
}
@@ -523,6 +550,8 @@ impl ArchitectureOperations for Architecture {
523550
Architecture::X86_64(x86_64) => x86_64.cpu(),
524551
Architecture::I386(i386) => i386.cpu(),
525552
Architecture::Riscv(riscv) => riscv.cpu(),
553+
Architecture::Arm(arm) => arm.cpu(),
554+
Architecture::Aarch64(aarch64) => aarch64.cpu(),
526555
}
527556
}
528557

@@ -531,6 +560,8 @@ impl ArchitectureOperations for Architecture {
531560
Architecture::X86_64(x86_64) => x86_64.disassembler(),
532561
Architecture::I386(i386) => i386.disassembler(),
533562
Architecture::Riscv(riscv) => riscv.disassembler(),
563+
Architecture::Arm(arm) => arm.disassembler(),
564+
Architecture::Aarch64(aarch64) => aarch64.disassembler(),
534565
}
535566
}
536567

@@ -539,6 +570,8 @@ impl ArchitectureOperations for Architecture {
539570
Architecture::X86_64(x86_64) => x86_64.int_register(),
540571
Architecture::I386(i386) => i386.int_register(),
541572
Architecture::Riscv(riscv) => riscv.int_register(),
573+
Architecture::Arm(arm) => arm.int_register(),
574+
Architecture::Aarch64(aarch64) => aarch64.int_register(),
542575
}
543576
}
544577

@@ -547,6 +580,8 @@ impl ArchitectureOperations for Architecture {
547580
Architecture::X86_64(x86_64) => x86_64.processor_info_v2(),
548581
Architecture::I386(i386) => i386.processor_info_v2(),
549582
Architecture::Riscv(riscv) => riscv.processor_info_v2(),
583+
Architecture::Arm(arm) => arm.processor_info_v2(),
584+
Architecture::Aarch64(aarch64) => aarch64.processor_info_v2(),
550585
}
551586
}
552587

@@ -555,6 +590,8 @@ impl ArchitectureOperations for Architecture {
555590
Architecture::X86_64(x86_64) => x86_64.cpu_instruction_query(),
556591
Architecture::I386(i386) => i386.cpu_instruction_query(),
557592
Architecture::Riscv(riscv) => riscv.cpu_instruction_query(),
593+
Architecture::Arm(arm) => arm.cpu_instruction_query(),
594+
Architecture::Aarch64(aarch64) => aarch64.cpu_instruction_query(),
558595
}
559596
}
560597

@@ -563,6 +600,8 @@ impl ArchitectureOperations for Architecture {
563600
Architecture::X86_64(x86_64) => x86_64.cpu_instrumentation_subscribe(),
564601
Architecture::I386(i386) => i386.cpu_instrumentation_subscribe(),
565602
Architecture::Riscv(riscv) => riscv.cpu_instrumentation_subscribe(),
603+
Architecture::Arm(arm) => arm.cpu_instrumentation_subscribe(),
604+
Architecture::Aarch64(aarch64) => aarch64.cpu_instrumentation_subscribe(),
566605
}
567606
}
568607

@@ -571,6 +610,8 @@ impl ArchitectureOperations for Architecture {
571610
Architecture::X86_64(x86_64) => x86_64.cycle(),
572611
Architecture::I386(i386) => i386.cycle(),
573612
Architecture::Riscv(riscv) => riscv.cycle(),
613+
Architecture::Arm(arm) => arm.cycle(),
614+
Architecture::Aarch64(aarch64) => aarch64.cycle(),
574615
}
575616
}
576617

@@ -579,6 +620,8 @@ impl ArchitectureOperations for Architecture {
579620
Architecture::X86_64(x86_64) => x86_64.get_magic_index_selector(),
580621
Architecture::I386(i386) => i386.get_magic_index_selector(),
581622
Architecture::Riscv(riscv) => riscv.get_magic_index_selector(),
623+
Architecture::Arm(arm) => arm.get_magic_index_selector(),
624+
Architecture::Aarch64(aarch64) => aarch64.get_magic_index_selector(),
582625
}
583626
}
584627

@@ -587,6 +630,8 @@ impl ArchitectureOperations for Architecture {
587630
Architecture::X86_64(x86_64) => x86_64.get_magic_start_buffer_ptr_size_ptr(),
588631
Architecture::I386(i386) => i386.get_magic_start_buffer_ptr_size_ptr(),
589632
Architecture::Riscv(riscv) => riscv.get_magic_start_buffer_ptr_size_ptr(),
633+
Architecture::Arm(arm) => arm.get_magic_start_buffer_ptr_size_ptr(),
634+
Architecture::Aarch64(aarch64) => aarch64.get_magic_start_buffer_ptr_size_ptr(),
590635
}
591636
}
592637

@@ -595,6 +640,8 @@ impl ArchitectureOperations for Architecture {
595640
Architecture::X86_64(x86_64) => x86_64.get_magic_start_buffer_ptr_size_val(),
596641
Architecture::I386(i386) => i386.get_magic_start_buffer_ptr_size_val(),
597642
Architecture::Riscv(riscv) => riscv.get_magic_start_buffer_ptr_size_val(),
643+
Architecture::Arm(arm) => arm.get_magic_start_buffer_ptr_size_val(),
644+
Architecture::Aarch64(aarch64) => aarch64.get_magic_start_buffer_ptr_size_val(),
598645
}
599646
}
600647

@@ -603,6 +650,8 @@ impl ArchitectureOperations for Architecture {
603650
Architecture::X86_64(x86_64) => x86_64.get_magic_start_buffer_ptr_size_ptr(),
604651
Architecture::I386(i386) => i386.get_magic_start_buffer_ptr_size_ptr(),
605652
Architecture::Riscv(riscv) => riscv.get_magic_start_buffer_ptr_size_ptr(),
653+
Architecture::Arm(arm) => arm.get_magic_start_buffer_ptr_size_ptr_val(),
654+
Architecture::Aarch64(aarch64) => aarch64.get_magic_start_buffer_ptr_size_ptr_val(),
606655
}
607656
}
608657

@@ -611,6 +660,8 @@ impl ArchitectureOperations for Architecture {
611660
Architecture::X86_64(x86_64) => x86_64.get_manual_start_info(info),
612661
Architecture::I386(i386) => i386.get_manual_start_info(info),
613662
Architecture::Riscv(riscv) => riscv.get_manual_start_info(info),
663+
Architecture::Arm(arm) => arm.get_manual_start_info(info),
664+
Architecture::Aarch64(aarch64) => aarch64.get_manual_start_info(info),
614665
}
615666
}
616667

@@ -619,6 +670,8 @@ impl ArchitectureOperations for Architecture {
619670
Architecture::X86_64(x86_64) => x86_64.write_start(testcase, info),
620671
Architecture::I386(i386) => i386.write_start(testcase, info),
621672
Architecture::Riscv(riscv) => riscv.write_start(testcase, info),
673+
Architecture::Arm(arm) => arm.write_start(testcase, info),
674+
Architecture::Aarch64(aarch64) => aarch64.write_start(testcase, info),
622675
}
623676
}
624677

@@ -627,6 +680,8 @@ impl ArchitectureOperations for Architecture {
627680
Architecture::X86_64(x86_64) => x86_64.trace_pc(instruction_query),
628681
Architecture::I386(i386) => i386.trace_pc(instruction_query),
629682
Architecture::Riscv(riscv) => riscv.trace_pc(instruction_query),
683+
Architecture::Arm(arm) => arm.trace_pc(instruction_query),
684+
Architecture::Aarch64(aarch64) => aarch64.trace_pc(instruction_query),
630685
}
631686
}
632687

@@ -635,6 +690,8 @@ impl ArchitectureOperations for Architecture {
635690
Architecture::X86_64(x86_64) => x86_64.trace_cmp(instruction_query),
636691
Architecture::I386(i386) => i386.trace_cmp(instruction_query),
637692
Architecture::Riscv(riscv) => riscv.trace_cmp(instruction_query),
693+
Architecture::Arm(arm) => arm.trace_cmp(instruction_query),
694+
Architecture::Aarch64(aarch64) => aarch64.trace_cmp(instruction_query),
638695
}
639696
}
640697
}

src/arch/x86.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,10 @@ impl X86ArchitectureOperations {
730730
.to_le_bytes();
731731
Ok(CmpValue::U64(u64::from_le_bytes(bytes)))
732732
}
733+
_ => {
734+
// There are other types but they are never emitted on x86
735+
bail!("Unsupported expression type");
736+
}
733737
}
734738
}
735739
}

src/arch/x86_64.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,10 @@ impl X86_64ArchitectureOperations {
704704
.to_le_bytes();
705705
Ok(CmpValue::U64(u64::from_le_bytes(bytes)))
706706
}
707+
_ => {
708+
// There are other types but they are never emitted on x86_64
709+
bail!("Unsupported expression type")
710+
}
707711
}
708712
}
709713
}

src/tracer/mod.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,22 @@ use typed_builder::TypedBuilder;
1818

1919
use crate::{arch::ArchitectureOperations, Tsffs};
2020

21+
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
22+
pub(crate) enum CmpExprShift {
23+
Lsl,
24+
Lsr,
25+
Asr,
26+
Ror,
27+
}
28+
2129
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
2230
pub(crate) enum CmpExpr {
2331
Deref((Box<CmpExpr>, Option<u8>)),
2432
Reg((String, u8)),
2533
Mul((Box<CmpExpr>, Box<CmpExpr>)),
2634
Add((Box<CmpExpr>, Box<CmpExpr>)),
35+
Sub((Box<CmpExpr>, Box<CmpExpr>)),
36+
Shift((Box<CmpExpr>, Box<CmpExpr>, CmpExprShift)),
2737
U8(u8),
2838
I8(i8),
2939
U16(u16),

0 commit comments

Comments
 (0)