| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 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 |  | 
| Elliott Hughes | 203e13d | 2016-07-22 14:56:18 -0700 | [diff] [blame] | 32 | #include <sys/cdefs.h> | 
| Josh Gao | 16016df | 2016-11-07 18:27:16 -0800 | [diff] [blame] | 33 |  | 
 | 34 | #include <signal.h> | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 35 | #include <sys/user.h> | 
 | 36 |  | 
 | 37 | __BEGIN_DECLS | 
 | 38 |  | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 39 | #if defined(__arm__) | 
 | 40 |  | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 41 | enum { | 
 | 42 |   REG_R0 = 0, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 43 | #define REG_R0 REG_R0 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 44 |   REG_R1, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 45 | #define REG_R1 REG_R1 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 46 |   REG_R2, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 47 | #define REG_R2 REG_R2 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 48 |   REG_R3, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 49 | #define REG_R3 REG_R3 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 50 |   REG_R4, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 51 | #define REG_R4 REG_R4 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 52 |   REG_R5, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 53 | #define REG_R5 REG_R5 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 54 |   REG_R6, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 55 | #define REG_R6 REG_R6 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 56 |   REG_R7, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 57 | #define REG_R7 REG_R7 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 58 |   REG_R8, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 59 | #define REG_R8 REG_R8 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 60 |   REG_R9, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 61 | #define REG_R9 REG_R9 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 62 |   REG_R10, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 63 | #define REG_R10 REG_R10 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 64 |   REG_R11, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 65 | #define REG_R11 REG_R11 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 66 |   REG_R12, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 67 | #define REG_R12 REG_R12 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 68 |   REG_R13, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 69 | #define REG_R13 REG_R13 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 70 |   REG_R14, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 71 | #define REG_R14 REG_R14 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 72 |   REG_R15, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 73 | #define REG_R15 REG_R15 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 74 | }; | 
 | 75 |  | 
 | 76 | #define NGREG 18 /* Like glibc. */ | 
 | 77 |  | 
 | 78 | typedef int greg_t; | 
 | 79 | typedef greg_t gregset_t[NGREG]; | 
| Dan Albert | bf18c61 | 2015-03-04 10:31:29 -0800 | [diff] [blame] | 80 | typedef struct user_fpregs fpregset_t; | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 81 |  | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 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; | 
| Elliott Hughes | 23415fc | 2018-02-13 19:09:04 -0800 | [diff] [blame] | 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 |   }; | 
| Elliott Hughes | 3ba55f8 | 2016-06-08 18:11:23 -0700 | [diff] [blame] | 98 |   /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM. */ | 
| Calin Juravle | bdca380 | 2014-05-28 15:56:46 +0100 | [diff] [blame] | 99 |   char __padding[120]; | 
| Calin Juravle | 0e85fb6 | 2014-05-19 19:14:03 +0100 | [diff] [blame] | 100 |   unsigned long uc_regspace[128] __attribute__((__aligned__(8))); | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 101 | } ucontext_t; | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 102 |  | 
| Ross McIlroy | 7b95807 | 2014-01-31 04:45:53 +0000 | [diff] [blame] | 103 | #elif defined(__aarch64__) | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 104 |  | 
| Elliott Hughes | 8e4d371 | 2014-09-19 10:31:49 -0700 | [diff] [blame] | 105 | #define NGREG 34 /* x0..x30 + sp + pc + pstate */ | 
 | 106 | typedef unsigned long greg_t; | 
 | 107 | typedef greg_t gregset_t[NGREG]; | 
| Elliott Hughes | 0577733 | 2015-06-15 18:47:39 -0700 | [diff] [blame] | 108 | typedef struct user_fpsimd_struct fpregset_t; | 
| Dan Albert | bf18c61 | 2015-03-04 10:31:29 -0800 | [diff] [blame] | 109 |  | 
| Ross McIlroy | 7b95807 | 2014-01-31 04:45:53 +0000 | [diff] [blame] | 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; | 
| Elliott Hughes | 23415fc | 2018-02-13 19:09:04 -0800 | [diff] [blame] | 117 |   union { | 
 | 118 |     sigset_t uc_sigmask; | 
 | 119 |     sigset64_t uc_sigmask64; | 
 | 120 |   }; | 
