diff options
| author | ptitSeb <sebastien.chev@gmail.com> | 2025-05-30 21:38:43 +0200 |
|---|---|---|
| committer | ptitSeb <sebastien.chev@gmail.com> | 2025-05-30 21:38:43 +0200 |
| commit | 2038df85c0fc289acc7ff1dce4cd6b416031f7f5 (patch) | |
| tree | 0f9d73ad0b29388b8452f812fca9028eed8d0339 /src/libtools/signals.c | |
| parent | b142c5a1817fb788b9692870ff6aa0cb3e622aea (diff) | |
| download | box64-2038df85c0fc289acc7ff1dce4cd6b416031f7f5.tar.gz box64-2038df85c0fc289acc7ff1dce4cd6b416031f7f5.zip | |
[ARM64_DYNAREC] Try to optimise Windows INT n version on 64bits (TODO: Interp and 32bits and wowbox64)
Diffstat (limited to 'src/libtools/signals.c')
| -rw-r--r-- | src/libtools/signals.c | 228 |
1 files changed, 3 insertions, 225 deletions
diff --git a/src/libtools/signals.c b/src/libtools/signals.c index a24a1c51..a2e56cf9 100644 --- a/src/libtools/signals.c +++ b/src/libtools/signals.c @@ -43,230 +43,7 @@ #include "gdbjit.h" #endif - -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; -}; +#include "signal_private.h" static void sigstack_destroy(void* p) { @@ -327,7 +104,8 @@ uint64_t RunFunctionHandler(x64emu_t* emu, int* exit, int dynarec, x64_ucontext_ #ifndef USE_CUSTOM_MEM // because a signal can interupt a malloc-like function // Dynarec cannot be used in signal handling unless custom malloc is used - dynarec = 0; + if(dynarec==1) + dynarec = 0; #endif if(!emu) emu = thread_get_emu(); |