Arion 1.0.2-alpha
A high-performance C++ framework for emulating executable binaries.
 
Loading...
Searching...
No Matches
arch_arm.hpp
Go to the documentation of this file.
1#ifndef ARION_ARCH_ARM_HPP
2#define ARION_ARCH_ARM_HPP
3
7#include <cstdint>
8#include <map>
9#include <string>
10
12#define ARION_ARM_MODE 0
14#define ARION_THUMB_MODE 1
16#define ARION_ARM_CPSR_THUMB_BIT (1 << 5)
17
18namespace arion_arm
19{
20
22inline std::map<uint64_t, std::string> NAME_BY_SYSCALL_NO = {{0, "restart_syscall"},
23 {1, "exit"},
24 {2, "fork"},
25 {3, "read"},
26 {4, "write"},
27 {5, "open"},
28 {6, "close"},
29 {8, "creat"},
30 {9, "link"},
31 {10, "unlink"},
32 {11, "execve"},
33 {12, "chdir"},
34 {14, "mknod"},
35 {15, "chmod"},
36 {16, "lchown16"},
37 {19, "lseek"},
38 {20, "getpid"},
39 {21, "mount"},
40 {23, "setuid16"},
41 {24, "getuid16"},
42 {26, "ptrace"},
43 {29, "pause"},
44 {33, "access"},
45 {34, "nice"},
46 {36, "sync"},
47 {37, "kill"},
48 {38, "rename"},
49 {39, "mkdir"},
50 {40, "rmdir"},
51 {41, "dup"},
52 {42, "pipe"},
53 {43, "times"},
54 {45, "brk"},
55 {46, "setgid16"},
56 {47, "getgid16"},
57 {49, "geteuid16"},
58 {50, "getegid16"},
59 {51, "acct"},
60 {52, "umount"},
61 {54, "ioctl"},
62 {55, "fcntl"},
63 {57, "setpgid"},
64 {60, "umask"},
65 {61, "chroot"},
66 {62, "ustat"},
67 {63, "dup2"},
68 {64, "getppid"},
69 {65, "getpgrp"},
70 {66, "setsid"},
71 {67, "sigaction"},
72 {70, "setreuid16"},
73 {71, "setregid16"},
74 {72, "sigsuspend"},
75 {73, "sigpending"},
76 {74, "sethostname"},
77 {75, "setrlimit"},
78 {77, "getrusage"},
79 {78, "gettimeofday"},
80 {79, "settimeofday"},
81 {80, "getgroups16"},
82 {81, "setgroups16"},
83 {83, "symlink"},
84 {85, "readlink"},
85 {86, "uselib"},
86 {87, "swapon"},
87 {88, "reboot"},
88 {91, "munmap"},
89 {92, "truncate"},
90 {93, "ftruncate"},
91 {94, "fchmod"},
92 {95, "fchown16"},
93 {96, "getpriority"},
94 {97, "setpriority"},
95 {99, "statfs"},
96 {100, "fstatfs"},
97 {103, "syslog"},
98 {104, "setitimer"},
99 {105, "getitimer"},
100 {106, "newstat"},
101 {107, "newlstat"},
102 {108, "newfstat"},
103 {111, "vhangup"},
104 {114, "wait4"},
105 {115, "swapoff"},
106 {116, "sysinfo"},
107 {118, "fsync"},
108 {119, "sigreturn"},
109 {120, "clone"},
110 {121, "setdomainname"},
111 {122, "newuname"},
112 {124, "adjtimex"},
113 {125, "mprotect"},
114 {126, "sigprocmask"},
115 {128, "init_module"},
116 {129, "delete_module"},
117 {131, "quotactl"},
118 {132, "getpgid"},
119 {133, "fchdir"},
120 {135, "sysfs"},
121 {136, "personality"},
122 {138, "setfsuid16"},
123 {139, "setfsgid16"},
124 {140, "llseek"},
125 {141, "getdents"},
126 {142, "select"},
127 {143, "flock"},
128 {144, "msync"},
129 {145, "readv"},
130 {146, "writev"},
131 {147, "getsid"},
132 {148, "fdatasync"},
133 {150, "mlock"},
134 {151, "munlock"},
135 {152, "mlockall"},
136 {153, "munlockall"},
137 {154, "sched_setparam"},
138 {155, "sched_getparam"},
139 {156, "sched_setscheduler"},
140 {157, "sched_getscheduler"},
141 {158, "sched_yield"},
142 {159, "sched_get_priority_max"},
143 {160, "sched_get_priority_min"},
144 {161, "sched_rr_get_interval"},
145 {162, "nanosleep"},
146 {163, "mremap"},
147 {164, "setresuid16"},
148 {165, "getresuid16"},
149 {168, "poll"},
150 {170, "setresgid16"},
151 {171, "getresgid16"},
152 {172, "prctl"},
153 {173, "rt_sigreturn"},
154 {174, "rt_sigaction"},
155 {175, "rt_sigprocmask"},
156 {176, "rt_sigpending"},
157 {177, "rt_sigtimedwait"},
158 {178, "rt_sigqueueinfo"},
159 {179, "rt_sigsuspend"},
160 {180, "pread64"},
161 {181, "pwrite64"},
162 {182, "chown16"},
163 {183, "getcwd"},
164 {184, "capget"},
165 {185, "capset"},
166 {186, "sigaltstack"},
167 {187, "sendfile"},
168 {190, "vfork"},
169 {191, "getrlimit"},
170 {192, "mmap2"},
171 {193, "truncate64"},
172 {194, "ftruncate64"},
173 {195, "stat64"},
174 {196, "lstat64"},
175 {197, "fstat64"},
176 {198, "lchown"},
177 {199, "getuid"},
178 {200, "getgid"},
179 {201, "geteuid"},
180 {202, "getegid"},
181 {203, "setreuid"},
182 {204, "setregid"},
183 {205, "getgroups"},
184 {206, "setgroups"},
185 {207, "fchown"},
186 {208, "setresuid"},
187 {209, "getresuid"},
188 {210, "setresgid"},
189 {211, "getresgid"},
190 {212, "chown"},
191 {213, "setuid"},
192 {214, "setgid"},
193 {215, "setfsuid"},
194 {216, "setfsgid"},
195 {217, "getdents64"},
196 {218, "pivot_root"},
197 {219, "mincore"},
198 {220, "madvise"},
199 {221, "fcntl64"},
200 {224, "gettid"},
201 {225, "readahead"},
202 {226, "setxattr"},
203 {227, "lsetxattr"},
204 {228, "fsetxattr"},
205 {229, "getxattr"},
206 {230, "lgetxattr"},
207 {231, "fgetxattr"},
208 {232, "listxattr"},
209 {233, "llistxattr"},
210 {234, "flistxattr"},
211 {235, "removexattr"},
212 {236, "lremovexattr"},
213 {237, "fremovexattr"},
214 {238, "tkill"},
215 {239, "sendfile64"},
216 {240, "futex"},
217 {241, "sched_setaffinity"},
218 {242, "sched_getaffinity"},
219 {243, "io_setup"},
220 {244, "io_destroy"},
221 {245, "io_getevents"},
222 {246, "io_submit"},
223 {247, "io_cancel"},
224 {248, "exit_group"},
225 {250, "epoll_create"},
226 {251, "epoll_ctl"},
227 {252, "epoll_wait"},
228 {253, "remap_file_pages"},
229 {256, "set_tid_address"},
230 {257, "timer_create"},
231 {258, "timer_settime"},
232 {259, "timer_gettime"},
233 {260, "timer_getoverrun"},
234 {261, "timer_delete"},
235 {262, "clock_settime"},
236 {263, "clock_gettime"},
237 {264, "clock_getres"},
238 {265, "clock_nanosleep"},
239 {266, "statfs64"},
240 {267, "fstatfs64"},
241 {268, "tgkill"},
242 {269, "utimes"},
243 {270, "fadvise64_64"},
244 {272, "pciconfig_read"},
245 {273, "pciconfig_write"},
246 {274, "mq_open"},
247 {275, "mq_unlink"},
248 {276, "mq_timedsend"},
249 {277, "mq_timedreceive"},
250 {278, "mq_notify"},
251 {279, "mq_getsetattr"},
252 {280, "waitid"},
253 {281, "socket"},
254 {282, "bind"},
255 {283, "connect"},
256 {284, "listen"},
257 {285, "accept"},
258 {286, "getsockname"},
259 {287, "getpeername"},
260 {288, "socketpair"},
261 {289, "send"},
262 {290, "sendto"},
263 {291, "recv"},
264 {292, "recvfrom"},
265 {293, "shutdown"},
266 {294, "setsockopt"},
267 {295, "getsockopt"},
268 {296, "sendmsg"},
269 {297, "recvmsg"},
270 {298, "semop"},
271 {299, "semget"},
272 {300, "semctl"},
273 {301, "msgsnd"},
274 {302, "msgrcv"},
275 {303, "msgget"},
276 {304, "msgctl"},
277 {305, "shmat"},
278 {306, "shmdt"},
279 {307, "shmget"},
280 {308, "shmctl"},
281 {309, "add_key"},
282 {310, "request_key"},
283 {311, "keyctl"},
284 {312, "semtimedop"},
285 {314, "ioprio_set"},
286 {315, "ioprio_get"},
287 {316, "inotify_init"},
288 {317, "inotify_add_watch"},
289 {318, "inotify_rm_watch"},
290 {322, "openat"},
291 {323, "mkdirat"},
292 {324, "mknodat"},
293 {325, "fchownat"},
294 {326, "futimesat"},
295 {327, "fstatat64"},
296 {328, "unlinkat"},
297 {329, "renameat"},
298 {330, "linkat"},
299 {331, "symlinkat"},
300 {332, "readlinkat"},
301 {333, "fchmodat"},
302 {334, "faccessat"},
303 {335, "pselect6"},
304 {336, "ppoll"},
305 {337, "unshare"},
306 {338, "set_robust_list"},
307 {339, "get_robust_list"},
308 {340, "splice"},
309 {341, "sync_file_range2"},
310 {342, "tee"},
311 {343, "vmsplice"},
312 {345, "getcpu"},
313 {346, "epoll_pwait"},
314 {347, "kexec_load"},
315 {348, "utimensat"},
316 {349, "signalfd"},
317 {350, "timerfd_create"},
318 {351, "eventfd"},
319 {352, "fallocate"},
320 {353, "timerfd_settime"},
321 {354, "timerfd_gettime"},
322 {355, "signalfd4"},
323 {356, "eventfd2"},
324 {357, "epoll_create1"},
325 {358, "dup3"},
326 {359, "pipe2"},
327 {360, "inotify_init1"},
328 {361, "preadv"},
329 {362, "pwritev"},
330 {363, "rt_tgsigqueueinfo"},
331 {364, "perf_event_open"},
332 {365, "recvmmsg"},
333 {366, "accept4"},
334 {367, "fanotify_init"},
335 {368, "fanotify_mark"},
336 {369, "prlimit64"},
337 {370, "name_to_handle_at"},
338 {371, "open_by_handle_at"},
339 {372, "clock_adjtime"},
340 {373, "syncfs"},
341 {374, "sendmmsg"},
342 {375, "setns"},
343 {376, "process_vm_readv"},
344 {377, "process_vm_writev"},
345 {378, "kcmp"},
346 {379, "finit_module"},
347 {380, "sched_setattr"},
348 {381, "sched_getattr"},
349 {382, "renameat2"},
350 {383, "seccomp"},
351 {384, "getrandom"},
352 {385, "memfd_create"},
353 {386, "bpf"},
354 {387, "execveat"},
355 {388, "userfaultfd"},
356 {389, "membarrier"},
357 {390, "mlock2"},
358 {391, "copy_file_range"},
359 {392, "preadv2"},
360 {393, "pwritev2"},
361 {397, "statx"},
362 {398, "rseq"},
363 {399, "io_pgetevents"},
364 {403, "clock_gettime"},
365 {404, "clock_settime"},
366 {405, "clock_adjtime"},
367 {406, "clock_getres"},
368 {407, "clock_nanosleep"},
369 {408, "timer_gettime"},
370 {409, "timer_settime"},
371 {410, "timerfd_gettime"},
372 {411, "timerfd_settime"},
373 {412, "utimensat"},
374 {413, "pselect6"},
375 {414, "ppoll"},
376 {416, "io_pgetevents"},
377 {417, "recvmmsg"},
378 {418, "mq_timedsend"},
379 {419, "mq_timedreceive"},
380 {420, "semtimedop"},
381 {421, "rt_sigtimedwait"},
382 {422, "futex_time64"},
383 {423, "sched_rr_get_interval"},
384 {424, "pidfd_send_signal"},
385 {425, "io_uring_setup"},
386 {426, "io_uring_enter"},
387 {427, "io_uring_register"},
388 {428, "open_tree"},
389 {429, "move_mount"},
390 {430, "fsopen"},
391 {431, "fsconfig"},
392 {432, "fsmount"},
393 {433, "fspick"},
394 {434, "pidfd_open"},
395 {435, "clone3"},
396 {436, "close_range"},
397 {437, "openat2"},
398 {438, "pidfd_getfd"},
399 {439, "faccessat2"},
400 {440, "process_madvise"},
401 {441, "epoll_pwait2"},
402 {442, "mount_setattr"},
403 {443, "quotactl_fd"},
404 {444, "landlock_create_ruleset"},
405 {445, "landlock_add_rule"},
406 {446, "landlock_restrict_self"},
407 {448, "process_mrelease"},
408 {449, "futex_waitv"},
409 {451, "cachestat"},
410 {452, "fchmodat2"},
411 {454, "futex_wake"},
412 {455, "futex_wait"},
413 {456, "futex_requeue"},
414 {457, "statmount"},
415 {458, "listmount"},
416 {459, "lsm_get_self_attr"},
417 {460, "lsm_set_self_attr"},
418 {461, "lsm_list_modules"},
419 {463, "setxattrat"},
420 {464, "getxattrat"},
421 {465, "listxattrat"},
422 {466, "removexattrat"},
423 {983041, "breakpoint"},
424 {983042, "cacheflush"},
425 {983043, "usr26"},
426 {983044, "usr32"},
427 {983045, "set_tls"},
428 {983046, "get_tls"}};
429
431inline std::map<std::string, arion::REG> ARCH_REGS = {{"APSR", UC_ARM_REG_APSR},
432 {"APSR_NZCV", UC_ARM_REG_APSR_NZCV},
433 {"CPSR", UC_ARM_REG_CPSR},
434 {"FPEXC", UC_ARM_REG_FPEXC},
435 {"FPSCR", UC_ARM_REG_FPSCR},
436 {"FPSID", UC_ARM_REG_FPSID},
437 {"LR", UC_ARM_REG_LR},
438 {"PC", UC_ARM_REG_PC},
439 {"SP", UC_ARM_REG_SP},
440 {"SPSR", UC_ARM_REG_SPSR},
441 {"D0", UC_ARM_REG_D0},
442 {"D1", UC_ARM_REG_D1},
443 {"D2", UC_ARM_REG_D2},
444 {"D3", UC_ARM_REG_D3},
445 {"D4", UC_ARM_REG_D4},
446 {"D5", UC_ARM_REG_D5},
447 {"D6", UC_ARM_REG_D6},
448 {"D7", UC_ARM_REG_D7},
449 {"D8", UC_ARM_REG_D8},
450 {"D9", UC_ARM_REG_D9},
451 {"D10", UC_ARM_REG_D10},
452 {"D11", UC_ARM_REG_D11},
453 {"D12", UC_ARM_REG_D12},
454 {"D13", UC_ARM_REG_D13},
455 {"D14", UC_ARM_REG_D14},
456 {"D15", UC_ARM_REG_D15},
457 {"D16", UC_ARM_REG_D16},
458 {"D17", UC_ARM_REG_D17},
459 {"D18", UC_ARM_REG_D18},
460 {"D19", UC_ARM_REG_D19},
461 {"D20", UC_ARM_REG_D20},
462 {"D21", UC_ARM_REG_D21},
463 {"D22", UC_ARM_REG_D22},
464 {"D23", UC_ARM_REG_D23},
465 {"D24", UC_ARM_REG_D24},
466 {"D25", UC_ARM_REG_D25},
467 {"D26", UC_ARM_REG_D26},
468 {"D27", UC_ARM_REG_D27},
469 {"D28", UC_ARM_REG_D28},
470 {"D29", UC_ARM_REG_D29},
471 {"D30", UC_ARM_REG_D30},
472 {"D31", UC_ARM_REG_D31},
473 {"Q0", UC_ARM_REG_Q0},
474 {"Q1", UC_ARM_REG_Q1},
475 {"Q2", UC_ARM_REG_Q2},
476 {"Q3", UC_ARM_REG_Q3},
477 {"Q4", UC_ARM_REG_Q4},
478 {"Q5", UC_ARM_REG_Q5},
479 {"Q6", UC_ARM_REG_Q6},
480 {"Q7", UC_ARM_REG_Q7},
481 {"Q8", UC_ARM_REG_Q8},
482 {"Q9", UC_ARM_REG_Q9},
483 {"Q10", UC_ARM_REG_Q10},
484 {"Q11", UC_ARM_REG_Q11},
485 {"Q12", UC_ARM_REG_Q12},
486 {"Q13", UC_ARM_REG_Q13},
487 {"Q14", UC_ARM_REG_Q14},
488 {"Q15", UC_ARM_REG_Q15},
489 {"R0", UC_ARM_REG_R0},
490 {"R1", UC_ARM_REG_R1},
491 {"R2", UC_ARM_REG_R2},
492 {"R3", UC_ARM_REG_R3},
493 {"R4", UC_ARM_REG_R4},
494 {"R5", UC_ARM_REG_R5},
495 {"R6", UC_ARM_REG_R6},
496 {"R7", UC_ARM_REG_R7},
497 {"R8", UC_ARM_REG_R8},
498 {"R9", UC_ARM_REG_R9},
499 {"R10", UC_ARM_REG_R10},
500 {"R11", UC_ARM_REG_R11},
501 {"R12", UC_ARM_REG_R12},
502 {"S0", UC_ARM_REG_S0},
503 {"S1", UC_ARM_REG_S1},
504 {"S2", UC_ARM_REG_S2},
505 {"S3", UC_ARM_REG_S3},
506 {"S4", UC_ARM_REG_S4},
507 {"S5", UC_ARM_REG_S5},
508 {"S6", UC_ARM_REG_S6},
509 {"S7", UC_ARM_REG_S7},
510 {"S8", UC_ARM_REG_S8},
511 {"S9", UC_ARM_REG_S9},
512 {"S10", UC_ARM_REG_S10},
513 {"S11", UC_ARM_REG_S11},
514 {"S12", UC_ARM_REG_S12},
515 {"S13", UC_ARM_REG_S13},
516 {"S14", UC_ARM_REG_S14},
517 {"S15", UC_ARM_REG_S15},
518 {"S16", UC_ARM_REG_S16},
519 {"S17", UC_ARM_REG_S17},
520 {"S18", UC_ARM_REG_S18},
521 {"S19", UC_ARM_REG_S19},
522 {"S20", UC_ARM_REG_S20},
523 {"S21", UC_ARM_REG_S21},
524 {"S22", UC_ARM_REG_S22},
525 {"S23", UC_ARM_REG_S23},
526 {"S24", UC_ARM_REG_S24},
527 {"S25", UC_ARM_REG_S25},
528 {"S26", UC_ARM_REG_S26},
529 {"S27", UC_ARM_REG_S27},
530 {"S28", UC_ARM_REG_S28},
531 {"S29", UC_ARM_REG_S29},
532 {"S30", UC_ARM_REG_S30},
533 {"S31", UC_ARM_REG_S31},
534 {"IPSR", UC_ARM_REG_IPSR},
535 {"MSP", UC_ARM_REG_MSP},
536 {"PSP", UC_ARM_REG_PSP},
537 {"CONTROL", UC_ARM_REG_CONTROL},
538 {"IAPSR", UC_ARM_REG_IAPSR},
539 {"EAPSR", UC_ARM_REG_EAPSR},
540 {"XPSR", UC_ARM_REG_XPSR},
541 {"EPSR", UC_ARM_REG_EPSR},
542 {"IEPSR", UC_ARM_REG_IEPSR},
543 {"PRIMASK", UC_ARM_REG_PRIMASK},
544 {"BASEPRI", UC_ARM_REG_BASEPRI},
545 {"BASEPRI_MAX", UC_ARM_REG_BASEPRI_MAX},
546 {"FAULTMASK", UC_ARM_REG_FAULTMASK},
547 {"CP", UC_ARM_REG_CP_REG},
548 {"R13", UC_ARM_REG_R13},
549 {"R14", UC_ARM_REG_R14},
550 {"R15", UC_ARM_REG_R15},
551 {"SB", UC_ARM_REG_SB},
552 {"SL", UC_ARM_REG_SL},
553 {"FP", UC_ARM_REG_FP},
554 {"IP", UC_ARM_REG_IP}};
555
557inline std::map<arion::REG, uint8_t> ARCH_REGS_SZ = {
558 {UC_ARM_REG_R0, 4}, {UC_ARM_REG_R1, 4}, {UC_ARM_REG_R2, 4}, {UC_ARM_REG_R3, 4},
559 {UC_ARM_REG_R4, 4}, {UC_ARM_REG_R5, 4}, {UC_ARM_REG_R6, 4}, {UC_ARM_REG_R7, 4},
560 {UC_ARM_REG_R8, 4}, {UC_ARM_REG_R9, 4}, {UC_ARM_REG_R10, 4}, {UC_ARM_REG_R11, 4},
561 {UC_ARM_REG_R12, 4}, {UC_ARM_REG_R13, 4}, {UC_ARM_REG_R14, 4}, {UC_ARM_REG_R15, 4},
562 {UC_ARM_REG_SP, 4}, {UC_ARM_REG_LR, 4}, {UC_ARM_REG_PC, 4}, {UC_ARM_REG_SPSR, 4},
563 {UC_ARM_REG_APSR, 4}, {UC_ARM_REG_APSR_NZCV, 4}, {UC_ARM_REG_CPSR, 4}, {UC_ARM_REG_FPSCR, 4},
564 {UC_ARM_REG_FPEXC, 4}, {UC_ARM_REG_FPSID, 4}, {UC_ARM_REG_IPSR, 4}, {UC_ARM_REG_IAPSR, 4},
565 {UC_ARM_REG_EAPSR, 4}, {UC_ARM_REG_XPSR, 4}, {UC_ARM_REG_EPSR, 4}, {UC_ARM_REG_IEPSR, 4},
566 {UC_ARM_REG_MSP, 4}, {UC_ARM_REG_PSP, 4}, {UC_ARM_REG_CONTROL, 4}, {UC_ARM_REG_PRIMASK, 4},
567 {UC_ARM_REG_BASEPRI, 4}, {UC_ARM_REG_BASEPRI_MAX, 4}, {UC_ARM_REG_FAULTMASK, 4}, {UC_ARM_REG_S0, 4},
568 {UC_ARM_REG_S1, 4}, {UC_ARM_REG_S2, 4}, {UC_ARM_REG_S3, 4}, {UC_ARM_REG_S4, 4},
569 {UC_ARM_REG_S5, 4}, {UC_ARM_REG_S6, 4}, {UC_ARM_REG_S7, 4}, {UC_ARM_REG_S8, 4},
570 {UC_ARM_REG_S9, 4}, {UC_ARM_REG_S10, 4}, {UC_ARM_REG_S11, 4}, {UC_ARM_REG_S12, 4},
571 {UC_ARM_REG_S13, 4}, {UC_ARM_REG_S14, 4}, {UC_ARM_REG_S15, 4}, {UC_ARM_REG_S16, 4},
572 {UC_ARM_REG_S17, 4}, {UC_ARM_REG_S18, 4}, {UC_ARM_REG_S19, 4}, {UC_ARM_REG_S20, 4},
573 {UC_ARM_REG_S21, 4}, {UC_ARM_REG_S22, 4}, {UC_ARM_REG_S23, 4}, {UC_ARM_REG_S24, 4},
574 {UC_ARM_REG_S25, 4}, {UC_ARM_REG_S26, 4}, {UC_ARM_REG_S27, 4}, {UC_ARM_REG_S28, 4},
575 {UC_ARM_REG_S29, 4}, {UC_ARM_REG_S30, 4}, {UC_ARM_REG_S31, 4}, {UC_ARM_REG_D0, 8},
576 {UC_ARM_REG_D1, 8}, {UC_ARM_REG_D2, 8}, {UC_ARM_REG_D3, 8}, {UC_ARM_REG_D4, 8},
577 {UC_ARM_REG_D5, 8}, {UC_ARM_REG_D6, 8}, {UC_ARM_REG_D7, 8}, {UC_ARM_REG_D8, 8},
578 {UC_ARM_REG_D9, 8}, {UC_ARM_REG_D10, 8}, {UC_ARM_REG_D11, 8}, {UC_ARM_REG_D12, 8},
579 {UC_ARM_REG_D13, 8}, {UC_ARM_REG_D14, 8}, {UC_ARM_REG_D15, 8}, {UC_ARM_REG_D16, 8},
580 {UC_ARM_REG_D17, 8}, {UC_ARM_REG_D18, 8}, {UC_ARM_REG_D19, 8}, {UC_ARM_REG_D20, 8},
581 {UC_ARM_REG_D21, 8}, {UC_ARM_REG_D22, 8}, {UC_ARM_REG_D23, 8}, {UC_ARM_REG_D24, 8},
582 {UC_ARM_REG_D25, 8}, {UC_ARM_REG_D26, 8}, {UC_ARM_REG_D27, 8}, {UC_ARM_REG_D28, 8},
583 {UC_ARM_REG_D29, 8}, {UC_ARM_REG_D30, 8}, {UC_ARM_REG_D31, 8}, {UC_ARM_REG_Q0, 16},
584 {UC_ARM_REG_Q1, 16}, {UC_ARM_REG_Q2, 16}, {UC_ARM_REG_Q3, 16}, {UC_ARM_REG_Q4, 16},
585 {UC_ARM_REG_Q5, 16}, {UC_ARM_REG_Q6, 16}, {UC_ARM_REG_Q7, 16}, {UC_ARM_REG_Q8, 16},
586 {UC_ARM_REG_Q9, 16}, {UC_ARM_REG_Q10, 16}, {UC_ARM_REG_Q11, 16}, {UC_ARM_REG_Q12, 16},
587 {UC_ARM_REG_Q13, 16}, {UC_ARM_REG_Q14, 16}, {UC_ARM_REG_Q15, 16}, {UC_ARM_REG_CP_REG, 36}};
588
590inline std::vector<arion::REG> CTXT_REGS = {
591 UC_ARM_REG_R0, UC_ARM_REG_R1, UC_ARM_REG_R2, UC_ARM_REG_R3, UC_ARM_REG_R4, UC_ARM_REG_R5,
592 UC_ARM_REG_R6, UC_ARM_REG_R7, UC_ARM_REG_R8, UC_ARM_REG_R9, UC_ARM_REG_R10, UC_ARM_REG_R11,
593 UC_ARM_REG_R12, UC_ARM_REG_SP, UC_ARM_REG_LR, UC_ARM_REG_PC, UC_ARM_REG_SB, UC_ARM_REG_SL,
594 UC_ARM_REG_FP, UC_ARM_REG_IP, UC_ARM_REG_Q0, UC_ARM_REG_Q1, UC_ARM_REG_Q2, UC_ARM_REG_Q3,
595 UC_ARM_REG_Q4, UC_ARM_REG_Q5, UC_ARM_REG_Q6, UC_ARM_REG_Q7, UC_ARM_REG_Q8, UC_ARM_REG_Q9,
596 UC_ARM_REG_Q10, UC_ARM_REG_Q11, UC_ARM_REG_Q12, UC_ARM_REG_Q13, UC_ARM_REG_Q14, UC_ARM_REG_Q15,
597 UC_ARM_REG_CPSR, UC_ARM_REG_APSR, UC_ARM_REG_SPSR, UC_ARM_REG_FPSCR, UC_ARM_REG_IPSR, UC_ARM_REG_CONTROL,
598 UC_ARM_REG_PRIMASK, UC_ARM_REG_BASEPRI, UC_ARM_REG_FAULTMASK};
599
601inline std::map<uint64_t, arion::CPU_INTR> IDT = {/*{1, UDEF},
602 {2, SWI},
603 {3, PREFETCH_ABORT},
604 {4, DATA_ABORT},
605 {5, IRQ},
606 {6, FIQ},
607 {7, BKPT},
608 {8, EXCEPTION_EXIT},
609 {9, KERNEL_TRAP},
610 {11, HVC},
611 {12, HYP_TRAP},
612 {13, SMC},
613 {14, VIRQ},
614 {15, VFIQ},
615 {16, SEMIHOST},
616 {17, NOCP},
617 {18, INVSTATE},
618 {19, STKOF},
619 {20, LAZYFP},
620 {21, LSERR},
621 {22, UNALIGNED}*/};
622
624inline arion::ABI_REGISTERS ABI_REGS = arion::ABI_REGISTERS(UC_ARM_REG_PC, UC_ARM_REG_SP);
625
628 arion::ABI_CALLING_CONVENTION(UC_ARM_REG_R0, {UC_ARM_REG_R0, UC_ARM_REG_R1, UC_ARM_REG_R2, UC_ARM_REG_R3});
629
632 UC_ARM_REG_R7, UC_ARM_REG_R0,
633 {UC_ARM_REG_R0, UC_ARM_REG_R1, UC_ARM_REG_R2, UC_ARM_REG_R3, UC_ARM_REG_R4, UC_ARM_REG_R5, UC_ARM_REG_R6});
634
637
639inline uint32_t HWCAP2 = 0;
640
642inline uint32_t HWCAP = 0x001fb8d7;
643
645inline const size_t PTR_SZ = 4;
646
648inline const uint16_t ARCH_SZ = 32;
649
652
657
660{
661 private:
668 static void int_hook(std::shared_ptr<arion::Arion> arion, uint32_t intno, void *user_data);
673 bool is_thumb();
681 void setup() override;
682
683 public:
688 : ArchManager(std::make_shared<arion::ARCH_ATTRIBUTES>(arion_arm::ARCH_ATTRS), arion_arm::ARCH_REGS,
690
695 ks_engine *curr_ks() override;
700 csh *curr_cs() override;
710 void load_tls(arion::ADDR new_tls) override;
715 void prerun_hook(arion::ADDR &start) override;
716};
717
718}; // namespace arion_arm
719
720#endif // ARION_ARCH_ARM_HPP
#define ARION_ARM_TRAPS_PRESENT
If this flag is set, the loader will map the ARM_TRAPS segment.
Definition arch_manager.hpp:23
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 ARM chip emulation.
Definition arch_arm.hpp:660
ks_engine * curr_ks() override
static void int_hook(std::shared_ptr< arion::Arion > arion, uint32_t intno, void *user_data)
void prerun_hook(arion::ADDR &start) override
void load_tls(arion::ADDR new_tls) override
csh * curr_cs() override
arion::ADDR dump_tls() override
ArchManagerARM()
Definition arch_arm.hpp:687
Definition arch_arm.hpp:19
arion::KERNEL_SEG_FLAGS SEG_FLAGS
ARM flags telling the loader which kernel segments should be mapped in memory.
Definition arch_arm.hpp:636
arion::ABI_CALLING_CONVENTION ABI_CALLING_CONV
Unicorn ARM registers involved in calling convention.
Definition arch_arm.hpp:627
arion::ABI_SYSCALLING_CONVENTION ABI_SYSCALLING_CONV
Unicorn ARM registers involved in syscalling convention.
Definition arch_arm.hpp:631
uint32_t HWCAP2
Some well working ARM chip HWCAP2 value.
Definition arch_arm.hpp:639
arion::CPU_ARCH ARCH
Arion CPU_ARCH for ARM.
Definition arch_arm.hpp:651
arion::ABI_REGISTERS ABI_REGS
Unicorn ARM PC and SP registers for genericity.
Definition arch_arm.hpp:624
std::map< uint64_t, arion::CPU_INTR > IDT
The ARM Interrupt Descriptor Table.
Definition arch_arm.hpp:601
const size_t PTR_SZ
Size in bytes of a pointer in an ARM chip.
Definition arch_arm.hpp:645
std::map< std::string, arion::REG > ARCH_REGS
A map identifying a Unicorn ARM register given its name.
Definition arch_arm.hpp:431
uint32_t HWCAP
Some well working ARM chip HWCAP value.
Definition arch_arm.hpp:642
std::vector< arion::REG > CTXT_REGS
The list of high-level ARM registers that make up the context to be saved and restored.
Definition arch_arm.hpp:590
std::map< uint64_t, std::string > NAME_BY_SYSCALL_NO
A map identifying an ARM syscall name given its number.
Definition arch_arm.hpp:22
arion::ARCH_ATTRIBUTES ARCH_ATTRS
Multiple architecture specific attributes for ARM, grouped in a structure for genericity purpose.
Definition arch_arm.hpp:654
std::map< arion::REG, uint8_t > ARCH_REGS_SZ
A map identifying a Unicorn ARM register size given the register.
Definition arch_arm.hpp:557
const uint16_t ARCH_SZ
Size in bits of the ARM general-purpose registers.
Definition arch_arm.hpp:648
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
@ ARM_ARCH
The ARM CPU architecture.
Definition global_defs.hpp:136
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