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