Arion 1.0.2-alpha
A high-performance C++ framework for emulating executable binaries.
 
Loading...
Searching...
No Matches
lnx_arch_arm.hpp
Go to the documentation of this file.
1#ifndef ARION_LNX_ARCH_ARM_HPP
2#define ARION_LNX_ARCH_ARM_HPP
3
7
8namespace arion_lnx_arm
9{
10
12struct pt_regs
13{
15 unsigned long uregs[18];
16};
17
19inline std::vector<arion::REG> uc_pt_regs = {
20 UC_ARM_REG_R0, UC_ARM_REG_R1, UC_ARM_REG_R2, UC_ARM_REG_R3, UC_ARM_REG_R4, UC_ARM_REG_R5,
21 UC_ARM_REG_R6, UC_ARM_REG_R7, UC_ARM_REG_R8, UC_ARM_REG_R9, UC_ARM_REG_R10, UC_ARM_REG_FP,
22 UC_ARM_REG_IP, UC_ARM_REG_SP, UC_ARM_REG_LR, UC_ARM_REG_PC, UC_ARM_REG_CPSR, UC_ARM_REG_INVALID};
23
25const size_t ELF_NGREG = (sizeof(struct pt_regs) / sizeof(arion_lnx_type::elf_greg_t));
28
39
41struct fp_reg
42{
44 unsigned int sign1 : 1;
46 unsigned int unused : 15;
48 unsigned int sign2 : 1;
50 unsigned int exponent : 14;
52 unsigned int j : 1;
54 unsigned int mantissa1 : 31;
56 unsigned int mantissa0 : 32;
57};
58
60struct user_fp
61{
63 struct fp_reg fpregs[8];
65 unsigned int fpsr : 32;
67 unsigned int fpcr : 32;
69 unsigned char ftype[8];
71 unsigned int init_flag;
72};
73
75inline std::vector<arion::REG> uc_fp_regs = {UC_ARM_REG_D0, UC_ARM_REG_D1, UC_ARM_REG_D2, UC_ARM_REG_D3,
76 UC_ARM_REG_D4, UC_ARM_REG_D5, UC_ARM_REG_D6, UC_ARM_REG_D7};
77
79typedef struct user_fp elf_fpregset_t;
80
83{
84 private:
91 uint64_t pack_fp_reg(const struct arion_lnx_arm::fp_reg *r);
97 std::map<arion::REG, arion::RVAL> prstatus_to_regs(std::vector<arion::BYTE> prstatus) override;
103 std::map<arion::REG, arion::RVAL> fpregset_to_regs(std::vector<arion::BYTE> fpregset) override;
104};
105
106}; // namespace arion_lnx_arm
107
108#endif // ARION_LNX_ARCH_ARM_HPP
Abstract base class for managing Linux architecture-specific details, particularly for core dump pars...
Definition lnx_arch_manager.hpp:28
A class responsible for performing architecture specific operations in case of an ARM chip emulation.
Definition arch_arm.hpp:660
Linux ARM architecture manager class for Arion.
Definition lnx_arch_arm.hpp:83
std::map< arion::REG, arion::RVAL > fpregset_to_regs(std::vector< arion::BYTE > fpregset) override
std::map< arion::REG, arion::RVAL > prstatus_to_regs(std::vector< arion::BYTE > prstatus) override
uint64_t pack_fp_reg(const struct arion_lnx_arm::fp_reg *r)
Definition lnx_arch_arm.hpp:9
std::vector< arion::REG > uc_pt_regs
A vector mapping the Linux pt_regs structure indices to ARION's universal register enumeration (arion...
Definition lnx_arch_arm.hpp:19
arion_lnx_type::elf_greg_t elf_gregset_t[ELF_NGREG]
Definition of the general-purpose register set type for ELF notes.
Definition lnx_arch_arm.hpp:27
std::vector< arion::REG > uc_fp_regs
A vector mapping the FPU registers to ARION's universal register enumeration (arion::REG).
Definition lnx_arch_arm.hpp:75
const size_t ELF_NGREG
The number of 32-bit words (general registers) in the pt_regs structure, used for ELF notes.
Definition lnx_arch_arm.hpp:25
Definition lnx_kernel_utils.hpp:16
unsigned long elf_greg_t
Type definition for a single general-purpose register value in an ELF core dump.
Definition lnx_kernel_utils.hpp:100
Structure for a process status ELF note (NT_PRSTATUS) for ARM, containing general registers.
Definition lnx_arch_arm.hpp:31
elf_gregset_t pr_reg
The general-purpose registers captured.
Definition lnx_arch_arm.hpp:35
int pr_fpvalid
Flag indicating whether floating-point registers are valid.
Definition lnx_arch_arm.hpp:37
Structure representing a single ARM floating-point register (double-precision format).
Definition lnx_arch_arm.hpp:42
unsigned int unused
Unused bits.
Definition lnx_arch_arm.hpp:46
unsigned int mantissa0
Low 32 bits of the mantissa.
Definition lnx_arch_arm.hpp:56
unsigned int sign2
Sign bit of the exponent.
Definition lnx_arch_arm.hpp:48
unsigned int mantissa1
High 31 bits of the mantissa.
Definition lnx_arch_arm.hpp:54
unsigned int j
Integer bit in normalized representation.
Definition lnx_arch_arm.hpp:52
unsigned int exponent
Exponent part.
Definition lnx_arch_arm.hpp:50
unsigned int sign1
Sign bit of the mantissa.
Definition lnx_arch_arm.hpp:44
Structure represents the ARM processor's register state as saved on the stack by the Linux kernel.
Definition lnx_arch_arm.hpp:13
unsigned long uregs[18]
Array containing the core general-purpose and system registers (R0-R15, SP, LR, PC,...
Definition lnx_arch_arm.hpp:15
Structure representing the ARM floating-point unit (FPU) context as saved in the user area.
Definition lnx_arch_arm.hpp:61
struct fp_reg fpregs[8]
Array of 8 double-precision floating-point registers (D0-D7).
Definition lnx_arch_arm.hpp:63
unsigned int init_flag
Initialization flag for the FPU context.
Definition lnx_arch_arm.hpp:71
unsigned int fpcr
Floating-Point Control Register.
Definition lnx_arch_arm.hpp:67
unsigned int fpsr
Floating-Point Status Register.
Definition lnx_arch_arm.hpp:65
unsigned char ftype[8]
Array of floating-point type markers.
Definition lnx_arch_arm.hpp:69
Common fields shared across architecture-specific elf_prstatus structures in core dumps.
Definition lnx_kernel_utils.hpp:72