1e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin/*
2e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * Copyright (C) 2014 The Android Open Source Project
3e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * All rights reserved.
4e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin *
5e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * Redistribution and use in source and binary forms, with or without
6e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * modification, are permitted provided that the following conditions
7e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * are met:
8e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin *  * Redistributions of source code must retain the above copyright
9e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin *    notice, this list of conditions and the following disclaimer.
10e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin *  * Redistributions in binary form must reproduce the above copyright
11e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin *    notice, this list of conditions and the following disclaimer in
12e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin *    the documentation and/or other materials provided with the
13e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin *    distribution.
14e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin *
15e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
18e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
20e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
22e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
25e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin * SUCH DAMAGE.
27e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin */
28e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
29e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin#ifndef _SYS_UCONTEXT_H_
30e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin#define _SYS_UCONTEXT_H_
31e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
32203e13d97de840e01eded6a267fef9f245cf3a15Elliott Hughes#include <sys/cdefs.h>
3316016df79f846d6d21266c3b1dce1e7c24dc4be1Josh Gao
3416016df79f846d6d21266c3b1dce1e7c24dc4be1Josh Gao#include <signal.h>
35e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin#include <sys/user.h>
36e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
37e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin__BEGIN_DECLS
38e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
39677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes#if defined(__arm__)
40677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
414e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughesenum {
424e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R0 = 0,
434e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R1,
444e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R2,
454e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R3,
464e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R4,
474e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R5,
484e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R6,
494e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R7,
504e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R8,
514e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R9,
524e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R10,
534e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R11,
544e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R12,
554e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R13,
564e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R14,
574e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  REG_R15,
584e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes};
594e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes
604e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes#define NGREG 18 /* Like glibc. */
614e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes
624e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughestypedef int greg_t;
634e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughestypedef greg_t gregset_t[NGREG];
64bf18c61798d1ae9197ae087ed85e94eef55e8678Dan Alberttypedef struct user_fpregs fpregset_t;
654e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes
664e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes#include <asm/sigcontext.h>
674e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughestypedef struct sigcontext mcontext_t;
684e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes
694e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughestypedef struct ucontext {
704e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  unsigned long uc_flags;
714e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  struct ucontext* uc_link;
724e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  stack_t uc_stack;
734e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes  mcontext_t uc_mcontext;
7426a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes  sigset_t uc_sigmask;
753ba55f8022f3d5c5ca94a3df46fa658eda791987Elliott Hughes  /* Android has a wrong (smaller) sigset_t on ARM. */
7626a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes  uint32_t __padding_rt_sigset;
773ba55f8022f3d5c5ca94a3df46fa658eda791987Elliott Hughes  /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM. */
78bdca3802c9c9d033fbc553ed24b92ac78859a463Calin Juravle  char __padding[120];
790e85fb6121cf365207ee737314130a526dbe0eacCalin Juravle  unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
804e72fcc3c2b8bcaab653732dfd3edd137602c648Elliott Hughes} ucontext_t;
81677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
827b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroy#elif defined(__aarch64__)
83677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
848e4d371091e5738346f5c6ad395b8487c2a5ec67Elliott Hughes#define NGREG 34 /* x0..x30 + sp + pc + pstate */
858e4d371091e5738346f5c6ad395b8487c2a5ec67Elliott Hughestypedef unsigned long greg_t;
868e4d371091e5738346f5c6ad395b8487c2a5ec67Elliott Hughestypedef greg_t gregset_t[NGREG];
870577733c2e15a4745d5c75f59e5f56dd179a4aa7Elliott Hughestypedef struct user_fpsimd_struct fpregset_t;
88bf18c61798d1ae9197ae087ed85e94eef55e8678Dan Albert
897b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroy#include <asm/sigcontext.h>
907b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroytypedef struct sigcontext mcontext_t;
917b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroy
927b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroytypedef struct ucontext {
937b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroy  unsigned long uc_flags;
947b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroy  struct ucontext *uc_link;
957b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroy  stack_t uc_stack;
967b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroy  sigset_t uc_sigmask;
973ba55f8022f3d5c5ca94a3df46fa658eda791987Elliott Hughes  /* The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64. */
9850249bca00d2c7d237e67d4d276057bb59508804Elliott Hughes  char __padding[128 - sizeof(sigset_t)];
997b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroy  mcontext_t uc_mcontext;
1007b95807fa086174cbab146cbd7c60a6d2e386917Ross McIlroy} ucontext_t;
101677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
102677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes#elif defined(__i386__)
103677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
104677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughesenum {
105677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_GS = 0,
106677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_FS,
107677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_ES,
108677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_DS,
109677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_EDI,
110677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_ESI,
111677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_EBP,
112677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_ESP,
113677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_EBX,
114677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_EDX,
115677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_ECX,
116677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_EAX,
117677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_TRAPNO,
118677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_ERR,
119677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_EIP,
120677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_CS,
121677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_EFL,
122677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_UESP,
123677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  REG_SS,
124677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  NGREG
125677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes};
126677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
127677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughestypedef int greg_t;
128677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughestypedef greg_t gregset_t[NGREG];
129677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
130677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughesstruct _libc_fpreg {
131677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned short significand[4];
132677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned short exponent;
133677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes};
134677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
135677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughesstruct _libc_fpstate {
136677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long cw;
137677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long sw;
138677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long tag;
139677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long ipoff;
140677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long cssel;
141677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long dataoff;
142677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long datasel;
143677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  struct _libc_fpreg _st[8];
144677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long status;
145677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes};
146677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
147677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughestypedef struct _libc_fpstate* fpregset_t;
148677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
149677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughestypedef struct {
150677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  gregset_t gregs;
151677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  fpregset_t fpregs;
152677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long oldmask;
153677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long cr2;
154677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes} mcontext_t;
155677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
156677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughestypedef struct ucontext {
157677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  unsigned long uc_flags;
158677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  struct ucontext* uc_link;
159677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  stack_t uc_stack;
160677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes  mcontext_t uc_mcontext;
16126a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes  sigset_t uc_sigmask;
1623ba55f8022f3d5c5ca94a3df46fa658eda791987Elliott Hughes  /* Android has a wrong (smaller) sigset_t on x86. */
16326a8eb50a84e131d34d10d5d167d67e9995399bdElliott Hughes  uint32_t __padding_rt_sigset;
164a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  struct _libc_fpstate __fpregs_mem;
165677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes} ucontext_t;
166677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
167677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes#elif defined(__mips__)
168677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
16902c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes/* glibc doesn't have names for MIPS registers. */
17002c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes
17102c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes#define NGREG 32
17202c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes#define NFPREG 32
17302c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes
17402c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughestypedef unsigned long long greg_t;
17502c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughestypedef greg_t gregset_t[NGREG];
17602c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes
17702c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughestypedef struct fpregset {
17802c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  union {
17902c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes    double fp_dregs[NFPREG];
18002c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes    struct {
18102c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes      float _fp_fregs;
18202c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes      unsigned _fp_pad;
18302c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes    } fp_fregs[NFPREG];
18402c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  } fp_r;
18502c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes} fpregset_t;
18602c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes
187e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker#ifdef __LP64__
188e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazkertypedef struct {
189e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  gregset_t gregs;
190e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  fpregset_t fpregs;
191e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  greg_t mdhi;
192e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  greg_t hi1;
193e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  greg_t hi2;
194e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  greg_t hi3;
195e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  greg_t mdlo;
196e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  greg_t lo1;
197e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  greg_t lo2;
198e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  greg_t lo3;
199e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  greg_t pc;
200e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  uint32_t fpc_csr;
201e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  uint32_t used_math;
202e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  uint32_t dsp;
203e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker  uint32_t reserved;
204e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker} mcontext_t;
205e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker#else
20602c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughestypedef struct {
20702c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned regmask;
20802c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned status;
20902c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  greg_t pc;
21002c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  gregset_t gregs;
21102c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  fpregset_t fpregs;
21202c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned fp_owned;
21302c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned fpc_csr;
21402c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned fpc_eir;
21502c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned used_math;
21602c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned dsp;
21702c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  greg_t mdhi;
21802c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  greg_t mdlo;
21902c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned long hi1;
22002c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned long lo1;
22102c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned long hi2;
22202c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned long lo2;
22302c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned long hi3;
22402c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned long lo3;
22502c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes} mcontext_t;
226e247e1c89e068f5c1e1d235157d7f60c50c67d0cFaraz Shahbazker#endif
22702c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes
22802c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughestypedef struct ucontext {
22902c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  unsigned long uc_flags;
23002c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  struct ucontext* uc_link;
23102c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  stack_t uc_stack;
23202c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  mcontext_t uc_mcontext;
23302c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes  sigset_t uc_sigmask;
23402c661b88384a4a0cd5dd2b32123968bd992873fElliott Hughes} ucontext_t;
235677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes
236677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes#elif defined(__x86_64__)
237e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
238e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupinenum {
239e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_R8 = 0,
240e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_R9,
241e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_R10,
242e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_R11,
243e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_R12,
244e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_R13,
245e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_R14,
246e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_R15,
247e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_RDI,
248e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_RSI,
249e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_RBP,
250e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_RBX,
251e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_RDX,
252e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_RAX,
253e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_RCX,
254e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_RSP,
255e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_RIP,
256e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_EFL,
257e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_CSGSFS,
258e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_ERR,
259e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_TRAPNO,
260e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_OLDMASK,
261e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  REG_CR2,
262e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  NGREG
263e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin};
264e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
265e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupintypedef long greg_t;
266e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupintypedef greg_t gregset_t[NGREG];
267e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
268a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravlestruct _libc_fpxreg {
269a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  unsigned short significand[4];
270a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  unsigned short exponent;
271a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  unsigned short padding[3];
272a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle};
273a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle
274a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravlestruct _libc_xmmreg {
275a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint32_t element[4];
276a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle};
277a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle
278a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravlestruct _libc_fpstate {
279a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint16_t cwd;
280a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint16_t swd;
281a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint16_t ftw;
282a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint16_t fop;
283a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint64_t rip;
284a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint64_t rdp;
285a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint32_t mxcsr;
286a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint32_t mxcr_mask;
287a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  struct _libc_fpxreg _st[8];
288a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  struct _libc_xmmreg _xmm[16];
289a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  uint32_t padding[24];
290a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle};
291a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle
292a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravletypedef struct _libc_fpstate* fpregset_t;
293e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
294e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupintypedef struct {
295e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  gregset_t gregs;
296e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  fpregset_t fpregs;
297c5992a036ba380f56e5be3d2d6b1abb34064b20eElliott Hughes  unsigned long __reserved1[8];
298e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin} mcontext_t;
299e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
300e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupintypedef struct ucontext {
301e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  unsigned long uc_flags;
302e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  struct ucontext* uc_link;
303e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  stack_t uc_stack;
304e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  mcontext_t uc_mcontext;
305e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin  sigset_t uc_sigmask;
306a6ab968ca0af18d84620a692f76af0d8e857c9c8Calin Juravle  struct _libc_fpstate __fpregs_mem;
307e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin} ucontext_t;
308e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
309677a07cb9a3f5964e9ead4d37b9f775d971c61e0Elliott Hughes#endif
310e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
311e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin__END_DECLS
312e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin
313e61d106008f7d77fa1c0de43ac27311320225135Pavel Chupin#endif /* _SYS_UCONTEXT_H_ */
314