Home | History | Annotate | Line # | Download | only in include
      1  1.27  christos /*	$NetBSD: mcontext.h,v 1.27 2024/11/30 01:04:07 christos Exp $	*/
      2   1.2   thorpej 
      3   1.2   thorpej /*-
      4   1.2   thorpej  * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
      5   1.2   thorpej  * All rights reserved.
      6   1.2   thorpej  *
      7   1.2   thorpej  * This code is derived from software contributed to The NetBSD Foundation
      8   1.2   thorpej  * by Klaus Klein and by Jason R. Thorpe of Wasabi Systems, Inc.
      9   1.2   thorpej  *
     10   1.2   thorpej  * Redistribution and use in source and binary forms, with or without
     11   1.2   thorpej  * modification, are permitted provided that the following conditions
     12   1.2   thorpej  * are met:
     13   1.2   thorpej  * 1. Redistributions of source code must retain the above copyright
     14   1.2   thorpej  *    notice, this list of conditions and the following disclaimer.
     15   1.2   thorpej  * 2. Redistributions in binary form must reproduce the above copyright
     16   1.2   thorpej  *    notice, this list of conditions and the following disclaimer in the
     17   1.2   thorpej  *    documentation and/or other materials provided with the distribution.
     18   1.2   thorpej  *
     19   1.2   thorpej  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20   1.2   thorpej  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21   1.2   thorpej  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22   1.2   thorpej  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23   1.2   thorpej  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24   1.2   thorpej  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25   1.2   thorpej  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26   1.2   thorpej  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27   1.2   thorpej  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28   1.2   thorpej  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29   1.2   thorpej  * POSSIBILITY OF SUCH DAMAGE.
     30   1.2   thorpej  */
     31   1.2   thorpej 
     32   1.2   thorpej #ifndef _ARM_MCONTEXT_H_
     33   1.2   thorpej #define _ARM_MCONTEXT_H_
     34   1.2   thorpej 
     35  1.14  christos #include <sys/stdint.h>
     36  1.20       ryo 
     37   1.2   thorpej /*
     38   1.2   thorpej  * General register state
     39   1.2   thorpej  */
     40  1.20       ryo #if defined(__aarch64__)
     41  1.22       ryo #define _NGREG		35	/* GR0-30, SP, PC, SPSR, TPIDR */
     42  1.20       ryo #define _NGREG32	17
     43  1.20       ryo typedef __uint64_t	__greg_t;
     44  1.20       ryo typedef unsigned int	__greg32_t;
     45  1.20       ryo 
     46  1.20       ryo typedef __greg32_t	__gregset32_t[_NGREG32];
     47  1.20       ryo #elif defined(__arm__)
     48   1.2   thorpej #define _NGREG		17
     49   1.2   thorpej typedef unsigned int	__greg_t;
     50  1.20       ryo #endif
     51  1.20       ryo 
     52   1.2   thorpej typedef __greg_t	__gregset_t[_NGREG];
     53   1.2   thorpej 
     54   1.2   thorpej #define _REG_R0		0
     55   1.2   thorpej #define _REG_R1		1
     56   1.2   thorpej #define _REG_R2		2
     57   1.2   thorpej #define _REG_R3		3
     58   1.2   thorpej #define _REG_R4		4
     59   1.2   thorpej #define _REG_R5		5
     60   1.2   thorpej #define _REG_R6		6
     61   1.2   thorpej #define _REG_R7		7
     62   1.2   thorpej #define _REG_R8		8
     63   1.2   thorpej #define _REG_R9		9
     64   1.2   thorpej #define _REG_R10	10
     65   1.2   thorpej #define _REG_R11	11
     66   1.2   thorpej #define _REG_R12	12
     67   1.2   thorpej #define _REG_R13	13
     68   1.2   thorpej #define _REG_R14	14
     69   1.2   thorpej #define _REG_R15	15
     70   1.2   thorpej #define _REG_CPSR	16
     71  1.20       ryo 
     72  1.20       ryo #define _REG_X0		0
     73  1.20       ryo #define _REG_X1		1
     74  1.20       ryo #define _REG_X2		2
     75  1.20       ryo #define _REG_X3		3
     76  1.20       ryo #define _REG_X4		4
     77  1.20       ryo #define _REG_X5		5
     78  1.20       ryo #define _REG_X6		6
     79  1.20       ryo #define _REG_X7		7
     80  1.20       ryo #define _REG_X8		8
     81  1.20       ryo #define _REG_X9		9
     82  1.20       ryo #define _REG_X10	10
     83  1.20       ryo #define _REG_X11	11
     84  1.20       ryo #define _REG_X12	12
     85  1.20       ryo #define _REG_X13	13
     86  1.20       ryo #define _REG_X14	14
     87  1.20       ryo #define _REG_X15	15
     88  1.20       ryo #define _REG_X16	16
     89  1.20       ryo #define _REG_X17	17
     90  1.20       ryo #define _REG_X18	18
     91  1.20       ryo #define _REG_X19	19
     92  1.20       ryo #define _REG_X20	20
     93  1.20       ryo #define _REG_X21	21
     94  1.20       ryo #define _REG_X22	22
     95  1.20       ryo #define _REG_X23	23
     96  1.20       ryo #define _REG_X24	24
     97  1.20       ryo #define _REG_X25	25
     98  1.20       ryo #define _REG_X26	26
     99  1.20       ryo #define _REG_X27	27
    100  1.20       ryo #define _REG_X28	28
    101  1.20       ryo #define _REG_X29	29
    102  1.20       ryo #define _REG_X30	30
    103  1.20       ryo #define _REG_X31	31
    104  1.20       ryo #define _REG_ELR	32
    105  1.20       ryo #define _REG_SPSR	33
    106  1.20       ryo #define _REG_TPIDR	34
    107  1.20       ryo 
    108   1.2   thorpej /* Convenience synonyms */
    109  1.20       ryo 
    110  1.20       ryo #if defined(__aarch64__)
    111  1.20       ryo #define _REG_RV		_REG_X0
    112  1.20       ryo #define _REG_FP		_REG_X29
    113  1.20       ryo #define _REG_LR		_REG_X30
    114  1.20       ryo #define _REG_SP		_REG_X31
    115  1.20       ryo #define _REG_PC		_REG_ELR
    116  1.20       ryo #elif defined(__arm__)
    117  1.20       ryo #define _REG_RV		_REG_R0
    118   1.2   thorpej #define _REG_FP		_REG_R11
    119   1.2   thorpej #define _REG_SP		_REG_R13
    120   1.2   thorpej #define _REG_LR		_REG_R14
    121   1.2   thorpej #define _REG_PC		_REG_R15
    122  1.20       ryo #endif
    123   1.2   thorpej 
    124   1.2   thorpej /*
    125   1.2   thorpej  * Floating point register state
    126   1.2   thorpej  */
    127  1.20       ryo #if defined(__aarch64__)
    128  1.20       ryo 
    129  1.20       ryo #define _NFREG	32			/* Number of SIMD registers */
    130  1.20       ryo 
    131  1.20       ryo typedef struct {
    132  1.20       ryo 	union __freg {
    133  1.20       ryo 		__uint8_t	__b8[16];
    134  1.20       ryo 		__uint16_t	__h16[8];
    135  1.20       ryo 		__uint32_t	__s32[4];
    136  1.20       ryo 		__uint64_t	__d64[2];
    137  1.20       ryo 		__uint128_t	__q128[1];
    138  1.20       ryo 	}		__qregs[_NFREG] __aligned(16);
    139  1.20       ryo 	__uint32_t	__fpcr;		/* FPCR */
    140  1.20       ryo 	__uint32_t	__fpsr;		/* FPSR */
    141  1.20       ryo } __fregset_t;
    142  1.20       ryo 
    143  1.20       ryo /* Compat structures */
    144  1.20       ryo typedef struct {
    145  1.21       ryo #if 1 /* __ARM_EABI__ is default on aarch64 */
    146  1.20       ryo 	unsigned int	__vfp_fpscr;
    147  1.20       ryo 	uint64_t	__vfp_fstmx[32];
    148  1.20       ryo 	unsigned int	__vfp_fpsid;
    149  1.20       ryo #else
    150  1.20       ryo 	unsigned int	__vfp_fpscr;
    151  1.20       ryo 	unsigned int	__vfp_fstmx[33];
    152  1.20       ryo 	unsigned int	__vfp_fpsid;
    153  1.20       ryo #endif
    154  1.20       ryo } __vfpregset32_t;
    155  1.20       ryo 
    156  1.20       ryo typedef struct {
    157  1.20       ryo 	__gregset32_t	__gregs;
    158  1.20       ryo 	__vfpregset32_t __vfpregs;
    159  1.20       ryo 	__greg32_t	_mc_tlsbase;
    160  1.20       ryo 	__greg32_t	_mc_user_tpid;
    161  1.20       ryo } mcontext32_t;
    162  1.20       ryo 
    163  1.20       ryo typedef struct {
    164  1.20       ryo 	__gregset_t	__gregs;	/* General Purpose Register set */
    165  1.20       ryo 	__fregset_t	__fregs;	/* FPU/SIMD Register File */
    166  1.20       ryo 	__greg_t	__spare[8];	/* future proof */
    167  1.20       ryo } mcontext_t;
    168  1.20       ryo 
    169  1.20       ryo #elif defined(__arm__)
    170   1.2   thorpej /* Note: the storage layout of this structure must be identical to ARMFPE! */
    171   1.2   thorpej typedef struct {
    172   1.2   thorpej 	unsigned int	__fp_fpsr;
    173   1.2   thorpej 	struct {
    174   1.2   thorpej 		unsigned int	__fp_exponent;
    175   1.2   thorpej 		unsigned int	__fp_mantissa_hi;
    176   1.2   thorpej 		unsigned int	__fp_mantissa_lo;
    177   1.2   thorpej 	}		__fp_fr[8];
    178   1.2   thorpej } __fpregset_t;
    179   1.2   thorpej 
    180   1.2   thorpej typedef struct {
    181  1.13      matt #ifdef __ARM_EABI__
    182  1.13      matt 	unsigned int	__vfp_fpscr;
    183  1.13      matt 	uint64_t	__vfp_fstmx[32];
    184  1.13      matt 	unsigned int	__vfp_fpsid;
    185  1.13      matt #else
    186   1.2   thorpej 	unsigned int	__vfp_fpscr;
    187   1.2   thorpej 	unsigned int	__vfp_fstmx[33];
    188   1.2   thorpej 	unsigned int	__vfp_fpsid;
    189  1.13      matt #endif
    190   1.2   thorpej } __vfpregset_t;
    191   1.2   thorpej 
    192   1.2   thorpej typedef struct {
    193   1.2   thorpej 	__gregset_t	__gregs;
    194   1.2   thorpej 	union {
    195   1.2   thorpej 		__fpregset_t __fpregs;
    196   1.2   thorpej 		__vfpregset_t __vfpregs;
    197   1.2   thorpej 	} __fpu;
    198   1.8     joerg 	__greg_t	_mc_tlsbase;
    199  1.18      matt 	__greg_t	_mc_user_tpid;
    200  1.11      matt } mcontext_t, mcontext32_t;
    201   1.2   thorpej 
    202   1.8     joerg 
    203  1.18      matt #define _UC_MACHINE_PAD	1		/* Padding appended to ucontext_t */
    204   1.2   thorpej 
    205  1.15      matt #ifdef __ARM_EABI__
    206  1.15      matt #define	__UCONTEXT_SIZE	(256 + 144)
    207  1.15      matt #else
    208   1.7     joerg #define	__UCONTEXT_SIZE	256
    209  1.15      matt #endif
    210   1.7     joerg 
    211  1.20       ryo #endif
    212  1.20       ryo 
    213  1.20       ryo /* Machine-dependent uc_flags */
    214  1.24   thorpej #define _UC_TLSBASE	_UC_MD_BIT19	/* see <sys/ucontext.h> */
    215  1.20       ryo 
    216  1.20       ryo /* Machine-dependent uc_flags for arm */
    217  1.24   thorpej #define	_UC_ARM_VFP	_UC_MD_BIT16	/* FPU field is VFP */
    218  1.20       ryo 
    219  1.20       ryo /* used by signal delivery to indicate status of signal stack */
    220  1.24   thorpej #define _UC_SETSTACK	_UC_MD_BIT17
    221  1.24   thorpej #define _UC_CLRSTACK	_UC_MD_BIT18
    222  1.20       ryo 
    223  1.20       ryo #define _UC_MACHINE_SP(uc)	((uc)->uc_mcontext.__gregs[_REG_SP])
    224  1.20       ryo #define _UC_MACHINE_FP(uc)	((uc)->uc_mcontext.__gregs[_REG_FP])
    225  1.20       ryo #define _UC_MACHINE_PC(uc)	((uc)->uc_mcontext.__gregs[_REG_PC])
    226  1.20       ryo #define _UC_MACHINE_INTRV(uc)	((uc)->uc_mcontext.__gregs[_REG_RV])
    227  1.20       ryo 
    228  1.20       ryo #define _UC_MACHINE_SET_PC(uc, pc)	\
    229  1.20       ryo 				_UC_MACHINE_PC(uc) = (pc)
    230   1.9      matt 
    231  1.12      matt #if defined(_KERNEL)
    232  1.20       ryo __BEGIN_DECLS
    233  1.12      matt void vfp_getcontext(struct lwp *, mcontext_t *, int *);
    234  1.23     skrll void vfp_setcontext(struct lwp *, const mcontext_t *);
    235  1.20       ryo __END_DECLS
    236  1.12      matt #endif
    237  1.12      matt 
    238   1.2   thorpej #endif	/* !_ARM_MCONTEXT_H_ */
    239