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 | 7fc63f2 | 2023-05-03 17:45:41 +0000 | [diff] [blame] | 321 | enum { |
| 322 | REG_PC = 0, |
| 323 | #define REG_PC REG_PC |
| 324 | REG_RA = 1, |
| 325 | #define REG_RA REG_RA |
| 326 | REG_SP = 2, |
| 327 | #define REG_SP REG_SP |
| 328 | REG_TP = 4, |
| 329 | #define REG_TP REG_TP |
| 330 | REG_S0 = 8, |
| 331 | #define REG_S0 REG_S0 |
| 332 | REG_A0 = 10, |
| 333 | #define REG_A0 REG_A0 |
| 334 | }; |
Elliott Hughes | 4043e5e | 2022-10-10 19:07:16 +0000 | [diff] [blame] | 335 | |
Nelly Vouzoukidou | 1cb3158 | 2023-03-07 17:03:41 +0000 | [diff] [blame] | 336 | #endif // defined(__USE_GNU) |
| 337 | |
Elliott Hughes | 4043e5e | 2022-10-10 19:07:16 +0000 | [diff] [blame] | 338 | typedef unsigned long __riscv_mc_gp_state[NGREG]; |
| 339 | |
| 340 | typedef unsigned long greg_t; |
| 341 | typedef unsigned long gregset_t[NGREG]; |
| 342 | typedef union __riscv_mc_fp_state fpregset_t; |
| 343 | |
| 344 | /* These match the kernel <asm/ptrace.h> types but with different names. */ |
| 345 | |
| 346 | struct __riscv_mc_f_ext_state { |
| 347 | uint32_t __f[32]; |
| 348 | uint32_t __fcsr; |
| 349 | }; |
| 350 | |
| 351 | struct __riscv_mc_d_ext_state { |
| 352 | uint64_t __f[32]; |
| 353 | uint32_t __fcsr; |
| 354 | }; |
| 355 | |
| 356 | struct __riscv_mc_q_ext_state { |
| 357 | uint64_t __f[64] __attribute__((__aligned__(16))); |
| 358 | uint32_t __fcsr; |
| 359 | uint32_t __reserved[3]; |
| 360 | }; |
| 361 | |
| 362 | union __riscv_mc_fp_state { |
| 363 | struct __riscv_mc_f_ext_state __f; |
| 364 | struct __riscv_mc_d_ext_state __d; |
| 365 | struct __riscv_mc_q_ext_state __q; |
| 366 | }; |
| 367 | |
| 368 | /* This matches the kernel <asm/sigcontext.h> but with different names. */ |
| 369 | |
| 370 | typedef struct mcontext_t { |
| 371 | __riscv_mc_gp_state __gregs; |
| 372 | union __riscv_mc_fp_state __fpregs; |
| 373 | } mcontext_t; |
| 374 | |
Elliott Hughes | 287f48e | 2022-10-11 00:01:35 +0000 | [diff] [blame] | 375 | /* This matches the kernel <asm/ucontext.h> but using mcontext_t. */ |
| 376 | |
Elliott Hughes | 53c90eb | 2023-03-30 10:02:11 -0700 | [diff] [blame] | 377 | typedef struct ucontext { |
Elliott Hughes | 287f48e | 2022-10-11 00:01:35 +0000 | [diff] [blame] | 378 | unsigned long uc_flags; |
Elliott Hughes | 53c90eb | 2023-03-30 10:02:11 -0700 | [diff] [blame] | 379 | struct ucontext* uc_link; |
Elliott Hughes | 287f48e | 2022-10-11 00:01:35 +0000 | [diff] [blame] | 380 | stack_t uc_stack; |
Elliott Hughes | 8e82677 | 2022-11-09 16:38:00 +0000 | [diff] [blame] | 381 | union { |
| 382 | sigset_t uc_sigmask; |
| 383 | sigset64_t uc_sigmask64; |
| 384 | }; |
Elliott Hughes | 287f48e | 2022-10-11 00:01:35 +0000 | [diff] [blame] | 385 | /* The kernel adds extra padding here to allow sigset_t to grow. */ |
| 386 | char __padding[128 - sizeof(sigset_t)]; |
| 387 | mcontext_t uc_mcontext; |
| 388 | } ucontext_t; |
Elliott Hughes | 4043e5e | 2022-10-10 19:07:16 +0000 | [diff] [blame] | 389 | |
Elliott Hughes | 677a07c | 2014-01-29 16:46:00 -0800 | [diff] [blame] | 390 | #endif |
Pavel Chupin | e61d106 | 2014-01-27 17:56:43 +0400 | [diff] [blame] | 391 | |
| 392 | __END_DECLS |