159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved.
259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// Use of this source code is governed by a BSD-style license that can be
359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// found in the LICENSE file.
459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_ANDROID_I386_UCONTEXT_H_
659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#define SANDBOX_LINUX_SYSTEM_HEADERS_ANDROID_I386_UCONTEXT_H_
759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
8cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stddef.h>
9cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stdint.h>
10cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// We do something compatible with glibc. Hopefully, at some point Android will
1259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// provide that for us, and __BIONIC_HAVE_UCONTEXT_T should be defined.
1359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// This is mostly copied from breakpad (common/android/include/sys/ucontext.h),
1459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// except we do use sigset_t for uc_sigmask instead of a custom type.
1559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
1659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#if !defined(__BIONIC_HAVE_UCONTEXT_T)
1759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#if !defined(__native_client_nonsfi__)
1859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#include <asm/sigcontext.h>
1959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#else
2059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// In PNaCl toolchain, sigcontext is not defined. So here declare it.
2159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erattypedef struct sigaltstack {
2259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  void* ss_sp;
2359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  int ss_flags;
2459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  size_t ss_size;
2559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat} stack_t;
2659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif
2759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
2859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat/* 80-bit floating-point register */
2959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Eratstruct _libc_fpreg {
3059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned short significand[4];
3159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned short exponent;
3259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat};
3359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
3459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat/* Simple floating-point state, see FNSTENV instruction */
3559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Eratstruct _libc_fpstate {
3659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long cw;
3759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long sw;
3859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long tag;
3959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long ipoff;
4059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long cssel;
4159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long dataoff;
4259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long datasel;
4359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  struct _libc_fpreg _st[8];
4459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long status;
4559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat};
4659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
4759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erattypedef uint32_t greg_t;
4859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
4959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erattypedef struct {
5059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  uint32_t gregs[19];
5159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  struct _libc_fpstate* fpregs;
5259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  uint32_t oldmask;
5359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  uint32_t cr2;
5459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat} mcontext_t;
5559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
5659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Eratenum {
5759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_GS = 0,
5859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_FS,
5959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_ES,
6059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_DS,
6159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_EDI,
6259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_ESI,
6359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_EBP,
6459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_ESP,
6559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_EBX,
6659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_EDX,
6759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_ECX,
6859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_EAX,
6959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_TRAPNO,
7059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_ERR,
7159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_EIP,
7259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_CS,
7359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_EFL,
7459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_UESP,
7559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  REG_SS,
7659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat};
7759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
7859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erattypedef struct ucontext {
7959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  uint32_t uc_flags;
8059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  struct ucontext* uc_link;
8159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  stack_t uc_stack;
8259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  mcontext_t uc_mcontext;
8359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  // Android and PNaCl toolchain's sigset_t has only 32 bits, though Linux
8459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  // ABI requires 64 bits.
8559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  union {
8659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat    sigset_t uc_sigmask;
8759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat    uint32_t kernel_sigmask[2];
8859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  };
8959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  struct _libc_fpstate __fpregs_mem;
9059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat} ucontext_t;
9159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
9259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#else
9359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#include <sys/ucontext.h>
9459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif  // __BIONIC_HAVE_UCONTEXT_T
9559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
9659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ANDROID_I386_UCONTEXT_H_
97