123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- {
- 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;
|