/* Copyright (C) 1999, 2000, 2001, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The GNU C Library 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. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef _SYS_UCONTEXT_H #define _SYS_UCONTEXT_H 1 #include <features.h> #include <signal.h> /* We need the signal context definitions even if they are not used included in <signal.h>. */ #include <bits/sigcontext.h> typedef unsigned long greg_t; /* Number of general registers. */ #define NGREG (10+2+64) /* Container for all general registers. */ typedef greg_t gregset_t[NGREG]; #ifdef __USE_GNU /* Number of each register is the `gregset_t' array. */ enum { REG_PSR = 0, #define REG_PSR REG_PSR REG_ISR = 1, #define REG_ISR REG_ISR REG_CCR = 2, #define REG_CCR REG_CCR REG_CCCR = 3, #define REG_CCCR REG_CCCR REG_LR = 4, #define REG_LR REG_LR REG_LCR = 5, #define REG_LCR REG_LCR REG_PC = 6, #define REG_PC REG_PC REG___STATUS = 7, #define REG___STATUS REG___STATUS REG_SYSCALLNO = 8, #define REG_SYSCALLNO REG_SYSCALLNO REG_ORIG_GR8 = 9, #define REG_ORIG_GR8 REG_ORIG_GR8 REG_GNER0 = 10, #define REG_GNER0 REG_GNER0 REG_GNER1 = 11, #define REG_GNER1 REG_GNER1 REG_GR0 = 12, #define REG_GR0 REG_GR0 REG_GR1 = 13, #define REG_GR1 REG_GR1 REG_GR2 = 14, #define REG_GR2 REG_GR2 REG_GR3 = 15, #define REG_GR3 REG_GR3 REG_GR4 = 16, #define REG_GR4 REG_GR4 REG_GR5 = 17, #define REG_GR5 REG_GR5 REG_GR6 = 18, #define REG_GR6 REG_GR6 REG_GR7 = 19, #define REG_GR7 REG_GR7 REG_GR8 = 20, #define REG_GR8 REG_GR8 REG_GR9 = 21, #define REG_GR9 REG_GR9 REG_GR10 = 22, #define REG_GR10 REG_GR10 REG_GR11 = 23, #define REG_GR11 REG_GR11 REG_GR12 = 24, #define REG_GR12 REG_GR12 REG_GR13 = 25, #define REG_GR13 REG_GR13 REG_GR14 = 26, #define REG_GR14 REG_GR14 REG_GR15 = 27, #define REG_GR15 REG_GR15 REG_GR16 = 28, #define REG_GR16 REG_GR16 REG_GR17 = 29, #define REG_GR17 REG_GR17 REG_GR18 = 30, #define REG_GR18 REG_GR18 REG_GR19 = 31, #define REG_GR19 REG_GR19 REG_GR20 = 32, #define REG_GR20 REG_GR20 REG_GR21 = 33, #define REG_GR21 REG_GR21 REG_GR22 = 34, #define REG_GR22 REG_GR22 REG_GR23 = 35, #define REG_GR23 REG_GR23 REG_GR24 = 36, #define REG_GR24 REG_GR24 REG_GR25 = 37, #define REG_GR25 REG_GR25 REG_GR26 = 38, #define REG_GR26 REG_GR26 REG_GR27 = 39, #define REG_GR27 REG_GR27 REG_GR28 = 40, #define REG_GR28 REG_GR28 REG_GR29 = 41, #define REG_GR29 REG_GR29 REG_GR30 = 42, #define REG_GR30 REG_GR30 REG_GR31 = 43, #define REG_GR31 REG_GR31 REG_GR32 = 44, #define REG_GR32 REG_GR32 REG_GR33 = 45, #define REG_GR33 REG_GR33 REG_GR34 = 46, #define REG_GR34 REG_GR34 REG_GR35 = 47, #define REG_GR35 REG_GR35 REG_GR36 = 48, #define REG_GR36 REG_GR36 REG_GR37 = 49, #define REG_GR37 REG_GR37 REG_GR38 = 50, #define REG_GR38 REG_GR38 REG_GR39 = 51, #define REG_GR39 REG_GR39 REG_GR40 = 52, #define REG_GR40 REG_GR40 REG_GR41 = 53, #define REG_GR41 REG_GR41 REG_GR42 = 54, #define REG_GR42 REG_GR42 REG_GR43 = 55, #define REG_GR43 REG_GR43 REG_GR44 = 56, #define REG_GR44 REG_GR44 REG_GR45 = 57, #define REG_GR45 REG_GR45 REG_GR46 = 58, #define REG_GR46 REG_GR46 REG_GR47 = 59, #define REG_GR47 REG_GR47 REG_GR48 = 60, #define REG_GR48 REG_GR48 REG_GR49 = 61, #define REG_GR49 REG_GR49 REG_GR50 = 62, #define REG_GR50 REG_GR50 REG_GR51 = 63, #define REG_GR51 REG_GR51 REG_GR52 = 64, #define REG_GR52 REG_GR52 REG_GR53 = 65, #define REG_GR53 REG_GR53 REG_GR54 = 66, #define REG_GR54 REG_GR54 REG_GR55 = 67, #define REG_GR55 REG_GR55 REG_GR56 = 68, #define REG_GR56 REG_GR56 REG_GR57 = 69, #define REG_GR57 REG_GR57 REG_GR58 = 70, #define REG_GR58 REG_GR58 REG_GR59 = 71, #define REG_GR59 REG_GR59 REG_GR60 = 72, #define REG_GR60 REG_GR60 REG_GR61 = 73, #define REG_GR61 REG_GR61 REG_GR62 = 74, #define REG_GR62 REG_GR62 REG_GR63 = 75, #define REG_GR63 REG_GR63 }; #endif typedef unsigned long freg_t; /* Number of FPU registers. */ #define NFPREG (64+2+2+8+2+1) #ifdef __USE_GNU /* Number of each register is the `gregset_t' array. */ enum { REG_FR0 = 0, #define REG_FR0 REG_FR0 REG_FR1 = 1, #define REG_FR1 REG_FR1 REG_FR2 = 2, #define REG_FR2 REG_FR2 REG_FR3 = 3, #define REG_FR3 REG_FR3 REG_FR4 = 4, #define REG_FR4 REG_FR4 REG_FR5 = 5, #define REG_FR5 REG_FR5 REG_FR6 = 6, #define REG_FR6 REG_FR6 REG_FR7 = 7, #define REG_FR7 REG_FR7 REG_FR8 = 8, #define REG_FR8 REG_FR8 REG_FR9 = 9, #define REG_FR9 REG_FR9 REG_FR10 = 10, #define REG_FR10 REG_FR10 REG_FR11 = 11, #define REG_FR11 REG_FR11 REG_FR12 = 12, #define REG_FR12 REG_FR12 REG_FR13 = 13, #define REG_FR13 REG_FR13 REG_FR14 = 14, #define REG_FR14 REG_FR14 REG_FR15 = 15, #define REG_FR15 REG_FR15 REG_FR16 = 16, #define REG_FR16 REG_FR16 REG_FR17 = 17, #define REG_FR17 REG_FR17 REG_FR18 = 18, #define REG_FR18 REG_FR18 REG_FR19 = 19, #define REG_FR19 REG_FR19 REG_FR20 = 20, #define REG_FR20 REG_FR20 REG_FR21 = 21, #define REG_FR21 REG_FR21 REG_FR22 = 22, #define REG_FR22 REG_FR22 REG_FR23 = 23, #define REG_FR23 REG_FR23 REG_FR24 = 24, #define REG_FR24 REG_FR24 REG_FR25 = 25, #define REG_FR25 REG_FR25 REG_FR26 = 26, #define REG_FR26 REG_FR26 REG_FR27 = 27, #define REG_FR27 REG_FR27 REG_FR28 = 28, #define REG_FR28 REG_FR28 REG_FR29 = 29, #define REG_FR29 REG_FR29 REG_FR30 = 30, #define REG_FR30 REG_FR30 REG_FR31 = 31, #define REG_FR31 REG_FR31 REG_FR32 = 32, #define REG_FR32 REG_FR32 REG_FR33 = 33, #define REG_FR33 REG_FR33 REG_FR34 = 34, #define REG_FR34 REG_FR34 REG_FR35 = 35, #define REG_FR35 REG_FR35 REG_FR36 = 36, #define REG_FR36 REG_FR36 REG_FR37 = 37, #define REG_FR37 REG_FR37 REG_FR38 = 38, #define REG_FR38 REG_FR38 REG_FR39 = 39, #define REG_FR39 REG_FR39 REG_FR40 = 40, #define REG_FR40 REG_FR40 REG_FR41 = 41, #define REG_FR41 REG_FR41 REG_FR42 = 42, #define REG_FR42 REG_FR42 REG_FR43 = 43, #define REG_FR43 REG_FR43 REG_FR44 = 44, #define REG_FR44 REG_FR44 REG_FR45 = 45, #define REG_FR45 REG_FR45 REG_FR46 = 46, #define REG_FR46 REG_FR46 REG_FR47 = 47, #define REG_FR47 REG_FR47 REG_FR48 = 48, #define REG_FR48 REG_FR48 REG_FR49 = 49, #define REG_FR49 REG_FR49 REG_FR50 = 50, #define REG_FR50 REG_FR50 REG_FR51 = 51, #define REG_FR51 REG_FR51 REG_FR52 = 52, #define REG_FR52 REG_FR52 REG_FR53 = 53, #define REG_FR53 REG_FR53 REG_FR54 = 54, #define REG_FR54 REG_FR54 REG_FR55 = 55, #define REG_FR55 REG_FR55 REG_FR56 = 56, #define REG_FR56 REG_FR56 REG_FR57 = 57, #define REG_FR57 REG_FR57 REG_FR58 = 58, #define REG_FR58 REG_FR58 REG_FR59 = 59, #define REG_FR59 REG_FR59 REG_FR60 = 60, #define REG_FR60 REG_FR60 REG_FR61 = 61, #define REG_FR61 REG_FR61 REG_FR62 = 62, #define REG_FR62 REG_FR62 REG_FR63 = 63, #define REG_FR63 REG_FR63 REG_FNER0 = 64, #define REG_FNER0 REG_FNER0 REG_FNER1 = 65, #define REG_FNER1 REG_FNER1 REG_MSR0 = 66, #define REG_MSR0 REG_MSR0 REG_MSR1 = 67, #define REG_MSR1 REG_MSR1 REG_ACC0 = 68, #define REG_ACC0 REG_ACC0 REG_ACC1 = 69, #define REG_ACC1 REG_ACC1 REG_ACC2 = 70, #define REG_ACC2 REG_ACC2 REG_ACC3 = 71, #define REG_ACC3 REG_ACC3 REG_ACC4 = 72, #define REG_ACC4 REG_ACC4 REG_ACC5 = 73, #define REG_ACC5 REG_ACC5 REG_ACC6 = 74, #define REG_ACC6 REG_ACC6 REG_ACC7 = 75, #define REG_ACC7 REG_ACC7 REG_ACCG0123 = 76, #define REG_ACCG0123 REG_ACCG0123 REG_ACCG4567 = 77, #define REG_ACCG4567 REG_ACCG4567 REG_FSR0 = 78, #define REG_FSR0 REG_FSR0 }; #endif /* Structure to describe FPU registers. */ typedef freg_t fpregset_t[NFPREG]; /* Context to describe whole processor state. */ typedef struct { gregset_t gregs; fpregset_t fpregs; void *extension; unsigned long sc_oldmask; /* old sigmask */ } __attribute__((aligned(8))) mcontext_t; #ifdef __USE_GNU struct kernel_user_int_regs { /* integer registers * - up to gr[31] mirror pt_regs in the kernel */ unsigned long psr; /* Processor Status Register */ unsigned long isr; /* Integer Status Register */ unsigned long ccr; /* Condition Code Register */ unsigned long cccr; /* Condition Code for Conditional Insns Register */ unsigned long lr; /* Link Register */ unsigned long lcr; /* Loop Count Register */ unsigned long pc; /* Program Counter Register */ unsigned long __status; /* exception status */ unsigned long syscallno; /* syscall number or -1 */ unsigned long orig_gr8; /* original syscall arg #1 */ unsigned long gner[2]; union { unsigned long tbr; unsigned long gr[64]; }; }; struct kernel_user_fpmedia_regs { /* FP/Media registers */ unsigned long fr[64]; unsigned long fner[2]; unsigned long msr[2]; unsigned long acc[8]; unsigned char accg[8]; unsigned long fsr[1]; }; struct kernel_user_context { struct kernel_user_int_regs i; struct kernel_user_fpmedia_regs f; /* we provide a context extension so that we can save the regs for CPUs that * implement many more of Fujitsu's lavish register spec */ void *extension; /* This is not part of the kernel's struct user_context, but rather of the enclosing struct sigcontext, but we add it here to parallel mcontext_t, just for completeness. */ unsigned long sc_oldmask; /* old sigmask */ } __attribute__((aligned(8))); /* This union enables alias-safe casts from mcontext_t* to the union type, that can then be dereferenced as_aliases. */ union kmcontext_t { mcontext_t as_regsets; /* as_aliases is actually missing sc_oldmask, that is present in mcontext_t. */ struct kernel_user_context as_aliases; }; #endif /* Userlevel context. */ typedef struct ucontext { unsigned long int uc_flags; struct ucontext *uc_link; stack_t uc_stack; mcontext_t uc_mcontext; __sigset_t uc_sigmask; } ucontext_t; #endif /* sys/ucontext.h */