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