Arion 1.0.2-alpha
A high-performance C++ framework for emulating executable binaries.
 
Loading...
Searching...
No Matches
arch_arm64.hpp
Go to the documentation of this file.
1#ifndef ARION_ARCH_ARM64_HPP
2#define ARION_ARCH_ARM64_HPP
3
7
8namespace arion_arm64
9{
10
12inline std::map<uint64_t, std::string> NAME_BY_SYSCALL_NO = {{0, "io_setup"},
13 {1, "io_destroy"},
14 {2, "io_submit"},
15 {3, "io_cancel"},
16 {4, "io_getevents"},
17 {5, "setxattr"},
18 {6, "lsetxattr"},
19 {7, "fsetxattr"},
20 {8, "getxattr"},
21 {9, "lgetxattr"},
22 {10, "fgetxattr"},
23 {11, "listxattr"},
24 {12, "llistxattr"},
25 {13, "flistxattr"},
26 {14, "removexattr"},
27 {15, "lremovexattr"},
28 {16, "fremovexattr"},
29 {17, "getcwd"},
30 {19, "eventfd2"},
31 {20, "epoll_create1"},
32 {21, "epoll_ctl"},
33 {22, "epoll_pwait"},
34 {23, "dup"},
35 {24, "dup3"},
36 {25, "fcntl"},
37 {26, "inotify_init1"},
38 {27, "inotify_add_watch"},
39 {28, "inotify_rm_watch"},
40 {29, "ioctl"},
41 {30, "ioprio_set"},
42 {31, "ioprio_get"},
43 {32, "flock"},
44 {33, "mknodat"},
45 {34, "mkdirat"},
46 {35, "unlinkat"},
47 {36, "symlinkat"},
48 {37, "linkat"},
49 {38, "renameat"},
50 {39, "umount"},
51 {40, "mount"},
52 {41, "pivot_root"},
53 {43, "statfs"},
54 {44, "fstatfs"},
55 {45, "truncate"},
56 {46, "ftruncate"},
57 {47, "fallocate"},
58 {48, "faccessat"},
59 {49, "chdir"},
60 {50, "fchdir"},
61 {51, "chroot"},
62 {52, "fchmod"},
63 {53, "fchmodat"},
64 {54, "fchownat"},
65 {55, "fchown"},
66 {56, "openat"},
67 {57, "close"},
68 {58, "vhangup"},
69 {59, "pipe2"},
70 {60, "quotactl"},
71 {61, "getdents64"},
72 {62, "lseek"},
73 {63, "read"},
74 {64, "write"},
75 {65, "readv"},
76 {66, "writev"},
77 {67, "pread64"},
78 {68, "pwrite64"},
79 {69, "preadv"},
80 {70, "pwritev"},
81 {71, "sendfile64"},
82 {72, "pselect6"},
83 {73, "ppoll"},
84 {74, "signalfd4"},
85 {75, "vmsplice"},
86 {76, "splice"},
87 {77, "tee"},
88 {78, "readlinkat"},
89 {79, "newfstatat"},
90 {80, "newfstat"},
91 {81, "sync"},
92 {82, "fsync"},
93 {83, "fdatasync"},
94 {84, "sync_file_range"},
95 {85, "timerfd_create"},
96 {86, "timerfd_settime"},
97 {87, "timerfd_gettime"},
98 {88, "utimensat"},
99 {89, "acct"},
100 {90, "capget"},
101 {91, "capset"},
102 {92, "personality"},
103 {93, "exit"},
104 {94, "exit_group"},
105 {95, "waitid"},
106 {96, "set_tid_address"},
107 {97, "unshare"},
108 {98, "futex"},
109 {99, "set_robust_list"},
110 {100, "get_robust_list"},
111 {101, "nanosleep"},
112 {102, "getitimer"},
113 {103, "setitimer"},
114 {104, "kexec_load"},
115 {105, "init_module"},
116 {106, "delete_module"},
117 {107, "timer_create"},
118 {108, "timer_gettime"},
119 {109, "timer_getoverrun"},
120 {110, "timer_settime"},
121 {111, "timer_delete"},
122 {112, "clock_settime"},
123 {113, "clock_gettime"},
124 {114, "clock_getres"},
125 {115, "clock_nanosleep"},
126 {116, "syslog"},
127 {117, "ptrace"},
128 {118, "sched_setparam"},
129 {119, "sched_setscheduler"},
130 {120, "sched_getscheduler"},
131 {121, "sched_getparam"},
132 {122, "sched_setaffinity"},
133 {123, "sched_getaffinity"},
134 {124, "sched_yield"},
135 {125, "sched_get_priority_max"},
136 {126, "sched_get_priority_min"},
137 {127, "sched_rr_get_interval"},
138 {128, "restart_syscall"},
139 {129, "kill"},
140 {130, "tkill"},
141 {131, "tgkill"},
142 {132, "sigaltstack"},
143 {133, "rt_sigsuspend"},
144 {134, "rt_sigaction"},
145 {135, "rt_sigprocmask"},
146 {136, "rt_sigpending"},
147 {137, "rt_sigtimedwait"},
148 {138, "rt_sigqueueinfo"},
149 {139, "rt_sigreturn"},
150 {140, "setpriority"},
151 {141, "getpriority"},
152 {142, "reboot"},
153 {143, "setregid"},
154 {144, "setgid"},
155 {145, "setreuid"},
156 {146, "setuid"},
157 {147, "setresuid"},
158 {148, "getresuid"},
159 {149, "setresgid"},
160 {150, "getresgid"},
161 {151, "setfsuid"},
162 {152, "setfsgid"},
163 {153, "times"},
164 {154, "setpgid"},
165 {155, "getpgid"},
166 {156, "getsid"},
167 {157, "setsid"},
168 {158, "getgroups"},
169 {159, "setgroups"},
170 {160, "newuname"},
171 {161, "sethostname"},
172 {162, "setdomainname"},
173 {163, "getrlimit"},
174 {164, "setrlimit"},
175 {165, "getrusage"},
176 {166, "umask"},
177 {167, "prctl"},
178 {168, "getcpu"},
179 {169, "gettimeofday"},
180 {170, "settimeofday"},
181 {171, "adjtimex"},
182 {172, "getpid"},
183 {173, "getppid"},
184 {174, "getuid"},
185 {175, "geteuid"},
186 {176, "getgid"},
187 {177, "getegid"},
188 {178, "gettid"},
189 {179, "sysinfo"},
190 {180, "mq_open"},
191 {181, "mq_unlink"},
192 {182, "mq_timedsend"},
193 {183, "mq_timedreceive"},
194 {184, "mq_notify"},
195 {185, "mq_getsetattr"},
196 {186, "msgget"},
197 {187, "msgctl"},
198 {188, "msgrcv"},
199 {189, "msgsnd"},
200 {190, "semget"},
201 {191, "semctl"},
202 {192, "semtimedop"},
203 {193, "semop"},
204 {194, "shmget"},
205 {195, "shmctl"},
206 {196, "shmat"},
207 {197, "shmdt"},
208 {198, "socket"},
209 {199, "socketpair"},
210 {200, "bind"},
211 {201, "listen"},
212 {202, "accept"},
213 {203, "connect"},
214 {204, "getsockname"},
215 {205, "getpeername"},
216 {206, "sendto"},
217 {207, "recvfrom"},
218 {208, "setsockopt"},
219 {209, "getsockopt"},
220 {210, "shutdown"},
221 {211, "sendmsg"},
222 {212, "recvmsg"},
223 {213, "readahead"},
224 {214, "brk"},
225 {215, "munmap"},
226 {216, "mremap"},
227 {217, "add_key"},
228 {218, "request_key"},
229 {219, "keyctl"},
230 {220, "clone"},
231 {221, "execve"},
232 {222, "mmap"},
233 {223, "fadvise64_64"},
234 {224, "swapon"},
235 {225, "swapoff"},
236 {226, "mprotect"},
237 {227, "msync"},
238 {228, "mlock"},
239 {229, "munlock"},
240 {230, "mlockall"},
241 {231, "munlockall"},
242 {232, "mincore"},
243 {233, "madvise"},
244 {234, "remap_file_pages"},
245 {235, "mbind"},
246 {236, "get_mempolicy"},
247 {237, "set_mempolicy"},
248 {238, "migrate_pages"},
249 {239, "move_pages"},
250 {240, "rt_tgsigqueueinfo"},
251 {241, "perf_event_open"},
252 {242, "accept4"},
253 {243, "recvmmsg"},
254 {260, "wait4"},
255 {261, "prlimit64"},
256 {262, "fanotify_init"},
257 {263, "fanotify_mark"},
258 {264, "name_to_handle_at"},
259 {265, "open_by_handle_at"},
260 {266, "clock_adjtime"},
261 {267, "syncfs"},
262 {268, "setns"},
263 {269, "sendmmsg"},
264 {270, "process_vm_readv"},
265 {271, "process_vm_writev"},
266 {272, "kcmp"},
267 {273, "finit_module"},
268 {274, "sched_setattr"},
269 {275, "sched_getattr"},
270 {276, "renameat2"},
271 {277, "seccomp"},
272 {278, "getrandom"},
273 {279, "memfd_create"},
274 {280, "bpf"},
275 {281, "execveat"},
276 {282, "userfaultfd"},
277 {283, "membarrier"},
278 {284, "mlock2"},
279 {285, "copy_file_range"},
280 {286, "preadv2"},
281 {287, "pwritev2"},
282 {288, "pkey_mprotect"},
283 {289, "pkey_alloc"},
284 {290, "pkey_free"},
285 {291, "statx"},
286 {292, "io_pgetevents"},
287 {293, "rseq"},
288 {294, "kexec_file_load"},
289 {424, "pidfd_send_signal"},
290 {425, "io_uring_setup"},
291 {426, "io_uring_enter"},
292 {427, "io_uring_register"},
293 {428, "open_tree"},
294 {429, "move_mount"},
295 {430, "fsopen"},
296 {431, "fsconfig"},
297 {432, "fsmount"},
298 {433, "fspick"},
299 {434, "pidfd_open"},
300 {435, "clone3"},
301 {436, "close_range"},
302 {437, "openat2"},
303 {438, "pidfd_getfd"},
304 {439, "faccessat2"},
305 {440, "process_madvise"},
306 {441, "epoll_pwait2"},
307 {442, "mount_setattr"},
308 {443, "quotactl_fd"},
309 {444, "landlock_create_ruleset"},
310 {445, "landlock_add_rule"},
311 {446, "landlock_restrict_self"},
312 {447, "memfd_secret"},
313 {448, "process_mrelease"},
314 {449, "futex_waitv"},
315 {450, "set_mempolicy_home_node"},
316 {451, "cachestat"},
317 {452, "fchmodat2"},
318 {453, "map_shadow_stack"},
319 {454, "futex_wake"},
320 {455, "futex_wait"},
321 {456, "futex_requeue"},
322 {457, "statmount"},
323 {458, "listmount"},
324 {459, "lsm_get_self_attr"},
325 {460, "lsm_set_self_attr"},
326 {461, "lsm_list_modules"},
327 {462, "mseal"},
328 {463, "setxattrat"},
329 {464, "getxattrat"},
330 {465, "listxattrat"},
331 {466, "removexattrat"}};
332
334inline std::map<std::string, arion::REG> ARCH_REGS = {
335 {"X29", UC_ARM64_REG_X29}, {"X30", UC_ARM64_REG_X30},
336 {"NZCV", UC_ARM64_REG_NZCV}, {"SP", UC_ARM64_REG_SP},
337 {"WSP", UC_ARM64_REG_WSP}, {"WZR", UC_ARM64_REG_WZR},
338 {"XZR", UC_ARM64_REG_XZR}, {"B0", UC_ARM64_REG_B0},
339 {"B1", UC_ARM64_REG_B1}, {"B2", UC_ARM64_REG_B2},
340 {"B3", UC_ARM64_REG_B3}, {"B4", UC_ARM64_REG_B4},
341 {"B5", UC_ARM64_REG_B5}, {"B6", UC_ARM64_REG_B6},
342 {"B7", UC_ARM64_REG_B7}, {"B8", UC_ARM64_REG_B8},
343 {"B9", UC_ARM64_REG_B9}, {"B10", UC_ARM64_REG_B10},
344 {"B11", UC_ARM64_REG_B11}, {"B12", UC_ARM64_REG_B12},
345 {"B13", UC_ARM64_REG_B13}, {"B14", UC_ARM64_REG_B14},
346 {"B15", UC_ARM64_REG_B15}, {"B16", UC_ARM64_REG_B16},
347 {"B17", UC_ARM64_REG_B17}, {"B18", UC_ARM64_REG_B18},
348 {"B19", UC_ARM64_REG_B19}, {"B20", UC_ARM64_REG_B20},
349 {"B21", UC_ARM64_REG_B21}, {"B22", UC_ARM64_REG_B22},
350 {"B23", UC_ARM64_REG_B23}, {"B24", UC_ARM64_REG_B24},
351 {"B25", UC_ARM64_REG_B25}, {"B26", UC_ARM64_REG_B26},
352 {"B27", UC_ARM64_REG_B27}, {"B28", UC_ARM64_REG_B28},
353 {"B29", UC_ARM64_REG_B29}, {"B30", UC_ARM64_REG_B30},
354 {"B31", UC_ARM64_REG_B31}, {"D0", UC_ARM64_REG_D0},
355 {"D1", UC_ARM64_REG_D1}, {"D2", UC_ARM64_REG_D2},
356 {"D3", UC_ARM64_REG_D3}, {"D4", UC_ARM64_REG_D4},
357 {"D5", UC_ARM64_REG_D5}, {"D6", UC_ARM64_REG_D6},
358 {"D7", UC_ARM64_REG_D7}, {"D8", UC_ARM64_REG_D8},
359 {"D9", UC_ARM64_REG_D9}, {"D10", UC_ARM64_REG_D10},
360 {"D11", UC_ARM64_REG_D11}, {"D12", UC_ARM64_REG_D12},
361 {"D13", UC_ARM64_REG_D13}, {"D14", UC_ARM64_REG_D14},
362 {"D15", UC_ARM64_REG_D15}, {"D16", UC_ARM64_REG_D16},
363 {"D17", UC_ARM64_REG_D17}, {"D18", UC_ARM64_REG_D18},
364 {"D19", UC_ARM64_REG_D19}, {"D20", UC_ARM64_REG_D20},
365 {"D21", UC_ARM64_REG_D21}, {"D22", UC_ARM64_REG_D22},
366 {"D23", UC_ARM64_REG_D23}, {"D24", UC_ARM64_REG_D24},
367 {"D25", UC_ARM64_REG_D25}, {"D26", UC_ARM64_REG_D26},
368 {"D27", UC_ARM64_REG_D27}, {"D28", UC_ARM64_REG_D28},
369 {"D29", UC_ARM64_REG_D29}, {"D30", UC_ARM64_REG_D30},
370 {"D31", UC_ARM64_REG_D31}, {"H0", UC_ARM64_REG_H0},
371 {"H1", UC_ARM64_REG_H1}, {"H2", UC_ARM64_REG_H2},
372 {"H3", UC_ARM64_REG_H3}, {"H4", UC_ARM64_REG_H4},
373 {"H5", UC_ARM64_REG_H5}, {"H6", UC_ARM64_REG_H6},
374 {"H7", UC_ARM64_REG_H7}, {"H8", UC_ARM64_REG_H8},
375 {"H9", UC_ARM64_REG_H9}, {"H10", UC_ARM64_REG_H10},
376 {"H11", UC_ARM64_REG_H11}, {"H12", UC_ARM64_REG_H12},
377 {"H13", UC_ARM64_REG_H13}, {"H14", UC_ARM64_REG_H14},
378 {"H15", UC_ARM64_REG_H15}, {"H16", UC_ARM64_REG_H16},
379 {"H17", UC_ARM64_REG_H17}, {"H18", UC_ARM64_REG_H18},
380 {"H19", UC_ARM64_REG_H19}, {"H20", UC_ARM64_REG_H20},
381 {"H21", UC_ARM64_REG_H21}, {"H22", UC_ARM64_REG_H22},
382 {"H23", UC_ARM64_REG_H23}, {"H24", UC_ARM64_REG_H24},
383 {"H25", UC_ARM64_REG_H25}, {"H26", UC_ARM64_REG_H26},
384 {"H27", UC_ARM64_REG_H27}, {"H28", UC_ARM64_REG_H28},
385 {"H29", UC_ARM64_REG_H29}, {"H30", UC_ARM64_REG_H30},
386 {"H31", UC_ARM64_REG_H31}, {"Q0", UC_ARM64_REG_Q0},
387 {"Q1", UC_ARM64_REG_Q1}, {"Q2", UC_ARM64_REG_Q2},
388 {"Q3", UC_ARM64_REG_Q3}, {"Q4", UC_ARM64_REG_Q4},
389 {"Q5", UC_ARM64_REG_Q5}, {"Q6", UC_ARM64_REG_Q6},
390 {"Q7", UC_ARM64_REG_Q7}, {"Q8", UC_ARM64_REG_Q8},
391 {"Q9", UC_ARM64_REG_Q9}, {"Q10", UC_ARM64_REG_Q10},
392 {"Q11", UC_ARM64_REG_Q11}, {"Q12", UC_ARM64_REG_Q12},
393 {"Q13", UC_ARM64_REG_Q13}, {"Q14", UC_ARM64_REG_Q14},
394 {"Q15", UC_ARM64_REG_Q15}, {"Q16", UC_ARM64_REG_Q16},
395 {"Q17", UC_ARM64_REG_Q17}, {"Q18", UC_ARM64_REG_Q18},
396 {"Q19", UC_ARM64_REG_Q19}, {"Q20", UC_ARM64_REG_Q20},
397 {"Q21", UC_ARM64_REG_Q21}, {"Q22", UC_ARM64_REG_Q22},
398 {"Q23", UC_ARM64_REG_Q23}, {"Q24", UC_ARM64_REG_Q24},
399 {"Q25", UC_ARM64_REG_Q25}, {"Q26", UC_ARM64_REG_Q26},
400 {"Q27", UC_ARM64_REG_Q27}, {"Q28", UC_ARM64_REG_Q28},
401 {"Q29", UC_ARM64_REG_Q29}, {"Q30", UC_ARM64_REG_Q30},
402 {"Q31", UC_ARM64_REG_Q31}, {"S0", UC_ARM64_REG_S0},
403 {"S1", UC_ARM64_REG_S1}, {"S2", UC_ARM64_REG_S2},
404 {"S3", UC_ARM64_REG_S3}, {"S4", UC_ARM64_REG_S4},
405 {"S5", UC_ARM64_REG_S5}, {"S6", UC_ARM64_REG_S6},
406 {"S7", UC_ARM64_REG_S7}, {"S8", UC_ARM64_REG_S8},
407 {"S9", UC_ARM64_REG_S9}, {"S10", UC_ARM64_REG_S10},
408 {"S11", UC_ARM64_REG_S11}, {"S12", UC_ARM64_REG_S12},
409 {"S13", UC_ARM64_REG_S13}, {"S14", UC_ARM64_REG_S14},
410 {"S15", UC_ARM64_REG_S15}, {"S16", UC_ARM64_REG_S16},
411 {"S17", UC_ARM64_REG_S17}, {"S18", UC_ARM64_REG_S18},
412 {"S19", UC_ARM64_REG_S19}, {"S20", UC_ARM64_REG_S20},
413 {"S21", UC_ARM64_REG_S21}, {"S22", UC_ARM64_REG_S22},
414 {"S23", UC_ARM64_REG_S23}, {"S24", UC_ARM64_REG_S24},
415 {"S25", UC_ARM64_REG_S25}, {"S26", UC_ARM64_REG_S26},
416 {"S27", UC_ARM64_REG_S27}, {"S28", UC_ARM64_REG_S28},
417 {"S29", UC_ARM64_REG_S29}, {"S30", UC_ARM64_REG_S30},
418 {"S31", UC_ARM64_REG_S31}, {"W0", UC_ARM64_REG_W0},
419 {"W1", UC_ARM64_REG_W1}, {"W2", UC_ARM64_REG_W2},
420 {"W3", UC_ARM64_REG_W3}, {"W4", UC_ARM64_REG_W4},
421 {"W5", UC_ARM64_REG_W5}, {"W6", UC_ARM64_REG_W6},
422 {"W7", UC_ARM64_REG_W7}, {"W8", UC_ARM64_REG_W8},
423 {"W9", UC_ARM64_REG_W9}, {"W10", UC_ARM64_REG_W10},
424 {"W11", UC_ARM64_REG_W11}, {"W12", UC_ARM64_REG_W12},
425 {"W13", UC_ARM64_REG_W13}, {"W14", UC_ARM64_REG_W14},
426 {"W15", UC_ARM64_REG_W15}, {"W16", UC_ARM64_REG_W16},
427 {"W17", UC_ARM64_REG_W17}, {"W18", UC_ARM64_REG_W18},
428 {"W19", UC_ARM64_REG_W19}, {"W20", UC_ARM64_REG_W20},
429 {"W21", UC_ARM64_REG_W21}, {"W22", UC_ARM64_REG_W22},
430 {"W23", UC_ARM64_REG_W23}, {"W24", UC_ARM64_REG_W24},
431 {"W25", UC_ARM64_REG_W25}, {"W26", UC_ARM64_REG_W26},
432 {"W27", UC_ARM64_REG_W27}, {"W28", UC_ARM64_REG_W28},
433 {"W29", UC_ARM64_REG_W29}, {"W30", UC_ARM64_REG_W30},
434 {"X0", UC_ARM64_REG_X0}, {"X1", UC_ARM64_REG_X1},
435 {"X2", UC_ARM64_REG_X2}, {"X3", UC_ARM64_REG_X3},
436 {"X4", UC_ARM64_REG_X4}, {"X5", UC_ARM64_REG_X5},
437 {"X6", UC_ARM64_REG_X6}, {"X7", UC_ARM64_REG_X7},
438 {"X8", UC_ARM64_REG_X8}, {"X9", UC_ARM64_REG_X9},
439 {"X10", UC_ARM64_REG_X10}, {"X11", UC_ARM64_REG_X11},
440 {"X12", UC_ARM64_REG_X12}, {"X13", UC_ARM64_REG_X13},
441 {"X14", UC_ARM64_REG_X14}, {"X15", UC_ARM64_REG_X15},
442 {"X16", UC_ARM64_REG_X16}, {"X17", UC_ARM64_REG_X17},
443 {"X18", UC_ARM64_REG_X18}, {"X19", UC_ARM64_REG_X19},
444 {"X20", UC_ARM64_REG_X20}, {"X21", UC_ARM64_REG_X21},
445 {"X22", UC_ARM64_REG_X22}, {"X23", UC_ARM64_REG_X23},
446 {"X24", UC_ARM64_REG_X24}, {"X25", UC_ARM64_REG_X25},
447 {"X26", UC_ARM64_REG_X26}, {"X27", UC_ARM64_REG_X27},
448 {"X28", UC_ARM64_REG_X28}, {"V0", UC_ARM64_REG_V0},
449 {"V1", UC_ARM64_REG_V1}, {"V2", UC_ARM64_REG_V2},
450 {"V3", UC_ARM64_REG_V3}, {"V4", UC_ARM64_REG_V4},
451 {"V5", UC_ARM64_REG_V5}, {"V6", UC_ARM64_REG_V6},
452 {"V7", UC_ARM64_REG_V7}, {"V8", UC_ARM64_REG_V8},
453 {"V9", UC_ARM64_REG_V9}, {"V10", UC_ARM64_REG_V10},
454 {"V11", UC_ARM64_REG_V11}, {"V12", UC_ARM64_REG_V12},
455 {"V13", UC_ARM64_REG_V13}, {"V14", UC_ARM64_REG_V14},
456 {"V15", UC_ARM64_REG_V15}, {"V16", UC_ARM64_REG_V16},
457 {"V17", UC_ARM64_REG_V17}, {"V18", UC_ARM64_REG_V18},
458 {"V19", UC_ARM64_REG_V19}, {"V20", UC_ARM64_REG_V20},
459 {"V21", UC_ARM64_REG_V21}, {"V22", UC_ARM64_REG_V22},
460 {"V23", UC_ARM64_REG_V23}, {"V24", UC_ARM64_REG_V24},
461 {"V25", UC_ARM64_REG_V25}, {"V26", UC_ARM64_REG_V26},
462 {"V27", UC_ARM64_REG_V27}, {"V28", UC_ARM64_REG_V28},
463 {"V29", UC_ARM64_REG_V29}, {"V30", UC_ARM64_REG_V30},
464 {"V31", UC_ARM64_REG_V31}, {"PC", UC_ARM64_REG_PC},
465 {"CP", UC_ARM64_REG_CP_REG}, {"CPACR_EL1", UC_ARM64_REG_CPACR_EL1},
466 {"FPCR", UC_ARM64_REG_FPCR}, {"FPSR", UC_ARM64_REG_FPSR}};
467
469inline std::map<arion::REG, uint8_t> ARCH_REGS_SZ = {
470 {UC_ARM64_REG_B0, 1}, {UC_ARM64_REG_B1, 1}, {UC_ARM64_REG_B2, 1}, {UC_ARM64_REG_B3, 1},
471 {UC_ARM64_REG_B4, 1}, {UC_ARM64_REG_B5, 1}, {UC_ARM64_REG_B6, 1}, {UC_ARM64_REG_B7, 1},
472 {UC_ARM64_REG_B8, 1}, {UC_ARM64_REG_B9, 1}, {UC_ARM64_REG_B10, 1}, {UC_ARM64_REG_B11, 1},
473 {UC_ARM64_REG_B12, 1}, {UC_ARM64_REG_B13, 1}, {UC_ARM64_REG_B14, 1}, {UC_ARM64_REG_B15, 1},
474 {UC_ARM64_REG_B16, 1}, {UC_ARM64_REG_B17, 1}, {UC_ARM64_REG_B18, 1}, {UC_ARM64_REG_B19, 1},
475 {UC_ARM64_REG_B20, 1}, {UC_ARM64_REG_B21, 1}, {UC_ARM64_REG_B22, 1}, {UC_ARM64_REG_B23, 1},
476 {UC_ARM64_REG_B24, 1}, {UC_ARM64_REG_B25, 1}, {UC_ARM64_REG_B26, 1}, {UC_ARM64_REG_B27, 1},
477 {UC_ARM64_REG_B28, 1}, {UC_ARM64_REG_B29, 1}, {UC_ARM64_REG_B30, 1}, {UC_ARM64_REG_B31, 1},
478 {UC_ARM64_REG_H0, 2}, {UC_ARM64_REG_H1, 2}, {UC_ARM64_REG_H2, 2}, {UC_ARM64_REG_H3, 2},
479 {UC_ARM64_REG_H4, 2}, {UC_ARM64_REG_H5, 2}, {UC_ARM64_REG_H6, 2}, {UC_ARM64_REG_H7, 2},
480 {UC_ARM64_REG_H8, 2}, {UC_ARM64_REG_H9, 2}, {UC_ARM64_REG_H10, 2}, {UC_ARM64_REG_H11, 2},
481 {UC_ARM64_REG_H12, 2}, {UC_ARM64_REG_H13, 2}, {UC_ARM64_REG_H14, 2}, {UC_ARM64_REG_H15, 2},
482 {UC_ARM64_REG_H16, 2}, {UC_ARM64_REG_H17, 2}, {UC_ARM64_REG_H18, 2}, {UC_ARM64_REG_H19, 2},
483 {UC_ARM64_REG_H20, 2}, {UC_ARM64_REG_H21, 2}, {UC_ARM64_REG_H22, 2}, {UC_ARM64_REG_H23, 2},
484 {UC_ARM64_REG_H24, 2}, {UC_ARM64_REG_H25, 2}, {UC_ARM64_REG_H26, 2}, {UC_ARM64_REG_H27, 2},
485 {UC_ARM64_REG_H28, 2}, {UC_ARM64_REG_H29, 2}, {UC_ARM64_REG_H30, 2}, {UC_ARM64_REG_H31, 2},
486 {UC_ARM64_REG_S0, 4}, {UC_ARM64_REG_S1, 4}, {UC_ARM64_REG_S2, 4}, {UC_ARM64_REG_S3, 4},
487 {UC_ARM64_REG_S4, 4}, {UC_ARM64_REG_S5, 4}, {UC_ARM64_REG_S6, 4}, {UC_ARM64_REG_S7, 4},
488 {UC_ARM64_REG_S8, 4}, {UC_ARM64_REG_S9, 4}, {UC_ARM64_REG_S10, 4}, {UC_ARM64_REG_S11, 4},
489 {UC_ARM64_REG_S12, 4}, {UC_ARM64_REG_S13, 4}, {UC_ARM64_REG_S14, 4}, {UC_ARM64_REG_S15, 4},
490 {UC_ARM64_REG_S16, 4}, {UC_ARM64_REG_S17, 4}, {UC_ARM64_REG_S18, 4}, {UC_ARM64_REG_S19, 4},
491 {UC_ARM64_REG_S20, 4}, {UC_ARM64_REG_S21, 4}, {UC_ARM64_REG_S22, 4}, {UC_ARM64_REG_S23, 4},
492 {UC_ARM64_REG_S24, 4}, {UC_ARM64_REG_S25, 4}, {UC_ARM64_REG_S26, 4}, {UC_ARM64_REG_S27, 4},
493 {UC_ARM64_REG_S28, 4}, {UC_ARM64_REG_S29, 4}, {UC_ARM64_REG_S30, 4}, {UC_ARM64_REG_S31, 4},
494 {UC_ARM64_REG_X0, 8}, {UC_ARM64_REG_X1, 8}, {UC_ARM64_REG_X2, 8}, {UC_ARM64_REG_X3, 8},
495 {UC_ARM64_REG_X4, 8}, {UC_ARM64_REG_X5, 8}, {UC_ARM64_REG_X6, 8}, {UC_ARM64_REG_X7, 8},
496 {UC_ARM64_REG_X8, 8}, {UC_ARM64_REG_X9, 8}, {UC_ARM64_REG_X10, 8}, {UC_ARM64_REG_X11, 8},
497 {UC_ARM64_REG_X12, 8}, {UC_ARM64_REG_X13, 8}, {UC_ARM64_REG_X14, 8}, {UC_ARM64_REG_X15, 8},
498 {UC_ARM64_REG_X16, 8}, {UC_ARM64_REG_X17, 8}, {UC_ARM64_REG_X18, 8}, {UC_ARM64_REG_X19, 8},
499 {UC_ARM64_REG_X20, 8}, {UC_ARM64_REG_X21, 8}, {UC_ARM64_REG_X22, 8}, {UC_ARM64_REG_X23, 8},
500 {UC_ARM64_REG_X24, 8}, {UC_ARM64_REG_X25, 8}, {UC_ARM64_REG_X26, 8}, {UC_ARM64_REG_X27, 8},
501 {UC_ARM64_REG_X28, 8}, {UC_ARM64_REG_X29, 8}, {UC_ARM64_REG_X30, 8}, {UC_ARM64_REG_SP, 8},
502 {UC_ARM64_REG_XZR, 8}, {UC_ARM64_REG_WZR, 4}, {UC_ARM64_REG_WSP, 4}, {UC_ARM64_REG_W0, 4},
503 {UC_ARM64_REG_W1, 4}, {UC_ARM64_REG_W2, 4}, {UC_ARM64_REG_W3, 4}, {UC_ARM64_REG_W4, 4},
504 {UC_ARM64_REG_W5, 4}, {UC_ARM64_REG_W6, 4}, {UC_ARM64_REG_W7, 4}, {UC_ARM64_REG_W8, 4},
505 {UC_ARM64_REG_W9, 4}, {UC_ARM64_REG_W10, 4}, {UC_ARM64_REG_W11, 4}, {UC_ARM64_REG_W12, 4},
506 {UC_ARM64_REG_W13, 4}, {UC_ARM64_REG_W14, 4}, {UC_ARM64_REG_W15, 4}, {UC_ARM64_REG_W16, 4},
507 {UC_ARM64_REG_W17, 4}, {UC_ARM64_REG_W18, 4}, {UC_ARM64_REG_W19, 4}, {UC_ARM64_REG_W20, 4},
508 {UC_ARM64_REG_W21, 4}, {UC_ARM64_REG_W22, 4}, {UC_ARM64_REG_W23, 4}, {UC_ARM64_REG_W24, 4},
509 {UC_ARM64_REG_W25, 4}, {UC_ARM64_REG_W26, 4}, {UC_ARM64_REG_W27, 4}, {UC_ARM64_REG_W28, 4},
510 {UC_ARM64_REG_W29, 4}, {UC_ARM64_REG_W30, 4}, {UC_ARM64_REG_V0, 16}, {UC_ARM64_REG_V1, 16},
511 {UC_ARM64_REG_V2, 16}, {UC_ARM64_REG_V3, 16}, {UC_ARM64_REG_V4, 16}, {UC_ARM64_REG_V5, 16},
512 {UC_ARM64_REG_V6, 16}, {UC_ARM64_REG_V7, 16}, {UC_ARM64_REG_V8, 16}, {UC_ARM64_REG_V9, 16},
513 {UC_ARM64_REG_V10, 16}, {UC_ARM64_REG_V11, 16}, {UC_ARM64_REG_V12, 16}, {UC_ARM64_REG_V13, 16},
514 {UC_ARM64_REG_V14, 16}, {UC_ARM64_REG_V15, 16}, {UC_ARM64_REG_V16, 16}, {UC_ARM64_REG_V17, 16},
515 {UC_ARM64_REG_V18, 16}, {UC_ARM64_REG_V19, 16}, {UC_ARM64_REG_V20, 16}, {UC_ARM64_REG_V21, 16},
516 {UC_ARM64_REG_V22, 16}, {UC_ARM64_REG_V23, 16}, {UC_ARM64_REG_V24, 16}, {UC_ARM64_REG_V25, 16},
517 {UC_ARM64_REG_V26, 16}, {UC_ARM64_REG_V27, 16}, {UC_ARM64_REG_V28, 16}, {UC_ARM64_REG_V29, 16},
518 {UC_ARM64_REG_V30, 16}, {UC_ARM64_REG_V31, 16}, {UC_ARM64_REG_Q0, 16}, {UC_ARM64_REG_Q1, 16},
519 {UC_ARM64_REG_Q2, 16}, {UC_ARM64_REG_Q3, 16}, {UC_ARM64_REG_Q4, 16}, {UC_ARM64_REG_Q5, 16},
520 {UC_ARM64_REG_Q6, 16}, {UC_ARM64_REG_Q7, 16}, {UC_ARM64_REG_Q8, 16}, {UC_ARM64_REG_Q9, 16},
521 {UC_ARM64_REG_Q10, 16}, {UC_ARM64_REG_Q11, 16}, {UC_ARM64_REG_Q12, 16}, {UC_ARM64_REG_Q13, 16},
522 {UC_ARM64_REG_Q14, 16}, {UC_ARM64_REG_Q15, 16}, {UC_ARM64_REG_Q16, 16}, {UC_ARM64_REG_Q17, 16},
523 {UC_ARM64_REG_Q18, 16}, {UC_ARM64_REG_Q19, 16}, {UC_ARM64_REG_Q20, 16}, {UC_ARM64_REG_Q21, 16},
524 {UC_ARM64_REG_Q22, 16}, {UC_ARM64_REG_Q23, 16}, {UC_ARM64_REG_Q24, 16}, {UC_ARM64_REG_Q25, 16},
525 {UC_ARM64_REG_Q26, 16}, {UC_ARM64_REG_Q27, 16}, {UC_ARM64_REG_Q28, 16}, {UC_ARM64_REG_Q29, 16},
526 {UC_ARM64_REG_Q30, 16}, {UC_ARM64_REG_Q31, 16}, {UC_ARM64_REG_D0, 8}, {UC_ARM64_REG_D1, 8},
527 {UC_ARM64_REG_D2, 8}, {UC_ARM64_REG_D3, 8}, {UC_ARM64_REG_D4, 8}, {UC_ARM64_REG_D5, 8},
528 {UC_ARM64_REG_D6, 8}, {UC_ARM64_REG_D7, 8}, {UC_ARM64_REG_D8, 8}, {UC_ARM64_REG_D9, 8},
529 {UC_ARM64_REG_D10, 8}, {UC_ARM64_REG_D11, 8}, {UC_ARM64_REG_D12, 8}, {UC_ARM64_REG_D13, 8},
530 {UC_ARM64_REG_D14, 8}, {UC_ARM64_REG_D15, 8}, {UC_ARM64_REG_D16, 8}, {UC_ARM64_REG_D17, 8},
531 {UC_ARM64_REG_D18, 8}, {UC_ARM64_REG_D19, 8}, {UC_ARM64_REG_D20, 8}, {UC_ARM64_REG_D21, 8},
532 {UC_ARM64_REG_D22, 8}, {UC_ARM64_REG_D23, 8}, {UC_ARM64_REG_D24, 8}, {UC_ARM64_REG_D25, 8},
533 {UC_ARM64_REG_D26, 8}, {UC_ARM64_REG_D27, 8}, {UC_ARM64_REG_D28, 8}, {UC_ARM64_REG_D29, 8},
534 {UC_ARM64_REG_D30, 8}, {UC_ARM64_REG_D31, 8}, {UC_ARM64_REG_NZCV, 4}, {UC_ARM64_REG_FPCR, 4},
535 {UC_ARM64_REG_FPSR, 4}, {UC_ARM64_REG_PC, 8}, {UC_ARM64_REG_CP_REG, 32}, {UC_ARM64_REG_CPACR_EL1, 4}};
536
538inline std::vector<arion::REG> CTXT_REGS = {
539 UC_ARM64_REG_X0, UC_ARM64_REG_X1, UC_ARM64_REG_X2, UC_ARM64_REG_X3, UC_ARM64_REG_X4, UC_ARM64_REG_X5,
540 UC_ARM64_REG_X6, UC_ARM64_REG_X7, UC_ARM64_REG_X8, UC_ARM64_REG_X9, UC_ARM64_REG_X10, UC_ARM64_REG_X11,
541 UC_ARM64_REG_X12, UC_ARM64_REG_X13, UC_ARM64_REG_X14, UC_ARM64_REG_X15, UC_ARM64_REG_X16, UC_ARM64_REG_X17,
542 UC_ARM64_REG_X18, UC_ARM64_REG_X19, UC_ARM64_REG_X20, UC_ARM64_REG_X21, UC_ARM64_REG_X22, UC_ARM64_REG_X23,
543 UC_ARM64_REG_X24, UC_ARM64_REG_X25, UC_ARM64_REG_X26, UC_ARM64_REG_X27, UC_ARM64_REG_X28, UC_ARM64_REG_X29,
544 UC_ARM64_REG_X30, UC_ARM64_REG_SP, UC_ARM64_REG_PC, UC_ARM64_REG_NZCV, UC_ARM64_REG_FPCR, UC_ARM64_REG_FPSR,
545
546 UC_ARM64_REG_V0, UC_ARM64_REG_V1, UC_ARM64_REG_V2, UC_ARM64_REG_V3, UC_ARM64_REG_V4, UC_ARM64_REG_V5,
547 UC_ARM64_REG_V6, UC_ARM64_REG_V7, UC_ARM64_REG_V8, UC_ARM64_REG_V9, UC_ARM64_REG_V10, UC_ARM64_REG_V11,
548 UC_ARM64_REG_V12, UC_ARM64_REG_V13, UC_ARM64_REG_V14, UC_ARM64_REG_V15, UC_ARM64_REG_V16, UC_ARM64_REG_V17,
549 UC_ARM64_REG_V18, UC_ARM64_REG_V19, UC_ARM64_REG_V20, UC_ARM64_REG_V21, UC_ARM64_REG_V22, UC_ARM64_REG_V23,
550 UC_ARM64_REG_V24, UC_ARM64_REG_V25, UC_ARM64_REG_V26, UC_ARM64_REG_V27, UC_ARM64_REG_V28, UC_ARM64_REG_V29,
551 UC_ARM64_REG_V30, UC_ARM64_REG_V31};
552
554inline std::map<uint64_t, arion::CPU_INTR> IDT = {/*{1, UDEF},
555 {2, SWI},
556 {3, PREFETCH_ABORT},
557 {4, DATA_ABORT},
558 {5, IRQ},
559 {6, FIQ},
560 {7, BKPT},
561 {8, EXCEPTION_EXIT},
562 {9, KERNEL_TRAP},
563 {11, HVC},
564 {12, HYP_TRAP},
565 {13, SMC},
566 {14, VIRQ},
567 {15, VFIQ},
568 {16, SEMIHOST},
569 {17, NOCP},
570 {18, INVSTATE},
571 {19, STKOF},
572 {20, LAZYFP},
573 {21, LSERR},
574 {22, UNALIGNED}*/};
575
577inline arion::ABI_REGISTERS ABI_REGS = arion::ABI_REGISTERS(UC_ARM64_REG_PC, UC_ARM64_REG_SP);
578
581 UC_ARM64_REG_X0, {UC_ARM64_REG_X0, UC_ARM64_REG_X1, UC_ARM64_REG_X2, UC_ARM64_REG_X3, UC_ARM64_REG_X4,
582 UC_ARM64_REG_X5, UC_ARM64_REG_X6, UC_ARM64_REG_X7});
583
586 UC_ARM64_REG_X8, UC_ARM64_REG_X0,
587 {UC_ARM64_REG_X0, UC_ARM64_REG_X1, UC_ARM64_REG_X2, UC_ARM64_REG_X3, UC_ARM64_REG_X4, UC_ARM64_REG_X5});
588
591
593inline uint32_t HWCAP2 = 0;
594
596inline uint32_t HWCAP = 0x78bfafd;
597
599inline const size_t PTR_SZ = 8;
600
602inline const uint16_t ARCH_SZ = 64;
603
606
611
614{
615 private:
622 static void int_hook(std::shared_ptr<arion::Arion> arion, uint32_t intno, void *user_data);
634 void setup() override;
635
636 public:
643
648 ks_engine *curr_ks() override;
653 csh *curr_cs() override;
663 void load_tls(arion::ADDR new_tls) override;
664};
665
666}; // namespace arion_arm64
667
668#endif // ARION_ARCH_ARM64_HPP
Definition arch_manager.hpp:180
ArchManager(std::shared_ptr< ARCH_ATTRIBUTES > attrs, std::map< std::string, REG > arch_regs, std::map< REG, uint8_t > arch_regs_sz, std::vector< REG > ctxt_regs, std::map< uint64_t, CPU_INTR > cpu_idt, bool hooks_intr)
Definition arch_manager.hpp:215
A class responsible for performing architecture specific operations in case of an ARM64 chip emulatio...
Definition arch_arm64.hpp:614
ks_engine * curr_ks() override
static void int_hook(std::shared_ptr< arion::Arion > arion, uint32_t intno, void *user_data)
arion::ADDR dump_tls() override
ArchManagerARM64()
Definition arch_arm64.hpp:640
void load_tls(arion::ADDR new_tls) override
Definition arch_arm64.hpp:9
std::map< std::string, arion::REG > ARCH_REGS
A map identifying a Unicorn ARM64 register given its name.
Definition arch_arm64.hpp:334
arion::ABI_SYSCALLING_CONVENTION ABI_SYSCALLING_CONV
Unicorn ARM64 registers involved in syscalling convention.
Definition arch_arm64.hpp:585
uint32_t HWCAP2
Some well working ARM64 chip HWCAP2 value.
Definition arch_arm64.hpp:593
arion::ABI_REGISTERS ABI_REGS
Unicorn ARM64 PC and SP registers for genericity.
Definition arch_arm64.hpp:577
arion::KERNEL_SEG_FLAGS SEG_FLAGS
ARM64 flags telling the loader which kernel segments should be mapped in memory.
Definition arch_arm64.hpp:590
const size_t PTR_SZ
Size in bytes of a pointer in an ARM64 chip.
Definition arch_arm64.hpp:599
uint32_t HWCAP
Some well working ARM64 chip HWCAP value.
Definition arch_arm64.hpp:596
arion::ABI_CALLING_CONVENTION ABI_CALLING_CONV
Unicorn ARM64 registers involved in calling convention.
Definition arch_arm64.hpp:580
std::map< uint64_t, arion::CPU_INTR > IDT
The ARM64 Interrupt Descriptor Table.
Definition arch_arm64.hpp:554
arion::ARCH_ATTRIBUTES ARCH_ATTRS
Multiple architecture specific attributes for ARM64, grouped in a structure for genericity purpose.
Definition arch_arm64.hpp:608
std::vector< arion::REG > CTXT_REGS
The list of high-level ARM64 registers that make up the context to be saved and restored.
Definition arch_arm64.hpp:538
std::map< arion::REG, uint8_t > ARCH_REGS_SZ
A map identifying a Unicorn ARM64 register size given the register.
Definition arch_arm64.hpp:469
const uint16_t ARCH_SZ
Size in bits of the ARM64 general-purpose registers.
Definition arch_arm64.hpp:602
std::map< uint64_t, std::string > NAME_BY_SYSCALL_NO
A map identifying an ARM64 syscall name given its number.
Definition arch_arm64.hpp:12
arion::CPU_ARCH ARCH
Arion CPU_ARCH for ARM64.
Definition arch_arm64.hpp:605
Definition arch_x86-64.hpp:11
uint64_t ADDR
Identifies a memory address.
Definition global_defs.hpp:36
CPU_ARCH
Identifies a CPU architecture.
Definition global_defs.hpp:128
@ ARM64_ARCH
The ARM64 CPU architecture.
Definition global_defs.hpp:138
uint8_t KERNEL_SEG_FLAGS
Flags telling the loader which architecture specific segments should stand in memory.
Definition arch_manager.hpp:31
Unicorn registers involved in calling convention.
Definition arch_manager.hpp:52
Unicorn PC and SP registers for genericity.
Definition arch_manager.hpp:37
Unicorn registers involved in syscalling convention.
Definition arch_manager.hpp:68
Multiple architecture specific attributes, grouped in a structure for genericity purpose.
Definition arch_manager.hpp:87