| Elliott Hughes | 3ba55f8 | 2016-06-08 18:11:23 -0700 | [diff] [blame] | 121 |   /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64. */ | 
| Elliott Hughes | 50249bc | 2014-04-07 14:36:59 -0700 | [diff] [blame] | 122 |   char __padding[128 - sizeof(sigset_t)]; | 
| Ross McIlroy | 7b95807 | 2014-01-31 04:45:53 +0000 | [diff] [blame] | 123 |   mcontext_t uc_mcontext; | 
 | 124 | } ucontext_t; | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 125 |  | 
 | 126 | #elif defined(__i386__) | 
 | 127 |  | 
 | 128 | enum { | 
 | 129 |   REG_GS = 0, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 130 | #define REG_GS REG_GS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 131 |   REG_FS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 132 | #define REG_FS REG_FS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 133 |   REG_ES, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 134 | #define REG_ES REG_ES | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 135 |   REG_DS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 136 | #define REG_DS REG_DS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 137 |   REG_EDI, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 138 | #define REG_EDI REG_EDI | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 139 |   REG_ESI, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 140 | #define REG_ESI REG_ESI | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 141 |   REG_EBP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 142 | #define REG_EBP REG_EBP | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 143 |   REG_ESP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 144 | #define REG_ESP REG_ESP | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 145 |   REG_EBX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 146 | #define REG_EBX REG_EBX | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 147 |   REG_EDX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 148 | #define REG_EDX REG_EDX | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 149 |   REG_ECX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 150 | #define REG_ECX REG_ECX | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 151 |   REG_EAX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 152 | #define REG_EAX REG_EAX | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 153 |   REG_TRAPNO, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 154 | #define REG_TRAPNO REG_TRAPNO | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 155 |   REG_ERR, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 156 | #define REG_ERR REG_ERR | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 157 |   REG_EIP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 158 | #define REG_EIP REG_EIP | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 159 |   REG_CS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 160 | #define REG_CS REG_CS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 161 |   REG_EFL, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 162 | #define REG_EFL REG_EFL | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 163 |   REG_UESP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 164 | #define REG_UESP REG_UESP | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 165 |   REG_SS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 166 | #define REG_SS REG_SS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 167 |   NGREG | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 168 | #define NGREG NGREG | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 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; | 
| Elliott Hughes | 23415fc | 2018-02-13 19:09:04 -0800 | [diff] [blame] | 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 |   }; | 
| Calin Juravle | a6ab968 | 2014-05-13 20:29:01 +0100 | [diff] [blame] | 213 |   struct _libc_fpstate __fpregs_mem; | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 214 | } ucontext_t; | 
 | 215 |  | 
 | 216 | #elif defined(__mips__) | 
 | 217 |  | 
| Elliott Hughes | 02c661b | 2014-01-29 18:37:15 -0800 | [diff] [blame] | 218 | /* glibc doesn't have names for MIPS registers. */ | 
 | 219 |  | 
 | 220 | #define NGREG 32 | 
 | 221 | #define NFPREG 32 | 
 | 222 |  | 
 | 223 | typedef unsigned long long greg_t; | 
 | 224 | typedef greg_t gregset_t[NGREG]; | 
 | 225 |  | 
 | 226 | typedef struct fpregset { | 
 | 227 |   union { | 
 | 228 |     double fp_dregs[NFPREG]; | 
 | 229 |     struct { | 
 | 230 |       float _fp_fregs; | 
 | 231 |       unsigned _fp_pad; | 
 | 232 |     } fp_fregs[NFPREG]; | 
 | 233 |   } fp_r; | 
 | 234 | } fpregset_t; | 
 | 235 |  | 
