mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-29 06:23:43 +02:00
172 lines
5.1 KiB
PHP
172 lines
5.1 KiB
PHP
{
|
|
This file is part of the Free Pascal run time library.
|
|
Copyright (c) 2005 by Thomas Schatzl,
|
|
member of the FreePascal development team
|
|
|
|
TSigContext and associated structures.
|
|
|
|
See also in the *kernel* sources arch/ppc64/kernel/signal.c,
|
|
function setup_rt_sigframe() for more information about the
|
|
passed structures.
|
|
|
|
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.
|
|
|
|
**********************************************************************}
|
|
|
|
{$packrecords C}
|
|
|
|
type
|
|
gpr_reg = cULong;
|
|
fpr_reg = double;
|
|
vvr_reg = array[0..1] of cULong;
|
|
|
|
type
|
|
{ from include/asm-ppc64/ptrace.h }
|
|
ppt_regs = ^pt_regs;
|
|
pt_regs = record
|
|
gpr : array[0..31] of gpr_reg;
|
|
nip : gpr_reg;
|
|
msr : gpr_reg;
|
|
orig_gpr3 : gpr_reg; { Used for restarting system calls }
|
|
ctr : gpr_reg;
|
|
link : gpr_reg;
|
|
xer : gpr_reg;
|
|
ccr : gpr_reg;
|
|
softe : gpr_reg; { Soft enabled/disabled }
|
|
trap : gpr_reg; { Reason for being here }
|
|
dar : gpr_reg; { Fault registers }
|
|
dsisr : gpr_reg;
|
|
result : gpr_reg; { Result of a system call }
|
|
end;
|
|
|
|
{ index constants for the different register set arrays in TSigContext.
|
|
Comments were directly pasted from the sources.
|
|
}
|
|
const
|
|
PT_R0 = 0;
|
|
PT_R1 = 1;
|
|
PT_R2 = 2;
|
|
PT_R3 = 3;
|
|
PT_R4 = 4;
|
|
PT_R5 = 5;
|
|
PT_R6 = 6;
|
|
PT_R7 = 7;
|
|
PT_R8 = 8;
|
|
PT_R9 = 9;
|
|
PT_R10 = 10;
|
|
PT_R11 = 11;
|
|
PT_R12 = 12;
|
|
PT_R13 = 13;
|
|
PT_R14 = 14;
|
|
PT_R15 = 15;
|
|
PT_R16 = 16;
|
|
PT_R17 = 17;
|
|
PT_R18 = 18;
|
|
PT_R19 = 19;
|
|
PT_R20 = 20;
|
|
PT_R21 = 21;
|
|
PT_R22 = 22;
|
|
PT_R23 = 23;
|
|
PT_R24 = 24;
|
|
PT_R25 = 25;
|
|
PT_R26 = 26;
|
|
PT_R27 = 27;
|
|
PT_R28 = 28;
|
|
PT_R29 = 29;
|
|
PT_R30 = 30;
|
|
PT_R31 = 31;
|
|
PT_NIP = 32;
|
|
PT_MSR = 33;
|
|
PT_CTR = 35;
|
|
PT_LNK = 36;
|
|
PT_XER = 37;
|
|
PT_CCR = 38;
|
|
PT_SOFTE = 39;
|
|
PT_RESULT = 43;
|
|
PT_FPR0 = 48;
|
|
PT_FPR31 = PT_FPR0+31;
|
|
{ Kernel and userspace will both use this PT_FPSCR value. 32-bit apps will have
|
|
visibility to the asm-ppc/ptrace.h header instead of this one. }
|
|
{ each FP reg occupies 1 slot in 64-bit space }
|
|
PT_FPSCR = PT_FPR0+32;
|
|
{ each Vector reg occupies 2 slots in 64-bit }
|
|
PT_VR0 = 82;
|
|
PT_VSCR = (PT_VR0+(32*2))+1;
|
|
PT_VRSAVE = PT_VR0+(33*2);
|
|
|
|
{ from include/asm-ppc64/signal.h }
|
|
type
|
|
stack_t = record
|
|
ss_sp : pointer;
|
|
ss_flags : cInt;
|
|
ss_size : size_t;
|
|
end;
|
|
|
|
{ from include/asm-ppc64/sigcontext.h and
|
|
include/asm-ppc64/elf.h
|
|
}
|
|
const
|
|
ELF_NGREG = 48; { includes nip, msr, lr, etc. }
|
|
ELF_NFPREG = 33; { includes fpscr }
|
|
ELF_NVRREG = 34; { includes vscr & vrsave in split vectors }
|
|
|
|
type
|
|
elf_gregset_t = array[0..ELF_NGREG-1] of gpr_reg;
|
|
elf_fpregset_t = array[0..ELF_NFPREG-1] of fpr_reg;
|
|
|
|
elf_vrreg_t = array[0..ELF_NVRREG-1] of vvr_reg;
|
|
|
|
TSigContext = record
|
|
_unused : array[0..3] of cULong;
|
|
signal : cInt;
|
|
_pad0 : cInt;
|
|
handler : cULong;
|
|
oldmask : cULong;
|
|
regs : ppt_regs;
|
|
gp_regs : elf_gregset_t;
|
|
fp_regs : elf_fpregset_t;
|
|
|
|
{ To maintain compatibility with current implementations the sigcontext is
|
|
extended by appending a pointer (v_regs) to a quadword type (elf_vrreg_t)
|
|
followed by an unstructured (vmx_reserve) field of 69 doublewords. This
|
|
allows the array of vector registers to be quadword aligned independent of
|
|
the alignment of the containing sigcontext or ucontext. It is the
|
|
responsibility of the code setting the sigcontext to set this pointer to
|
|
either NULL (if this processor does not support the VMX feature) or the
|
|
address of the first quadword within the allocated (vmx_reserve) area.
|
|
|
|
The pointer (v_regs) of vector type (elf_vrreg_t) is type compatible with
|
|
an array of 34 quadword entries (elf_vrregset_t). The entries with
|
|
indexes 0-31 contain the corresponding vector registers. The entry with
|
|
index 32 contains the vscr as the last word (offset 12) within the
|
|
quadword. This allows the vscr to be stored as either a quadword (since
|
|
it must be copied via a vector register to/from storage) or as a word.
|
|
The entry with index 33 contains the vrsave as the first word (offset 0)
|
|
within the quadword. }
|
|
v_regs : ^elf_vrreg_t;
|
|
vmx_reserve : array[0..ELF_NVRREG+ELF_NVRREG] of cLong;
|
|
end;
|
|
|
|
{ the kernel uses a different sigset_t type for the ucontext structure and the
|
|
sigset_t used for masking signals. To avoid name clash, and still use a dedicated
|
|
type for the fields, use _sigset_t }
|
|
_sigset_t = cULong;
|
|
|
|
{ from include/asm-ppc64/ucontext.h }
|
|
pucontext = ^tucontext;
|
|
tucontext = record
|
|
uc_flags : cuLong;
|
|
uc_link : pucontext;
|
|
uc_stack : stack_t;
|
|
uc_sigmask : _sigset_t;
|
|
__unused : array[0..14] of _sigset_t; { Allow for uc_sigmask growth }
|
|
uc_mcontext : TSigContext; { last for extensibility }
|
|
end;
|
|
|
|
PSigContext = ^TUContext;
|