| 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 |  | 
| Elliott Hughes | 4043e5e | 2022-10-10 19:07:16 +0000 | [diff] [blame] | 29 | #pragma once | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 30 |  | 
| Elliott Hughes | 203e13d | 2016-07-22 14:56:18 -0700 | [diff] [blame] | 31 | #include <sys/cdefs.h> | 
| Josh Gao | 16016df | 2016-11-07 18:27:16 -0800 | [diff] [blame] | 32 |  | 
|  | 33 | #include <signal.h> | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 34 | #include <sys/user.h> | 
|  | 35 |  | 
|  | 36 | __BEGIN_DECLS | 
|  | 37 |  | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 38 | #if defined(__arm__) | 
|  | 39 |  | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 40 | enum { | 
|  | 41 | REG_R0 = 0, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 42 | #define REG_R0 REG_R0 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 43 | REG_R1, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 44 | #define REG_R1 REG_R1 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 45 | REG_R2, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 46 | #define REG_R2 REG_R2 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 47 | REG_R3, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 48 | #define REG_R3 REG_R3 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 49 | REG_R4, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 50 | #define REG_R4 REG_R4 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 51 | REG_R5, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 52 | #define REG_R5 REG_R5 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 53 | REG_R6, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 54 | #define REG_R6 REG_R6 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 55 | REG_R7, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 56 | #define REG_R7 REG_R7 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 57 | REG_R8, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 58 | #define REG_R8 REG_R8 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 59 | REG_R9, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 60 | #define REG_R9 REG_R9 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 61 | REG_R10, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 62 | #define REG_R10 REG_R10 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 63 | REG_R11, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 64 | #define REG_R11 REG_R11 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 65 | REG_R12, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 66 | #define REG_R12 REG_R12 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 67 | REG_R13, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 68 | #define REG_R13 REG_R13 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 69 | REG_R14, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 70 | #define REG_R14 REG_R14 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 71 | REG_R15, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 72 | #define REG_R15 REG_R15 | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 73 | }; | 
|  | 74 |  | 
|  | 75 | #define NGREG 18 /* Like glibc. */ | 
|  | 76 |  | 
|  | 77 | typedef int greg_t; | 
|  | 78 | typedef greg_t gregset_t[NGREG]; | 
| Dan Albert | bf18c61 | 2015-03-04 10:31:29 -0800 | [diff] [blame] | 79 | typedef struct user_fpregs fpregset_t; | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 80 |  | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 81 | #include <asm/sigcontext.h> | 
|  | 82 | typedef struct sigcontext mcontext_t; | 
|  | 83 |  | 
|  | 84 | typedef struct ucontext { | 
|  | 85 | unsigned long uc_flags; | 
|  | 86 | struct ucontext* uc_link; | 
|  | 87 | stack_t uc_stack; | 
|  | 88 | mcontext_t uc_mcontext; | 
| Elliott Hughes | 23415fc | 2018-02-13 19:09:04 -0800 | [diff] [blame] | 89 | union { | 
|  | 90 | struct { | 
|  | 91 | sigset_t uc_sigmask; | 
|  | 92 | /* Android has a wrong (smaller) sigset_t on ARM. */ | 
|  | 93 | uint32_t __padding_rt_sigset; | 
|  | 94 | }; | 
|  | 95 | sigset64_t uc_sigmask64; | 
|  | 96 | }; | 
| Elliott Hughes | 3ba55f8 | 2016-06-08 18:11:23 -0700 | [diff] [blame] | 97 | /* 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] | 98 | char __padding[120]; | 
| Calin Juravle | 0e85fb6 | 2014-05-19 19:14:03 +0100 | [diff] [blame] | 99 | unsigned long uc_regspace[128] __attribute__((__aligned__(8))); | 
| Elliott Hughes | 4e72fcc | 2014-01-29 17:53:59 -0800 | [diff] [blame] | 100 | } ucontext_t; | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 101 |  | 
| Ross McIlroy | 7b95807 | 2014-01-31 04:45:53 +0000 | [diff] [blame] | 102 | #elif defined(__aarch64__) | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 103 |  | 
| Elliott Hughes | 8e4d371 | 2014-09-19 10:31:49 -0700 | [diff] [blame] | 104 | #define NGREG 34 /* x0..x30 + sp + pc + pstate */ | 
|  | 105 | typedef unsigned long greg_t; | 
|  | 106 | typedef greg_t gregset_t[NGREG]; | 
| Elliott Hughes | 0577733 | 2015-06-15 18:47:39 -0700 | [diff] [blame] | 107 | typedef struct user_fpsimd_struct fpregset_t; | 
| Dan Albert | bf18c61 | 2015-03-04 10:31:29 -0800 | [diff] [blame] | 108 |  | 
| Ross McIlroy | 7b95807 | 2014-01-31 04:45:53 +0000 | [diff] [blame] | 109 | #include <asm/sigcontext.h> | 
|  | 110 | typedef struct sigcontext mcontext_t; | 
|  | 111 |  | 
|  | 112 | typedef struct ucontext { | 
|  | 113 | unsigned long uc_flags; | 
|  | 114 | struct ucontext *uc_link; | 
|  | 115 | stack_t uc_stack; | 
| Elliott Hughes | 23415fc | 2018-02-13 19:09:04 -0800 | [diff] [blame] | 116 | union { | 
|  | 117 | sigset_t uc_sigmask; | 
|  | 118 | sigset64_t uc_sigmask64; | 
|  | 119 | }; | 
| Elliott Hughes | 3ba55f8 | 2016-06-08 18:11:23 -0700 | [diff] [blame] | 120 | /* 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] | 121 | char __padding[128 - sizeof(sigset_t)]; | 
| Ross McIlroy | 7b95807 | 2014-01-31 04:45:53 +0000 | [diff] [blame] | 122 | mcontext_t uc_mcontext; | 
|  | 123 | } ucontext_t; | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 124 |  | 
|  | 125 | #elif defined(__i386__) | 
|  | 126 |  | 
|  | 127 | enum { | 
|  | 128 | REG_GS = 0, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 129 | #define REG_GS REG_GS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 130 | REG_FS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 131 | #define REG_FS REG_FS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 132 | REG_ES, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 133 | #define REG_ES REG_ES | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 134 | REG_DS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 135 | #define REG_DS REG_DS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 136 | REG_EDI, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 137 | #define REG_EDI REG_EDI | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 138 | REG_ESI, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 139 | #define REG_ESI REG_ESI | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 140 | REG_EBP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 141 | #define REG_EBP REG_EBP | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 142 | REG_ESP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 143 | #define REG_ESP REG_ESP | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 144 | REG_EBX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 145 | #define REG_EBX REG_EBX | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 146 | REG_EDX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 147 | #define REG_EDX REG_EDX | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 148 | REG_ECX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 149 | #define REG_ECX REG_ECX | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 150 | REG_EAX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 151 | #define REG_EAX REG_EAX | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 152 | REG_TRAPNO, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 153 | #define REG_TRAPNO REG_TRAPNO | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 154 | REG_ERR, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 155 | #define REG_ERR REG_ERR | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 156 | REG_EIP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 157 | #define REG_EIP REG_EIP | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 158 | REG_CS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 159 | #define REG_CS REG_CS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 160 | REG_EFL, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 161 | #define REG_EFL REG_EFL | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 162 | REG_UESP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 163 | #define REG_UESP REG_UESP | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 164 | REG_SS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 165 | #define REG_SS REG_SS | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 166 | NGREG | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 167 | #define NGREG NGREG | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 168 | }; | 
|  | 169 |  | 
|  | 170 | typedef int greg_t; | 
|  | 171 | typedef greg_t gregset_t[NGREG]; | 
|  | 172 |  | 
|  | 173 | struct _libc_fpreg { | 
|  | 174 | unsigned short significand[4]; | 
|  | 175 | unsigned short exponent; | 
|  | 176 | }; | 
|  | 177 |  | 
|  | 178 | struct _libc_fpstate { | 
|  | 179 | unsigned long cw; | 
|  | 180 | unsigned long sw; | 
|  | 181 | unsigned long tag; | 
|  | 182 | unsigned long ipoff; | 
|  | 183 | unsigned long cssel; | 
|  | 184 | unsigned long dataoff; | 
|  | 185 | unsigned long datasel; | 
|  | 186 | struct _libc_fpreg _st[8]; | 
|  | 187 | unsigned long status; | 
|  | 188 | }; | 
|  | 189 |  | 
|  | 190 | typedef struct _libc_fpstate* fpregset_t; | 
|  | 191 |  | 
|  | 192 | typedef struct { | 
|  | 193 | gregset_t gregs; | 
|  | 194 | fpregset_t fpregs; | 
|  | 195 | unsigned long oldmask; | 
|  | 196 | unsigned long cr2; | 
|  | 197 | } mcontext_t; | 
|  | 198 |  | 
|  | 199 | typedef struct ucontext { | 
|  | 200 | unsigned long uc_flags; | 
|  | 201 | struct ucontext* uc_link; | 
|  | 202 | stack_t uc_stack; | 
|  | 203 | mcontext_t uc_mcontext; | 
| Elliott Hughes | 23415fc | 2018-02-13 19:09:04 -0800 | [diff] [blame] | 204 | union { | 
|  | 205 | struct { | 
|  | 206 | sigset_t uc_sigmask; | 
|  | 207 | /* Android has a wrong (smaller) sigset_t on x86. */ | 
|  | 208 | uint32_t __padding_rt_sigset; | 
|  | 209 | }; | 
|  | 210 | sigset64_t uc_sigmask64; | 
|  | 211 | }; | 
| Calin Juravle | a6ab968 | 2014-05-13 20:29:01 +0100 | [diff] [blame] | 212 | struct _libc_fpstate __fpregs_mem; | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 213 | } ucontext_t; | 
|  | 214 |  | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 215 | #elif defined(__x86_64__) | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 216 |  | 
|  | 217 | enum { | 
|  | 218 | REG_R8 = 0, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 219 | #define REG_R8 REG_R8 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 220 | REG_R9, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 221 | #define REG_R9 REG_R9 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 222 | REG_R10, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 223 | #define REG_R10 REG_R10 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 224 | REG_R11, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 225 | #define REG_R11 REG_R11 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 226 | REG_R12, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 227 | #define REG_R12 REG_R12 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 228 | REG_R13, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 229 | #define REG_R13 REG_R13 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 230 | REG_R14, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 231 | #define REG_R14 REG_R14 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 232 | REG_R15, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 233 | #define REG_R15 REG_R15 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 234 | REG_RDI, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 235 | #define REG_RDI REG_RDI | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 236 | REG_RSI, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 237 | #define REG_RSI REG_RSI | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 238 | REG_RBP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 239 | #define REG_RBP REG_RBP | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 240 | REG_RBX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 241 | #define REG_RBX REG_RBX | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 242 | REG_RDX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 243 | #define REG_RDX REG_RDX | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 244 | REG_RAX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 245 | #define REG_RAX REG_RAX | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 246 | REG_RCX, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 247 | #define REG_RCX REG_RCX | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 248 | REG_RSP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 249 | #define REG_RSP REG_RSP | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 250 | REG_RIP, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 251 | #define REG_RIP REG_RIP | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 252 | REG_EFL, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 253 | #define REG_EFL REG_EFL | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 254 | REG_CSGSFS, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 255 | #define REG_CSGSFS REG_CSGSFS | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 256 | REG_ERR, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 257 | #define REG_ERR REG_ERR | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 258 | REG_TRAPNO, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 259 | #define REG_TRAPNO REG_TRAPNO | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 260 | REG_OLDMASK, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 261 | #define REG_OLDMASK REG_OLDMASK | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 262 | REG_CR2, | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 263 | #define REG_CR2 REG_CR2 | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 264 | NGREG | 
| Elliott Hughes | 8ad4093 | 2017-06-15 15:12:29 -0700 | [diff] [blame] | 265 | #define NGREG NGREG | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 266 | }; | 
|  | 267 |  | 
|  | 268 | typedef long greg_t; | 
|  | 269 | typedef greg_t gregset_t[NGREG]; | 
|  | 270 |  | 
| Calin Juravle | a6ab968 | 2014-05-13 20:29:01 +0100 | [diff] [blame] | 271 | struct _libc_fpxreg { | 
|  | 272 | unsigned short significand[4]; | 
|  | 273 | unsigned short exponent; | 
|  | 274 | unsigned short padding[3]; | 
|  | 275 | }; | 
|  | 276 |  | 
|  | 277 | struct _libc_xmmreg { | 
|  | 278 | uint32_t element[4]; | 
|  | 279 | }; | 
|  | 280 |  | 
|  | 281 | struct _libc_fpstate { | 
|  | 282 | uint16_t cwd; | 
|  | 283 | uint16_t swd; | 
|  | 284 | uint16_t ftw; | 
|  | 285 | uint16_t fop; | 
|  | 286 | uint64_t rip; | 
|  | 287 | uint64_t rdp; | 
|  | 288 | uint32_t mxcsr; | 
|  | 289 | uint32_t mxcr_mask; | 
|  | 290 | struct _libc_fpxreg _st[8]; | 
|  | 291 | struct _libc_xmmreg _xmm[16]; | 
|  | 292 | uint32_t padding[24]; | 
|  | 293 | }; | 
|  | 294 |  | 
|  | 295 | typedef struct _libc_fpstate* fpregset_t; | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 296 |  | 
|  | 297 | typedef struct { | 
|  | 298 | gregset_t gregs; | 
|  | 299 | fpregset_t fpregs; | 
| Elliott Hughes | c5992a0 | 2014-04-09 13:27:48 -0700 | [diff] [blame] | 300 | unsigned long __reserved1[8]; | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 301 | } mcontext_t; | 
|  | 302 |  | 
|  | 303 | typedef struct ucontext { | 
|  | 304 | unsigned long uc_flags; | 
|  | 305 | struct ucontext* uc_link; | 
|  | 306 | stack_t uc_stack; | 
|  | 307 | mcontext_t uc_mcontext; | 
| Elliott Hughes | 23415fc | 2018-02-13 19:09:04 -0800 | [diff] [blame] | 308 | union { | 
|  | 309 | sigset_t uc_sigmask; | 
|  | 310 | sigset64_t uc_sigmask64; | 
|  | 311 | }; | 
| Calin Juravle | a6ab968 | 2014-05-13 20:29:01 +0100 | [diff] [blame] | 312 | struct _libc_fpstate __fpregs_mem; | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 313 | } ucontext_t; | 
|  | 314 |  | 
| Elliott Hughes | 4043e5e | 2022-10-10 19:07:16 +0000 | [diff] [blame] | 315 | #elif defined(__riscv) | 
|  | 316 |  | 
|  | 317 | #define NGREG 32 | 
|  | 318 |  | 
| Nelly Vouzoukidou | 1cb3158 | 2023-03-07 17:03:41 +0000 | [diff] [blame] | 319 | #if defined(__USE_GNU) | 
|  | 320 |  | 
| Elliott Hughes | 4043e5e | 2022-10-10 19:07:16 +0000 | [diff] [blame] | 321 | #define REG_PC 0 | 
|  | 322 | #define REG_RA 1 | 
|  | 323 | #define REG_SP 2 | 
|  | 324 | #define REG_TP 4 | 
| Colin Cross | 91529b7 | 2022-10-13 13:27:18 -0700 | [diff] [blame] | 325 | #define REG_S0 8 | 
| Elliott Hughes | 287f48e | 2022-10-11 00:01:35 +0000 | [diff] [blame] | 326 | #define REG_A0 10 | 
| Elliott Hughes | 4043e5e | 2022-10-10 19:07:16 +0000 | [diff] [blame] | 327 |  | 
| Nelly Vouzoukidou | 1cb3158 | 2023-03-07 17:03:41 +0000 | [diff] [blame] | 328 | #endif // defined(__USE_GNU) | 
|  | 329 |  | 
| Elliott Hughes | 4043e5e | 2022-10-10 19:07:16 +0000 | [diff] [blame] | 330 | typedef unsigned long __riscv_mc_gp_state[NGREG]; | 
|  | 331 |  | 
|  | 332 | typedef unsigned long greg_t; | 
|  | 333 | typedef unsigned long gregset_t[NGREG]; | 
|  | 334 | typedef union __riscv_mc_fp_state fpregset_t; | 
|  | 335 |  | 
|  | 336 | /* These match the kernel <asm/ptrace.h> types but with different names. */ | 
|  | 337 |  | 
|  | 338 | struct __riscv_mc_f_ext_state { | 
|  | 339 | uint32_t __f[32]; | 
|  | 340 | uint32_t __fcsr; | 
|  | 341 | }; | 
|  | 342 |  | 
|  | 343 | struct __riscv_mc_d_ext_state { | 
|  | 344 | uint64_t __f[32]; | 
|  | 345 | uint32_t __fcsr; | 
|  | 346 | }; | 
|  | 347 |  | 
|  | 348 | struct __riscv_mc_q_ext_state { | 
|  | 349 | uint64_t __f[64] __attribute__((__aligned__(16))); | 
|  | 350 | uint32_t __fcsr; | 
|  | 351 | uint32_t __reserved[3]; | 
|  | 352 | }; | 
|  | 353 |  | 
|  | 354 | union __riscv_mc_fp_state { | 
|  | 355 | struct __riscv_mc_f_ext_state __f; | 
|  | 356 | struct __riscv_mc_d_ext_state __d; | 
|  | 357 | struct __riscv_mc_q_ext_state __q; | 
|  | 358 | }; | 
|  | 359 |  | 
|  | 360 | /* This matches the kernel <asm/sigcontext.h> but with different names. */ | 
|  | 361 |  | 
|  | 362 | typedef struct mcontext_t { | 
|  | 363 | __riscv_mc_gp_state __gregs; | 
|  | 364 | union __riscv_mc_fp_state __fpregs; | 
|  | 365 | } mcontext_t; | 
|  | 366 |  | 
| Elliott Hughes | 287f48e | 2022-10-11 00:01:35 +0000 | [diff] [blame] | 367 | /* This matches the kernel <asm/ucontext.h> but using mcontext_t. */ | 
|  | 368 |  | 
|  | 369 | typedef struct ucontext_t { | 
|  | 370 | unsigned long uc_flags; | 
|  | 371 | struct ucontext_t* uc_link; | 
|  | 372 | stack_t uc_stack; | 
| Elliott Hughes | 8e82677 | 2022-11-09 16:38:00 +0000 | [diff] [blame] | 373 | union { | 
|  | 374 | sigset_t uc_sigmask; | 
|  | 375 | sigset64_t uc_sigmask64; | 
|  | 376 | }; | 
| Elliott Hughes | 287f48e | 2022-10-11 00:01:35 +0000 | [diff] [blame] | 377 | /* The kernel adds extra padding here to allow sigset_t to grow. */ | 
|  | 378 | char __padding[128 - sizeof(sigset_t)]; | 
|  | 379 | mcontext_t uc_mcontext; | 
|  | 380 | } ucontext_t; | 
| Elliott Hughes | 4043e5e | 2022-10-10 19:07:16 +0000 | [diff] [blame] | 381 |  | 
| Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 382 | #endif | 
| Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 383 |  | 
|  | 384 | __END_DECLS |