1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #ifndef _SYS_UCONTEXT_H_ 30 #define _SYS_UCONTEXT_H_ 31 32 #include <sys/cdefs.h> 33 34 #include <signal.h> 35 #include <sys/user.h> 36 37 __BEGIN_DECLS 38 39 #if defined(__arm__) 40 41 enum { 42 REG_R0 = 0, 43 #define REG_R0 REG_R0 44 REG_R1, 45 #define REG_R1 REG_R1 46 REG_R2, 47 #define REG_R2 REG_R2 48 REG_R3, 49 #define REG_R3 REG_R3 50 REG_R4, 51 #define REG_R4 REG_R4 52 REG_R5, 53 #define REG_R5 REG_R5 54 REG_R6, 55 #define REG_R6 REG_R6 56 REG_R7, 57 #define REG_R7 REG_R7 58 REG_R8, 59 #define REG_R8 REG_R8 60 REG_R9, 61 #define REG_R9 REG_R9 62 REG_R10, 63 #define REG_R10 REG_R10 64 REG_R11, 65 #define REG_R11 REG_R11 66 REG_R12, 67 #define REG_R12 REG_R12 68 REG_R13, 69 #define REG_R13 REG_R13 70 REG_R14, 71 #define REG_R14 REG_R14 72 REG_R15, 73 #define REG_R15 REG_R15 74 }; 75 76 #define NGREG 18 /* Like glibc. */ 77 78 typedef int greg_t; 79 typedef greg_t gregset_t[NGREG]; 80 typedef struct user_fpregs fpregset_t; 81 82 #include <asm/sigcontext.h> 83 typedef struct sigcontext mcontext_t; 84 85 typedef struct ucontext { 86 unsigned long uc_flags; 87 struct ucontext* uc_link; 88 stack_t uc_stack; 89 mcontext_t uc_mcontext; 90 union { 91 struct { 92 sigset_t uc_sigmask; 93 /* Android has a wrong (smaller) sigset_t on ARM. */ 94 uint32_t __padding_rt_sigset; 95 }; 96 sigset64_t uc_sigmask64; 97 }; 98 /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM. */ 99 char __padding[120]; 100 unsigned long uc_regspace[128] __attribute__((__aligned__(8))); 101 } ucontext_t; 102 103 #elif defined(__aarch64__) 104 105 #define NGREG 34 /* x0..x30 + sp + pc + pstate */ 106 typedef unsigned long greg_t; 107 typedef greg_t gregset_t[NGREG]; 108 typedef struct user_fpsimd_struct fpregset_t; 109 110 #include <asm/sigcontext.h> 111 typedef struct sigcontext mcontext_t; 112 113 typedef struct ucontext { 114 unsigned long uc_flags; 115 struct ucontext *uc_link; 116 stack_t uc_stack; 117 union { 118 sigset_t uc_sigmask; 119 sigset64_t uc_sigmask64; 120 }; 121 /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64. */ 122 char __padding[128 - sizeof(sigset_t)]; 123 mcontext_t uc_mcontext; 124 } ucontext_t; 125 126 #elif defined(__i386__) 127 128 enum { 129 REG_GS = 0, 130 #define REG_GS REG_GS 131 REG_FS, 132 #define REG_FS REG_FS 133 REG_ES, 134 #define REG_ES REG_ES 135 REG_DS, 136 #define REG_DS REG_DS 137 REG_EDI, 138 #define REG_EDI REG_EDI 139 REG_ESI, 140 #define REG_ESI REG_ESI 141 REG_EBP, 142 #define REG_EBP REG_EBP 143 REG_ESP, 144 #define REG_ESP REG_ESP 145 REG_EBX, 146 #define REG_EBX REG_EBX 147 REG_EDX, 148 #define REG_EDX REG_EDX 149 REG_ECX, 150 #define REG_ECX REG_ECX 151 REG_EAX, 152 #define REG_EAX REG_EAX 153 REG_TRAPNO, 154 #define REG_TRAPNO REG_TRAPNO 155 REG_ERR, 156 #define REG_ERR REG_ERR 157 REG_EIP, 158 #define REG_EIP REG_EIP 159 REG_CS, 160 #define REG_CS REG_CS 161 REG_EFL, 162 #define REG_EFL REG_EFL 163 REG_UESP, 164 #define REG_UESP REG_UESP 165 REG_SS, 166 #define REG_SS REG_SS 167 NGREG 168 #define NGREG NGREG 169 }; 170 171 typedef int greg_t; 172 typedef greg_t gregset_t[NGREG]; 173 174 struct _libc_fpreg { 175 unsigned short significand[4]; 176 unsigned short exponent; 177 }; 178 179 struct _libc_fpstate { 180 unsigned long cw; 181 unsigned long sw; 182 unsigned long tag; 183 unsigned long ipoff; 184 unsigned long cssel; 185 unsigned long dataoff; 186 unsigned long datasel; 187 struct _libc_fpreg _st[8]; 188 unsigned long status; 189 }; 190 191 typedef struct _libc_fpstate* fpregset_t; 192 193 typedef struct { 194 gregset_t gregs; 195 fpregset_t fpregs; 196 unsigned long oldmask; 197 unsigned long cr2; 198 } mcontext_t; 199 200 typedef struct ucontext { 201 unsigned long uc_flags; 202 struct ucontext* uc_link; 203 stack_t uc_stack; 204 mcontext_t uc_mcontext; 205 union { 206 struct { 207 sigset_t uc_sigmask; 208 /* Android has a wrong (smaller) sigset_t on x86. */ 209 uint32_t __padding_rt_sigset; 210 }; 211 sigset64_t uc_sigmask64; 212 }; 213 struct _libc_fpstate __fpregs_mem; 214 } ucontext_t; 215 216 #elif defined(__x86_64__) 217 218 enum { 219 REG_R8 = 0, 220 #define REG_R8 REG_R8 221 REG_R9, 222 #define REG_R9 REG_R9 223 REG_R10, 224 #define REG_R10 REG_R10 225 REG_R11, 226 #define REG_R11 REG_R11 227 REG_R12, 228 #define REG_R12 REG_R12 229 REG_R13, 230 #define REG_R13 REG_R13 231 REG_R14, 232 #define REG_R14 REG_R14 233 REG_R15, 234 #define REG_R15 REG_R15 235 REG_RDI, 236 #define REG_RDI REG_RDI 237 REG_RSI, 238 #define REG_RSI REG_RSI 239 REG_RBP, 240 #define REG_RBP REG_RBP 241 REG_RBX, 242 #define REG_RBX REG_RBX 243 REG_RDX, 244 #define REG_RDX REG_RDX 245 REG_RAX, 246 #define REG_RAX REG_RAX 247 REG_RCX, 248 #define REG_RCX REG_RCX 249 REG_RSP, 250 #define REG_RSP REG_RSP 251 REG_RIP, 252 #define REG_RIP REG_RIP 253 REG_EFL, 254 #define REG_EFL REG_EFL 255 REG_CSGSFS, 256 #define REG_CSGSFS REG_CSGSFS 257 REG_ERR, 258 #define REG_ERR REG_ERR 259 REG_TRAPNO, 260 #define REG_TRAPNO REG_TRAPNO 261 REG_OLDMASK, 262 #define REG_OLDMASK REG_OLDMASK 263 REG_CR2, 264 #define REG_CR2 REG_CR2 265 NGREG 266 #define NGREG NGREG 267 }; 268 269 typedef long greg_t; 270 typedef greg_t gregset_t[NGREG]; 271 272 struct _libc_fpxreg { 273 unsigned short significand[4]; 274 unsigned short exponent; 275 unsigned short padding[3]; 276 }; 277 278 struct _libc_xmmreg { 279 uint32_t element[4]; 280 }; 281 282 struct _libc_fpstate { 283 uint16_t cwd; 284 uint16_t swd; 285 uint16_t ftw; 286 uint16_t fop; 287 uint64_t rip; 288 uint64_t rdp; 289 uint32_t mxcsr; 290 uint32_t mxcr_mask; 291 struct _libc_fpxreg _st[8]; 292 struct _libc_xmmreg _xmm[16]; 293 uint32_t padding[24]; 294 }; 295 296 typedef struct _libc_fpstate* fpregset_t; 297 298 typedef struct { 299 gregset_t gregs; 300 fpregset_t fpregs; 301 unsigned long __reserved1[8]; 302 } mcontext_t; 303 304 typedef struct ucontext { 305 unsigned long uc_flags; 306 struct ucontext* uc_link; 307 stack_t uc_stack; 308 mcontext_t uc_mcontext; 309 union { 310 sigset_t uc_sigmask; 311 sigset64_t uc_sigmask64; 312 }; 313 struct _libc_fpstate __fpregs_mem; 314 } ucontext_t; 315 316 #endif 317 318 __END_DECLS 319 320 #endif /* _SYS_UCONTEXT_H_ */ 321