fpPS4/sys/signal.inc
2022-05-31 10:20:10 +03:00

332 lines
8.9 KiB
PHP

const
_SIG_WORDS =4;
_SIG_MAXSIG =128;
const
SIG_BLOCK =1;
SIG_UNBLOCK =2;
SIG_SETMASK =3;
SIGPROCMASK_OLD =$0001;
SIGPROCMASK_PROC_LOCKED =$0002;
SIGPROCMASK_PS_LOCKED =$0004;
SIGPROCMASK_FASTBLK =$0008;
const
SIGHUP =1; // hangup
SIGINT =2; // interrupt
SIGQUIT =3; // quit
SIGILL =4; // illegal instr. (not reset when caught)
SIGTRAP =5; // trace trap (not reset when caught)
SIGABRT =6; // abort()
SIGIOT =SIGABRT; // compatibility
SIGEMT =7; // EMT instruction
SIGFPE =8; // floating point exception
SIGKILL =9; // kill (cannot be caught or ignored)
SIGBUS =10; // bus error
SIGSEGV =11; // segmentation violation
SIGSYS =12; // non-existent system call invoked
SIGPIPE =13; // write on a pipe with no one to read it
SIGALRM =14; // alarm clock
SIGTERM =15; // software termination signal from kill
SIGURG =16; // urgent condition on IO channel
SIGSTOP =17; // sendable stop signal not from tty
SIGTSTP =18; // stop signal from tty
SIGCONT =19; // continue a stopped process
SIGCHLD =20; // to parent on child stop or exit
SIGTTIN =21; // to readers pgrp upon background tty read
SIGTTOU =22; // like TTIN if (tp->t_local&LTOSTOP)
SIGIO =23; // input/output possible signal
SIGXCPU =24; // exceeded CPU time limit
SIGXFSZ =25; // exceeded file size limit
SIGVTALRM=26; // virtual time alarm
SIGPROF =27; // profiling time alarm
SIGWINCH =28; // window size changes
SIGINFO =29; // information request
SIGUSR1 =30; // user defined signal 1
SIGUSR2 =31; // user defined signal 2
SIGTHR =32; // reserved by thread library.
SIGLWP =SIGTHR;
SIGCANCEL=SIGTHR;
SIGRTMIN=65;
SIGRTMAX=126;
SIG_DFL = 0; //default
SIG_IGN = 1; //ignore
SIG_ERR =-1;
SIG_CATCH= 2; //See signalvar.h
SIG_HOLD = 3;
SA_ONSTACK =$0001; // take signal on signal stack
SA_RESTART =$0002; // restart system call on signal return
SA_RESETHAND =$0004; // reset to SIG_DFL when taking signal
SA_NODEFER =$0010; // don't mask the signal we're delivering
SA_NOCLDWAIT =$0020; // don't keep zombies around
SA_SIGINFO =$0040; // signal handler with SA_SIGINFO args
SI_NOINFO =0; // No signal info besides si_signo.
SI_USER =$10001; // Signal sent by kill().
SI_QUEUE =$10002; // Signal sent by the sigqueue().
SI_TIMER =$10003; // Signal generated by expiration of a timer set by timer_settime().
SI_ASYNCIO=$10004; // Signal generated by completion of an asynchronous I/O request.
SI_MESGQ =$10005; // Signal generated by arrival of a message on an empty message queue.
SI_KERNEL =$10006;
SI_LWP =$10007; // Signal sent by thr_kill
_MC_FPFMT_XMM =$10002;
_MC_FPOWNED_FPU=$20001; // FP state came from FPU
//mc_flags bits. Shall be in sync with TF_XXX.
_MC_HASSEGS =$1;
_MC_HASBASES =$2;
_MC_HASFPXSTATE=$4;
_MC_FLAG_MASK =(_MC_HASSEGS or _MC_HASBASES or _MC_HASFPXSTATE);
type
p_sigset_t=^sigset_t;
sigset_t=packed record
Case Byte of
0:(bits:array[0.._SIG_WORDS-1] of DWORD);
1:(qwords:array[0..(_SIG_WORDS div 2)-1] of QWORD);
end;
sigval=packed record
Case Byte of
// Members as suggested by Annex C of POSIX 1003.1b.
0:(sival_int:Integer);
1:(sival_ptr:Pointer);
//6.0 compatibility
2:(sigval_int:Integer);
3:(sigval_ptr:Pointer);
end;
sigevent=packed record
sigev_notify:Integer; //Notification type
sigev_signo :Integer; //Signal number
sigev_value :sigval; //Signal value
_sigev_un:packed record
Case Byte of
0:(_threadid:Integer); //__lwpid_t
1:(_sigev_thread:packed record
_function :Pointer; //void (*_function)(union sigval);
_attribute:Pointer; //pthread_attr_t
end);
2:(__spare__:array[0..7] of QWORD);
end;
end;
p_siginfo_t=^siginfo_t;
siginfo_t=packed record
si_signo:Integer; //signal number
si_errno:Integer; //errno association
{
* Cause of signal, one of the SI_ macros or signal-specific
* values, i.e. one of the FPE_... values for SIGFPE. This
* value is equivalent to the second argument to an old-style
* FreeBSD signal handler.
}
si_code :Integer; // signal code SI_USER
si_pid :Integer; // sending process
si_uid :DWORD; // sender's ruid
si_status:Integer; // exit value
si_addr :Pointer; // faulting instruction
si_value :sigval; // signal value
_reason:packed record
Case Byte of
0:(_fault:packed record
_trapno:Integer; // machine specific trap code
end);
1:(_timer:packed record
_timerid:Integer;
_overrun:Integer;
end);
2:(_mesgq:packed record
_mqd:Integer;
end);
3:(_poll:packed record
_band:QWORD; // band event for SIGPOLL
end);
4:(__spare__:packed record
__spare1__:QWORD;
__spare2__:array[0..6] of Integer;
end);
end;
end;
sa_handler =procedure(sig,code:Integer;ctx:Pointer); SysV_ABI_CDecl;
sa_sigaction=procedure(sig:Integer;info:p_siginfo_t;ctx:Pointer); SysV_ABI_CDecl;
sig_t=sa_handler;
p_sigaction_t=^sigaction_t;
sigaction_t=packed record
__sigaction_u:packed record // signal handler
Case Byte of
0:(__code:Ptrint); //SIG_DFL
1:(__sa_handler:sa_handler); //void (*__sa_handler)(int);
2:(__sa_sigaction:sa_sigaction); //void (*__sa_sigaction)(int, struct __siginfo *, void *); (sa_flags and SA_SIGINFO)<>0
end;
sa_flags:Integer; //SA_SIGINFO
sa_mask:sigset_t; //signal mask to apply (signal mask inside signal)
_align:Integer;
end;
sigcontext=packed record //0x490(1168)
sc_mask:sigset_t; //signal mask to restore =1 if (SS_ONSTACK)
sc_onstack:QWORD; //sigstack state to restore
sc_rdi:QWORD; //machine state (struct trapframe)
sc_rsi:QWORD;
sc_rdx:QWORD;
sc_rcx:QWORD;
sc_r8 :QWORD;
sc_r9 :QWORD;
sc_rax:QWORD;
sc_rbx:QWORD;
sc_rbp:QWORD;
sc_r10:QWORD;
sc_r11:QWORD;
sc_r12:QWORD;
sc_r13:QWORD;
sc_r14:QWORD;
sc_r15:QWORD;
sc_trapno:Integer;
sc_fs:Word;
sc_gs:Word;
sc_addr:QWORD;
sc_flags:Integer; //_MC_HASSEGS
sc_es:Word;
sc_ds:Word;
sc_err :QWORD; //errno
sc_rip :QWORD;
sc_cs :QWORD;
sc_rflags:QWORD; //EFlags
sc_rsp :QWORD;
sc_ss :QWORD;
sc_len :QWORD; //sizeof(mcontext_t)
{
* XXX - See <machine/ucontext.h> and <machine/fpu.h> for
* the following fields.
}
sc_fpformat:QWORD; //_MC_FPFMT_XMM
sc_ownedfp :QWORD; //_MC_FPOWNED_FPU
sc_lbrfrom :QWORD; //LastBranchFromRip
sc_lbrto :QWORD; //LastBranchToRip
sc_aux1 :QWORD;
sc_aux2 :QWORD;
sc_fpstate:array[0..103] of QWORD; //__aligned(16); =XMM_SAVE_AREA32+XSTATE
sc_fsbase:QWORD;
sc_gsbase:QWORD;
sc_spare:array[0..5] of QWORD; //6(qword) 12(int)
end;
p_mcontext_t=^mcontext_t;
mcontext_t=packed record
mc_onstack:QWORD; //sigstack state to restore =1 if (SS_ONSTACK)
mc_rdi:QWORD; //machine state (struct trapframe)
mc_rsi:QWORD;
mc_rdx:QWORD;
mc_rcx:QWORD;
mc_r8 :QWORD;
mc_r9 :QWORD;
mc_rax:QWORD;
mc_rbx:QWORD;
mc_rbp:QWORD;
mc_r10:QWORD;
mc_r11:QWORD;
mc_r12:QWORD;
mc_r13:QWORD;
mc_r14:QWORD;
mc_r15:QWORD;
mc_trapno:Integer;
mc_fs:Word;
mc_gs:Word;
mc_addr:QWORD;
mc_flags:Integer; //_MC_HASSEGS
mc_es:Word;
mc_ds:Word;
mc_err :QWORD; //errno
mc_rip :QWORD;
mc_cs :QWORD;
mc_rflags:QWORD; //EFlags
mc_rsp :QWORD;
mc_ss :QWORD;
mc_len :QWORD; //sizeof(mcontext_t)
{
* XXX - See <machine/ucontext.h> and <machine/fpu.h> for
* the following fields.
}
mc_fpformat:QWORD; //_MC_FPFMT_XMM
mc_ownedfp :QWORD; //_MC_FPOWNED_FPU
mc_lbrfrom :QWORD; //LastBranchFromRip
mc_lbrto :QWORD; //LastBranchToRip
mc_aux1 :QWORD;
mc_aux2 :QWORD;
mc_fpstate:array[0..103] of QWORD; //__aligned(16); =XMM_SAVE_AREA32+XSTATE
mc_fsbase:QWORD;
mc_gsbase:QWORD;
mc_spare:array[0..5] of QWORD; //6(qword) 12(int)
end;
sigaltstack=packed record
ss_sp:Pointer; //signal stack base
ss_size:size_t; //signal stack length SIGSTKSZ
ss_flags:Integer; //SS_DISABLE and/or SS_ONSTACK
end;
const
SS_ONSTACK =$0001; // take signal on alternate stack
SS_DISABLE =$0004; // disable taking signals on alternate stack
MINSIGSTKSZ =(512*4); // minimum stack size
SIGSTKSZ =(MINSIGSTKSZ+32768); // recommended stack size
// uc_flags
_UC_SIGMASK=$01; // valid uc_sigmask
_UC_STACK =$02; // valid uc_stack
_UC_CPU =$04; // valid GPR context in uc_mcontext
_UC_FPU =$08; // valid FPU context in uc_mcontext
type
p_ucontext_t=^_ucontext_t;
_ucontext_t=packed record //size=0x500(1280)
uc_sigmask:sigset_t; //2(qword) 4(int)
uc_mcontext:mcontext_t;
uc_link:Pointer; //__ucontext
uc_stack:sigaltstack; //__stack_t
uc_flags:Integer;
//fix me
_unknow_data:array[0..9] of QWORD; //10(qword) 20(int)
end;