| Faraz Shahbazker | e247e1c | 2015-01-05 13:27:30 -0800 | [diff] [blame] | 236 | #ifdef __LP64__ | 
 | 237 | typedef struct { | 
 | 238 |   gregset_t gregs; | 
 | 239 |   fpregset_t fpregs; | 
 | 240 |   greg_t mdhi; | 
 | 241 |   greg_t hi1; | 
 | 242 |   greg_t hi2; | 
 | 243 |   greg_t hi3; | 
 | 244 |   greg_t mdlo; | 
 | 245 |   greg_t lo1; | 
 | 246 |   greg_t lo2; | 
 | 247 |   greg_t lo3; | 
 | 248 |   greg_t pc; | 
 | 249 |   uint32_t fpc_csr; | 
 | 250 |   uint32_t used_math; | 
 | 251 |   uint32_t dsp; | 
 | 252 |   uint32_t reserved; | 
 | 253 | } mcontext_t; | 
 | 254 | #else | 
| Elliott Hughes | 02c661b | 2014-01-29 18:37:15 -0800 | [diff] [blame] | 255 | typedef struct { | 
 | 256 |   unsigned regmask; | 
 | 257 |   unsigned status; | 
 | 258 |   greg_t pc; | 
 | 259 |   gregset_t gregs; | 
 | 260 |   fpregset_t fpregs; | 
 | 261 |   unsigned fp_owned; | 
 | 262 |   unsigned fpc_csr; | 
 | 263 |   unsigned fpc_eir; | 
 | 264 |   unsigned used_math; | 
 | 265 |   unsigned dsp; | 
 | 266 |   greg_t mdhi; | 
 | 267 |   greg_t mdlo; | 
 | 268 |   unsigned long hi1; | 
 | 269 |   unsigned long lo1; | 
 | 270 |   unsigned long hi2; | 
 | 271 |   unsigned long lo2; | 
 | 272 |   unsigned long hi3; | 
 | 273 |   unsigned long lo3; | 
 | 274 | } mcontext_t; | 
