zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

ucontext.h (3770B) - Raw


      1 /* Copyright (C) 1998-2025 Free Software Foundation, Inc.
      2    This file is part of the GNU C Library.
      3 
      4    The GNU C Library is free software; you can redistribute it and/or
      5    modify it under the terms of the GNU Lesser General Public
      6    License as published by the Free Software Foundation; either
      7    version 2.1 of the License, or (at your option) any later version.
      8 
      9    The GNU C Library is distributed in the hope that it will be useful,
     10    but WITHOUT ANY WARRANTY; without even the implied warranty of
     11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12    Lesser General Public License for more details.
     13 
     14    You should have received a copy of the GNU Lesser General Public
     15    License along with the GNU C Library.  If not, see
     16    <https://www.gnu.org/licenses/>.  */
     17 
     18 /* System V/ARM ABI compliant context switching support.  */
     19 
     20 #ifndef _SYS_UCONTEXT_H
     21 #define _SYS_UCONTEXT_H	1
     22 
     23 #include <features.h>
     24 
     25 #include <bits/types/sigset_t.h>
     26 #include <bits/types/stack_t.h>
     27 
     28 
     29 #ifdef __USE_MISC
     30 # define __ctx(fld) fld
     31 #else
     32 # define __ctx(fld) __ ## fld
     33 #endif
     34 
     35 #ifdef __USE_MISC
     36 typedef int greg_t;
     37 
     38 /* Number of general registers.  */
     39 # define NGREG	18
     40 
     41 /* Container for all general registers.  */
     42 typedef greg_t gregset_t[NGREG];
     43 
     44 /* Number of each register is the `gregset_t' array.  */
     45 enum
     46 {
     47   REG_R0 = 0,
     48 # define REG_R0	REG_R0
     49   REG_R1 = 1,
     50 # define REG_R1	REG_R1
     51   REG_R2 = 2,
     52 # define REG_R2	REG_R2
     53   REG_R3 = 3,
     54 # define REG_R3	REG_R3
     55   REG_R4 = 4,
     56 # define REG_R4	REG_R4
     57   REG_R5 = 5,
     58 # define REG_R5	REG_R5
     59   REG_R6 = 6,
     60 # define REG_R6	REG_R6
     61   REG_R7 = 7,
     62 # define REG_R7	REG_R7
     63   REG_R8 = 8,
     64 # define REG_R8	REG_R8
     65   REG_R9 = 9,
     66 # define REG_R9	REG_R9
     67   REG_R10 = 10,
     68 # define REG_R10	REG_R10
     69   REG_R11 = 11,
     70 # define REG_R11	REG_R11
     71   REG_R12 = 12,
     72 # define REG_R12	REG_R12
     73   REG_R13 = 13,
     74 # define REG_R13	REG_R13
     75   REG_R14 = 14,
     76 # define REG_R14	REG_R14
     77   REG_R15 = 15
     78 # define REG_R15	REG_R15
     79 };
     80 
     81 struct _libc_fpstate
     82 {
     83   struct
     84   {
     85     unsigned int sign1:1;
     86     unsigned int unused:15;
     87     unsigned int sign2:1;
     88     unsigned int exponent:14;
     89     unsigned int j:1;
     90     unsigned int mantissa1:31;
     91     unsigned int mantissa0:32;
     92   } fpregs[8];
     93   unsigned int fpsr:32;
     94   unsigned int fpcr:32;
     95   unsigned char ftype[8];
     96   unsigned int init_flag;
     97 };
     98 /* Structure to describe FPU registers.  */
     99 typedef struct _libc_fpstate fpregset_t;
    100 #endif
    101 
    102 /* Context to describe whole processor state.  This only describes
    103    the core registers; coprocessor registers get saved elsewhere
    104    (e.g. in uc_regspace, or somewhere unspecified on the stack
    105    during non-RT signal handlers).  */
    106 typedef struct
    107   {
    108     unsigned long int __ctx(trap_no);
    109     unsigned long int __ctx(error_code);
    110     unsigned long int __ctx(oldmask);
    111     unsigned long int __ctx(arm_r0);
    112     unsigned long int __ctx(arm_r1);
    113     unsigned long int __ctx(arm_r2);
    114     unsigned long int __ctx(arm_r3);
    115     unsigned long int __ctx(arm_r4);
    116     unsigned long int __ctx(arm_r5);
    117     unsigned long int __ctx(arm_r6);
    118     unsigned long int __ctx(arm_r7);
    119     unsigned long int __ctx(arm_r8);
    120     unsigned long int __ctx(arm_r9);
    121     unsigned long int __ctx(arm_r10);
    122     unsigned long int __ctx(arm_fp);
    123     unsigned long int __ctx(arm_ip);
    124     unsigned long int __ctx(arm_sp);
    125     unsigned long int __ctx(arm_lr);
    126     unsigned long int __ctx(arm_pc);
    127     unsigned long int __ctx(arm_cpsr);
    128     unsigned long int __ctx(fault_address);
    129   } mcontext_t;
    130 
    131 /* Userlevel context.  */
    132 typedef struct ucontext_t
    133   {
    134     unsigned long __ctx(uc_flags);
    135     struct ucontext_t *uc_link;
    136     stack_t uc_stack;
    137     mcontext_t uc_mcontext;
    138     sigset_t uc_sigmask;
    139     unsigned long __ctx(uc_regspace)[128] __attribute__((__aligned__(8)));
    140   } ucontext_t;
    141 
    142 #undef __ctx
    143 
    144 #endif /* sys/ucontext.h */