|
@@ -1,9 +1,8 @@
|
|
|
{
|
|
|
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.
|
|
|
+ Copyright (c) 2005 by Thomas Schatzl
|
|
|
|
|
|
- TSigContext
|
|
|
+ TSigContext and associated structures
|
|
|
|
|
|
See the file COPYING.FPC, included in this distribution,
|
|
|
for details about the copyright.
|
|
@@ -17,65 +16,151 @@
|
|
|
{$packrecords C}
|
|
|
|
|
|
type
|
|
|
- TPPC_Reg = QWord;
|
|
|
+ gpr_reg = cULong;
|
|
|
+ fpr_reg = double;
|
|
|
+ vvr_reg = array[0..1] of cULong;
|
|
|
+
|
|
|
+type
|
|
|
{ from include/asm-ppc64/ptrace.h }
|
|
|
- pptregs = ^tptregs;
|
|
|
- tptregs = record
|
|
|
- gpr: array[0..31] of TPPC_Reg;
|
|
|
- nip: TPPC_Reg;
|
|
|
- msr: TPPC_Reg;
|
|
|
- orig_gpr3: TPPC_Reg; { Used for restarting system calls }
|
|
|
- ctr: TPPC_Reg;
|
|
|
- link: TPPC_Reg;
|
|
|
- xer: TPPC_Reg;
|
|
|
- ccr: TPPC_Reg;
|
|
|
- softe: TPPC_Reg; { soft enabled/disabled }
|
|
|
- trap: TPPC_Reg; { Reason for being here }
|
|
|
- dar: TPPC_Reg; { Fault registers }
|
|
|
- dsisr: TPPC_Reg;
|
|
|
- result: TPPC_Reg; { Result of a system call }
|
|
|
+ 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: longint;
|
|
|
- ss_size: size_t;
|
|
|
+ ss_sp : pointer;
|
|
|
+ ss_flags : cInt;
|
|
|
+ ss_size : size_t;
|
|
|
end;
|
|
|
|
|
|
- { from include/asm-ppc64/sigcontext.h }
|
|
|
- tsigcontext_struct = record
|
|
|
- _unused: array[0..3] of qword;
|
|
|
- signal: longint;
|
|
|
- pad0 : longint;
|
|
|
- handler: qword;
|
|
|
- oldmask: qword;
|
|
|
- pt_regs: pptregs;
|
|
|
+ { 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 : qword;
|
|
|
+ uc_flags : cuLong;
|
|
|
uc_link : pucontext;
|
|
|
uc_stack : stack_t;
|
|
|
- uc_sigmask : qword;{sigset_t;}
|
|
|
- __unused : array[0..14] of qword;{sigset_t;}
|
|
|
- uc_mcontext : tsigcontext_struct;
|
|
|
- end;
|
|
|
-
|
|
|
-
|
|
|
- { from arch/ppc/kernel/signal.c, the type of the actual parameter passed }
|
|
|
- { to the sigaction handler }
|
|
|
- t_rt_sigframe = record
|
|
|
- uc: tucontext;
|
|
|
- _unused: array[0..1] of qword;
|
|
|
- tramp: array[0..5] of dword;
|
|
|
- pinfo: psiginfo;
|
|
|
- puc: pointer;
|
|
|
- siginfo: tsiginfo;
|
|
|
- abigap: array[0..287] of byte;
|
|
|
+ uc_sigmask : _sigset_t;
|
|
|
+ __unused : array[0..14] of _sigset_t; { Allow for uc_sigmask growth }
|
|
|
+ uc_mcontext : TSigContext; { last for extensibility }
|
|
|
end;
|
|
|
|
|
|
PSigContext = ^TSigContext;
|
|
|
- TSigContext= tsigcontext_struct;
|