@@ -4,7 +4,7 @@ use std::collections::HashMap;
44use std:: sync:: RwLockWriteGuard ;
55use unicorn_engine:: {
66 unicorn_const:: { Arch , Mode } ,
7- RegisterARM , RegisterRISCV , Unicorn ,
7+ RegisterARM , RegisterRISCV , RegisterARM64 , Unicorn ,
88} ;
99
1010static 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 ) ]
68106pub enum Architecture {
69107 Arm ,
70108 Riscv64 ,
109+ Aarch64 ,
71110}
72111
73112pub 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 ( ) ) ;
0 commit comments