| Faraz Shahbazker | e247e1c | 2015-01-05 13:27:30 -0800 | [diff] [blame] | 275 | #endif | 
| Elliott Hughes | 02c661b | 2014-01-29 18:37:15 -0800 | [diff] [blame] | 276 |  | 
 | 277 | typedef struct ucontext { | 
 | 278 |   unsigned long uc_flags; | 
 | 279 |   struct ucontext* uc_link; | 
 | 280 |   stack_t uc_stack; | 
 | 281 |   mcontext_t uc_mcontext; | 
| Elliott Hughes | 23415fc | 2018-02-13 19:09:04 -0800 | [diff] [blame] | 282 |   union { | 
 | 283 |     sigset_t uc_sigmask; | 
 | 284 |     sigset64_t uc_sigmask64; | 
 | 285 |   }; | 
| Elliott Hughes | 02c661b | 2014-01-29 18:37:15 -0800 | [diff] [blame] | 286 | } ucontext_t; | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 287 |  | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 288 | #elif defined(__x86_64__) | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 289 |  | 
 | 290 | enum { | 
 | 291 |   REG_R8 = 0, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 292 | #define REG_R8 REG_R8 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 293 |   REG_R9, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 294 | #define REG_R9 REG_R9 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 295 |   REG_R10, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 296 | #define REG_R10 REG_R10 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 297 |   REG_R11, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 298 | #define REG_R11 REG_R11 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 299 |   REG_R12, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 300 | #define REG_R12 REG_R12 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 301 |   REG_R13, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 302 | #define REG_R13 REG_R13 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 303 |   REG_R14, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 304 | #define REG_R14 REG_R14 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 305 |   REG_R15, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 306 | #define REG_R15 REG_R15 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 307 |   REG_RDI, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 308 | #define REG_RDI REG_RDI | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 309 |   REG_RSI, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 310 | #define REG_RSI REG_RSI | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 311 |   REG_RBP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 312 | #define REG_RBP REG_RBP | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 313 |   REG_RBX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 314 | #define REG_RBX REG_RBX | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 315 |   REG_RDX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 316 | #define REG_RDX REG_RDX | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 317 |   REG_RAX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 318 | #define REG_RAX REG_RAX | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 319 |   REG_RCX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 320 | #define REG_RCX REG_RCX | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 321 |   REG_RSP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 322 | #define REG_RSP REG_RSP | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 323 |   REG_RIP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 324 | #define REG_RIP REG_RIP | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 325 |   REG_EFL, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 326 | #define REG_EFL REG_EFL | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 327 |   REG_CSGSFS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 328 | #define REG_CSGSFS REG_CSGSFS | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 329 |   REG_ERR, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 330 | #define REG_ERR REG_ERR | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 331 |   REG_TRAPNO, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 332 | #define REG_TRAPNO REG_TRAPNO | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 333 |   REG_OLDMASK, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 334 | #define REG_OLDMASK REG_OLDMASK | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 335 |   REG_CR2, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 336 | #define REG_CR2 REG_CR2 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 337 |   NGREG | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 338 | #define NGREG NGREG | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 339 | }; | 
 | 340 |  | 
 | 341 | typedef long greg_t; | 
 | 342 | typedef greg_t gregset_t[NGREG]; | 
 | 343 |  | 
| Calin Juravle | a6ab968 | 2014-05-13 20:29:01 +0100 | [diff] [blame] | 344 | struct _libc_fpxreg { | 
 | 345 |   unsigned short significand[4]; | 
 | 346 |   unsigned short exponent; | 
 | 347 |   unsigned short padding[3]; | 
 | 348 | }; | 
 | 349 |  | 
 | 350 | struct _libc_xmmreg { | 
 | 351 |   uint32_t element[4]; | 
 | 352 | }; | 
 | 353 |  | 
 | 354 | struct _libc_fpstate { | 
 | 355 |   uint16_t cwd; | 
 | 356 |   uint16_t swd; | 
 | 357 |   uint16_t ftw; | 
 | 358 |   uint16_t fop; | 
 | 359 |   uint64_t rip; | 
 | 360 |   uint64_t rdp; | 
 | 361 |   uint32_t mxcsr; | 
 | 362 |   uint32_t mxcr_mask; | 
 | 363 |   struct _libc_fpxreg _st[8]; | 
 | 364 |   struct _libc_xmmreg _xmm[16]; | 
 | 365 |   uint32_t padding[24]; | 
 | 366 | }; | 
 | 367 |  | 
 | 368 | typedef struct _libc_fpstate* fpregset_t; | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 369 |  | 
 | 370 | typedef struct { | 
 | 371 |   gregset_t gregs; | 
 | 372 |   fpregset_t fpregs; | 
| Elliott Hughes | c5992a0 | 2014-04-09 13:27:48 -0700 | [diff] [blame] | 373 |   unsigned long __reserved1[8]; | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 374 | } mcontext_t; | 
 | 375 |  | 
 | 376 | typedef struct ucontext { | 
 | 377 |   unsigned long uc_flags; | 
 | 378 |   struct ucontext* uc_link; | 
 | 379 |   stack_t uc_stack; | 
 | 380 |   mcontext_t uc_mcontext; | 
| Elliott Hughes | 23415fc | 2018-02-13 19:09:04 -0800 | [diff] [blame] | 381 |   union { | 
 | 382 |     sigset_t uc_sigmask; | 
 | 383 |     sigset64_t uc_sigmask64; | 
 | 384 |   }; | 
| Calin Juravle | a6ab968 | 2014-05-13 20:29:01 +0100 | [diff] [blame] | 385 |   struct _libc_fpstate __fpregs_mem; | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 386 | } ucontext_t; | 
 | 387 |  | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 388 | #endif | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 389 |  | 
 | 390 | __END_DECLS | 
 | 391 |  | 
 | 392 | #endif /* _SYS_UCONTEXT_H_ */ |