diff options
Diffstat (limited to 'src/libtools/signal_private.h')
| -rw-r--r-- | src/libtools/signal_private.h | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/src/libtools/signal_private.h b/src/libtools/signal_private.h new file mode 100644 index 00000000..6d261c39 --- /dev/null +++ b/src/libtools/signal_private.h @@ -0,0 +1,231 @@ +#ifndef __SIGNAL_PRIVATE_H__ +#define __SIGNAL_PRIVATE_H__ + +typedef uint64_t x64_gregset_t[23]; +enum +{ + X64_R8 = 0, +# define X64_R8 X64_R8 + X64_R9, +# define X64_R9 X64_R9 + X64_R10, +# define X64_R10 X64_R10 + X64_R11, +# define X64_R11 X64_R11 + X64_R12, +# define X64_R12 X64_R12 + X64_R13, +# define X64_R13 X64_R13 + X64_R14, +# define X64_R14 X64_R14 + X64_R15, +# define X64_R15 X64_R15 + X64_RDI, +# define X64_RDI X64_RDI + X64_RSI, +# define X64_RSI X64_RSI + X64_RBP, +# define X64_RBP X64_RBP + X64_RBX, +# define X64_RBX X64_RBX + X64_RDX, +# define X64_RDX X64_RDX + X64_RAX, +# define X64_RAX X64_RAX + X64_RCX, +# define X64_RCX X64_RCX + X64_RSP, +# define X64_RSP X64_RSP + X64_RIP, +# define X64_RIP X64_RIP + X64_EFL, +# define X64_EFL X64_EFL + X64_CSGSFS, /* Actually short cs, gs, fs, __pad0. */ +# define X64_CSGSFS X64_CSGSFS + X64_ERR, +# define X64_ERR X64_ERR + X64_TRAPNO, +# define X64_TRAPNO X64_TRAPNO + X64_OLDMASK, +# define X64_OLDMASK X64_OLDMASK + X64_CR2 +# define X64_CR2 X64_CR2 +}; + +struct x64_fpreg +{ + uint64_t value; +}__attribute__((packed)); + +struct x64_fpxreg +{ + unsigned short significand[4]; + unsigned short exponent; + unsigned short padding[3]; +}__attribute__((packed)); + +struct x64_xmmreg +{ + uint32_t element[4]; +}__attribute__((packed)); + +struct x64_fpstate +{ + /* Regular FPU environment. */ + uint16_t cw; + uint16_t sw; + uint16_t tw; + uint16_t fop; + uint64_t rip; + uint64_t rdp; + uint32_t mxcsr; + uint32_t mxcsr_mask; + struct x64_fpreg _st[8]; + struct x64_xmmreg _xmm[16]; + uint32_t res[24]; +}__attribute__((packed)); + +typedef struct x64_fpstate *x64_fpregset_t; + +typedef struct x64_stack_s +{ + void *ss_sp; + int ss_flags; + size_t ss_size; +} x64_stack_t; + +struct sigcontext_x64 +{ + uint64_t r8; + uint64_t r9; + uint64_t r10; + uint64_t r11; + uint64_t r12; + uint64_t r13; + uint64_t r14; + uint64_t r15; + uint64_t di; + uint64_t si; + uint64_t bp; + uint64_t bx; + uint64_t dx; + uint64_t ax; + uint64_t cx; + uint64_t sp; + uint64_t ip; + uint64_t flags; + uint64_t cs; + uint64_t gs; + uint64_t fs; + uint64_t ss; + uint64_t err; + uint64_t trapno; + uint64_t oldmask; + uint64_t cr2; + uint64_t fpstate; /* Zero when no FPU/extended context */ + uint64_t reserved1[8]; +}; + +struct x64_sigcontext +{ + uint64_t r8; + uint64_t r9; + uint64_t r10; + uint64_t r11; + uint64_t r12; + uint64_t r13; + uint64_t r14; + uint64_t r15; + uint64_t rdi; + uint64_t rsi; + uint64_t rbp; + uint64_t rbx; + uint64_t rdx; + uint64_t rax; + uint64_t rcx; + uint64_t rsp; + uint64_t rip; + uint64_t eflags; /* RFLAGS */ + uint16_t cs; + uint16_t gs; + uint16_t fs; + union { + uint16_t ss; /* If UC_SIGCONTEXT_SS */ + uint16_t __pad0; /* Alias name for old (!UC_SIGCONTEXT_SS) user-space */ + }; + uint64_t err; + uint64_t trapno; + uint64_t oldmask; + uint64_t cr2; + struct x64_fpstate *fpstate; /* Zero when no FPU context */ + uint64_t reserved1[8]; +}; + +struct x64_libc_fpstate +{ + /* 64-bit FXSAVE format. */ + uint16_t cwd; + uint16_t swd; + uint16_t ftw; + uint16_t fop; + uint64_t rip; + uint64_t rdp; + uint32_t mxcsr; + uint32_t mxcr_mask; + struct x64_fpxreg st[8]; + struct x64_xmmreg xmm[16]; + uint32_t res1[24]; +}; + +typedef struct x64_mcontext_s +{ + x64_gregset_t gregs; + struct x64_libc_fpstate *fpregs; + uint64_t res[8]; +} x64_mcontext_t; + +// /!\ signal sig_set is different than glibc __sig_set +#ifdef ANDROID +#define _NSIG_WORDS (64 / (sizeof(unsigned long int)*8)) +#else +#define _NSIG_WORDS (1024 / (sizeof(unsigned long int)*8)) +#endif + +typedef struct { + unsigned long int sig[_NSIG_WORDS]; +} x64_sigset_t; + +typedef struct x64_ucontext_s +{ + uint64_t uc_flags; + struct x64_ucontext_s* uc_link; + x64_stack_t uc_stack; + x64_mcontext_t uc_mcontext; + x64_sigset_t uc_sigmask; + struct x64_libc_fpstate xstate; + #ifndef ANDROID + uint64_t ssp[4]; + #endif +} x64_ucontext_t; + +typedef struct x64_sigframe_s { + uintptr_t pretcode; // pointer to retcode + int sig; + x64_mcontext_t cpustate; + struct x64_libc_fpstate xstate; + uintptr_t extramask[64-1]; + char retcode[8]; +} x64_sigframe_t; + +struct kernel_sigaction { + void (*k_sa_handler) (int); + unsigned long sa_flags; + void (*sa_restorer) (void); + unsigned long sa_mask; + unsigned long sa_mask2; +}; + +x64_stack_t* sigstack_getstack(); +uint64_t RunFunctionHandler(x64emu_t* emu, int* exit, int dynarec, x64_ucontext_t* sigcontext, uintptr_t fnc, int nargs, ...); + +#endif //__SIGNAL_PRIVATE_H__ \ No newline at end of file |