about summary refs log tree commit diff stats
path: root/src/libtools/signals.c
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2025-05-30 21:38:43 +0200
committerptitSeb <sebastien.chev@gmail.com>2025-05-30 21:38:43 +0200
commit2038df85c0fc289acc7ff1dce4cd6b416031f7f5 (patch)
tree0f9d73ad0b29388b8452f812fca9028eed8d0339 /src/libtools/signals.c
parentb142c5a1817fb788b9692870ff6aa0cb3e622aea (diff)
downloadbox64-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.c228
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();