mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-06 21:07:58 +02:00
352 lines
9.8 KiB
PHP
352 lines
9.8 KiB
PHP
{
|
|
This file is part of the Free Pascal run time library.
|
|
Copyright (c) 1999-2000 by Jonas Maebe,
|
|
member of the Free Pascal development team.
|
|
|
|
See the file COPYING.FPC, included in this distribution,
|
|
for details about the copyright.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
**********************************************************************}
|
|
|
|
|
|
Const { For sending a signal }
|
|
|
|
SA_NOCLDSTOP = 8;
|
|
SA_ONSTACK = $001; { take signal on signal stack }
|
|
SA_RESTART = $002; { restart system call on signal return }
|
|
SA_RESETHAND = $004; { reset to SIG_DFL when taking signal }
|
|
SA_NODEFER = $010; { don't mask the signal we're delivering }
|
|
SA_NOCLDWAIT = $020; { don't keep zombies around }
|
|
SA_SIGINFO = $040; { signal handler with SA_SIGINFO args }
|
|
SA_USERTRAMP = $100; { SUNOS compat: Do not bounce off kernel's sigtramp }
|
|
|
|
SIG_BLOCK = 1;
|
|
SIG_UNBLOCK = 2;
|
|
SIG_SETMASK = 3;
|
|
|
|
{BSD Checked}
|
|
SIG_DFL = 0 ;
|
|
SIG_IGN = 1 ;
|
|
SIG_ERR = -1 ;
|
|
|
|
SIGHUP = 1;
|
|
SIGINT = 2;
|
|
SIGQUIT = 3;
|
|
SIGILL = 4;
|
|
SIGTRAP = 5;
|
|
SIGABRT = 6;
|
|
SIGIOT = 6;
|
|
SIGEMT = 7;
|
|
SIGFPE = 8;
|
|
SIGKILL = 9;
|
|
SIGBUS = 10;
|
|
SIGSEGV = 11;
|
|
SIGSYS = 12;
|
|
SIGPIPE = 13;
|
|
SIGALRM = 14;
|
|
SIGTERM = 15;
|
|
SIGURG = 16;
|
|
SIGSTOP = 17;
|
|
SIGTSTP = 18;
|
|
SIGCONT = 19;
|
|
SIGCHLD = 20;
|
|
SIGTTIN = 21;
|
|
SIGTTOU = 22;
|
|
SIGIO = 23;
|
|
SIGXCPU = 24;
|
|
SIGXFSZ = 25;
|
|
SIGVTALRM = 26;
|
|
SIGPROF = 27;
|
|
SIGWINCH = 28;
|
|
SIGINFO = 29;
|
|
SIGUSR1 = 30;
|
|
SIGUSR2 = 31;
|
|
|
|
|
|
{$packrecords C}
|
|
const
|
|
SI_MAXSZ = 128;
|
|
SI_PAD_SIZE = ((SI_MAXSZ div sizeof(longint)) - 3);
|
|
|
|
{
|
|
* The sequence of the fields/registers in struct sigcontext should match
|
|
* those in mcontext_t.
|
|
}
|
|
|
|
type sigset_t = array [0..0] of cuint32 {array[0..3] of cardinal};
|
|
|
|
PSigContextRec = ^SigContextRec;
|
|
psigcontext = ^sigcontextrec;
|
|
{$ifdef cpui386}
|
|
PFpuState = ^TFpuState;
|
|
{$endif def cpui386}
|
|
{$ifdef cpux86_64}
|
|
PFpu64State = ^TFpu64State;
|
|
{$endif def cpux86_64}
|
|
SigContextRec = record
|
|
{$ifdef cpui386}
|
|
(* sc_mask : sigset_t; { signal mask to restore }
|
|
sc_onstack : longint; { sigstack state to restore }
|
|
I did not find those fields in OpenBSD
|
|
/usr/iclude/i386/signal.h header *)
|
|
sc_gs : longint; { machine state (struct trapframe): }
|
|
sc_fs : longint;
|
|
sc_es : longint;
|
|
sc_ds : longint;
|
|
sc_edi : longint;
|
|
sc_esi : longint;
|
|
sc_ebp : longint;
|
|
sc_ebx : longint;
|
|
sc_edx : longint;
|
|
sc_ecx : longint;
|
|
sc_eax : longint;
|
|
sc_eip : longint;
|
|
sc_cs : longint;
|
|
sc_efl : longint;
|
|
sc_esp : longint;
|
|
sc_ss : longint;
|
|
sc_onstack : longint;
|
|
sc_mask : longint;
|
|
sc_trapno : longint;
|
|
sc_err : longint;
|
|
sc_fpustate : pfpustate;
|
|
{$endif def cpui386}
|
|
{$ifdef cpux86_64}
|
|
sc_rdi : clong;
|
|
sc_rsi : clong;
|
|
sc_rdx : clong;
|
|
sc_rcx : clong;
|
|
sc_r8 : clong;
|
|
sc_r9 : clong;
|
|
sc_r10 : clong;
|
|
sc_r11 : clong;
|
|
sc_r12 : clong;
|
|
sc_r13 : clong;
|
|
sc_r14 : clong;
|
|
sc_r15 : clong;
|
|
sc_rbp : clong;
|
|
sc_rbx : clong;
|
|
sc_rax : clong;
|
|
sc_gs : clong;
|
|
sc_fs : clong;
|
|
sc_es : clong;
|
|
sc_ds : clong;
|
|
sc_trapno : clong;
|
|
sc_err : clong;
|
|
sc_rip : clong;
|
|
sc_cs : clong;
|
|
sc_rflags : clong;
|
|
sc_rsp : clong;
|
|
sc_ss : clong;
|
|
sc_fpstate : PFpu64State;
|
|
sc_onstack : cint;
|
|
sc_mask : cint;
|
|
{$endif def cpux86_64}
|
|
end;
|
|
{$ifdef cpui386}
|
|
TFpuX87State = record
|
|
{
|
|
* XXX FPU state is 27 * 4 bytes h/w, 1 * 4 bytes s/w (probably not
|
|
* needed here), or that + 16 * 4 bytes for emulators (probably all
|
|
* needed here). The "spare" bytes are mostly not spare.
|
|
}
|
|
en_cw : cardinal; { control word (16bits used) }
|
|
en_sw : cardinal; { status word (16bits) }
|
|
en_tw : cardinal; { tag word (16bits) }
|
|
en_fip : cardinal; { floating point instruction pointer }
|
|
en_fcs : word; { floating code segment selector }
|
|
en_opcode : word; { opcode last executed (11 bits ) }
|
|
en_foo : cardinal; { floating operand offset }
|
|
en_fos : cardinal; { floating operand segment selector }
|
|
fpr_acc : array[0..79] of char;
|
|
fpr_ex_sw : cardinal; { status word of last exception }
|
|
fpr_ex_tw : cardinal; { tag word of last exception }
|
|
fpr_pad : array[0..63] of char;
|
|
end;
|
|
TFpuXMMState = packed record
|
|
fx_fcw : cuint16;
|
|
fx_fsw : cuint16;
|
|
fx_ftw : cuint8;
|
|
fx_unused1 : cuint8;
|
|
fx_fop : cuint16;
|
|
fx_rip : cuint64;
|
|
fx_rdp : cuint64;
|
|
fx_mxcsr : cuint32;
|
|
fx_mxcsr_mask : cuint32;
|
|
fx_st : array[0..7] of array [0..1] of cuint64;
|
|
fx_xmm : array [0..15] of array [0..1] of cuint64;
|
|
fx_unusued3 : array [0..95] of cuint8;
|
|
end;
|
|
TFpuState = record
|
|
case integer of
|
|
0 : (X87State : TFpuX87State);
|
|
1 : (XMMState : TFpuXMMState);
|
|
end;
|
|
{$endif def cpui386}
|
|
|
|
(* From /usr/include/amd64/fpu.h header
|
|
/*
|
|
* amd64 only uses the extended save/restore format used
|
|
* by fxsave/fsrestore, to always deal with the SSE registers,
|
|
* which are part of the ABI to pass floating point values.
|
|
* Must be stored in memory on a 16-byte boundary.
|
|
*/
|
|
|
|
struct fxsave64 {
|
|
u_int16_t fx_fcw;
|
|
u_int16_t fx_fsw;
|
|
u_int8_t fx_ftw;
|
|
u_int8_t fx_unused1;
|
|
u_int16_t fx_fop;
|
|
u_int64_t fx_rip;
|
|
u_int64_t fx_rdp;
|
|
u_int32_t fx_mxcsr;
|
|
u_int32_t fx_mxcsr_mask;
|
|
u_int64_t fx_st[8][2]; /* 8 normal FP regs */
|
|
u_int64_t fx_xmm[16][2]; /* 16 SSE2 registers */
|
|
u_int8_t fx_unused3[96];
|
|
} __packed;
|
|
|
|
struct savefpu {
|
|
struct fxsave64 fp_fxsave; /* see above */
|
|
u_int16_t fp_ex_sw; /* saved status from last exception */
|
|
u_int16_t fp_ex_tw; /* saved tag from last exception */
|
|
}; *)
|
|
{$ifdef cpux86_64}
|
|
TFpu64State = packed record
|
|
fx_fcw : cuint16;
|
|
fx_fsw : cuint16;
|
|
fx_ftw : cuint8;
|
|
fx_unused1 : cuint8;
|
|
fx_fop : cuint16;
|
|
fx_rip : cuint64;
|
|
fx_rdp : cuint64;
|
|
fx_mxcsr : cuint32;
|
|
fx_mxcsr_mask : cuint32;
|
|
fx_st : array[0..7] of array [0..1] of cuint64;
|
|
fx_xmm : array [0..15] of array [0..1] of cuint64;
|
|
fx_unusued3 : array [0..95] of cuint8;
|
|
end;
|
|
{$endif def cpux86_64}
|
|
|
|
(* From /usr/include/amd64/signal.h
|
|
struct sigcontext {
|
|
/* plain match trapframe */
|
|
Sig64Context = Record
|
|
long sc_rdi;
|
|
long sc_rsi;
|
|
long sc_rdx;
|
|
long sc_rcx;
|
|
long sc_r8;
|
|
long sc_r9;
|
|
long sc_r10;
|
|
long sc_r11;
|
|
long sc_r12;
|
|
long sc_r13;
|
|
long sc_r14;
|
|
long sc_r15;
|
|
long sc_rbp;
|
|
long sc_rbx;
|
|
long sc_rax;
|
|
long sc_gs;
|
|
long sc_fs;
|
|
long sc_es;
|
|
long sc_ds;
|
|
long sc_trapno;
|
|
long sc_err;
|
|
long sc_rip;
|
|
long sc_cs;
|
|
long sc_rflags;
|
|
long sc_rsp;
|
|
long sc_ss;
|
|
|
|
struct fxsave64 *sc_fpstate;
|
|
int sc_onstack;
|
|
int sc_mask;
|
|
}; *)
|
|
Sigval = Record
|
|
Case Boolean OF
|
|
{ Members as suggested by Annex C of POSIX 1003.1b. }
|
|
false : (sigval_int : Longint);
|
|
True : (sigval_ptr : Pointer);
|
|
End;
|
|
|
|
|
|
PSigInfo = ^SigInfo_t;
|
|
PSigInfo_t = ^SigInfo_t;
|
|
SigInfo_t = record
|
|
si_signo, { signal number }
|
|
{
|
|
* 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, { signal code }
|
|
si_errno : cint32; { errno association }
|
|
case integer of
|
|
0 : (
|
|
si_pid : Longint; { sending process }
|
|
si_uid : Cardinal; { sender's ruid }
|
|
si_status : Longint; { exit value }
|
|
si_addr : Pointer; { faulting instruction }
|
|
si_value : SigVal; { signal value }
|
|
si_band : Cardinal; { band event for SIGPOLL }
|
|
__spare : array[0..6] of Longint;); { gimme some slack }
|
|
1 : ( fault_addr : pointer;
|
|
fault_trapno : cint; );
|
|
2 : (pad : array [0..SI_PAD_SIZE] of cuint32;);
|
|
end;
|
|
TSigInfo = SigInfo_t;
|
|
TSigInfo_t = TSigInfo;
|
|
|
|
|
|
SignalHandler = Procedure(Sig : Longint);cdecl;
|
|
PSignalHandler = ^SignalHandler;
|
|
SignalRestorer = Procedure;cdecl;
|
|
PSignalRestorer = ^SignalRestorer;
|
|
sigActionHandler = procedure(Sig: Longint; sininfo:psiginfo; SigContext: PSigContext);cdecl;
|
|
|
|
|
|
|
|
{$ifdef powerpc}
|
|
TSigaction= procedure(Sig: Longint); cdecl;
|
|
{$else}
|
|
{$define BSDHandler}
|
|
{$ifdef BSDHandler}
|
|
TSigAction = procedure(Sig: Longint; code:longint;var SigContext: SigContextRec);cdecl;
|
|
{$else}
|
|
TSigAction = procedure(Sig: Longint; var sininfo:tsiginfo_t;var SigContext: SigContextRec);cdecl;
|
|
{$endif}
|
|
{$endif}
|
|
|
|
Sigset=sigset_t;
|
|
TSigset=sigset_t;
|
|
PSigSet = ^SigSet;
|
|
|
|
PSigActionRec = ^SigActionRec;
|
|
SigActionRec = packed record
|
|
// Handler : record
|
|
sa_handler : sigActionHandler;
|
|
// sa_handler : TSigAction;
|
|
// case byte of
|
|
// 0: (Sh: SignalHandler);
|
|
// 1: (Sa: TSigAction);
|
|
// end;
|
|
Sa_Mask : SigSet;
|
|
Sa_Flags : Longint;
|
|
end;
|
|
|
|
{
|
|
Change action of process upon receipt of a signal.
|
|
Signum specifies the signal (all except SigKill and SigStop).
|
|
If Act is non-nil, it is used to specify the new action.
|
|
If OldAct is non-nil the previous action is saved there.
|
|
}
|
|
|
|
|