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_ARM_LINUX_UCONTEXT_H_
659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#define SANDBOX_LINUX_SYSTEM_HEADERS_ARM_LINUX_UCONTEXT_H_
759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
8cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include <stddef.h>
9cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko
1059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#if !defined(__BIONIC_HAVE_UCONTEXT_T)
1159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#if !defined(__native_client_nonsfi__)
1259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#include <asm/sigcontext.h>
1359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#else
1459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// In PNaCl toolchain, sigcontext and stack_t is not defined. So here declare
1559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// them.
1659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Eratstruct sigcontext {
1759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long trap_no;
1859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long error_code;
1959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long oldmask;
2059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r0;
2159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r1;
2259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r2;
2359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r3;
2459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r4;
2559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r5;
2659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r6;
2759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r7;
2859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r8;
2959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r9;
3059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_r10;
3159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_fp;
3259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_ip;
3359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_sp;
3459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_lr;
3559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_pc;
3659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long arm_cpsr;
3759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long fault_address;
3859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat};
3959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
4059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erattypedef struct sigaltstack {
4159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  void* ss_sp;
4259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  int ss_flags;
4359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  size_t ss_size;
4459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat} stack_t;
4559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
4659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif
4759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
4859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// We also need greg_t for the sandbox, include it in this header as well.
4959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erattypedef unsigned long greg_t;
5059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
5159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat// typedef unsigned long sigset_t;
5259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erattypedef struct ucontext {
5359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long uc_flags;
5459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  struct ucontext* uc_link;
5559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  stack_t uc_stack;
5659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  struct sigcontext uc_mcontext;
5759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  sigset_t uc_sigmask;
5859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  /* Allow for uc_sigmask growth.  Glibc uses a 1024-bit sigset_t.  */
5959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  int __not_used[32 - (sizeof(sigset_t) / sizeof(int))];
6059c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  /* Last for extensibility.  Eight byte aligned because some
6159c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat     coprocessors require eight byte alignment.  */
6259c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat  unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
6359c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat} ucontext_t;
6459c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
6559c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#else
6659c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#include <sys/ucontext.h>
6759c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif  // __BIONIC_HAVE_UCONTEXT_T
6859c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat
6959c5f4b0fb104e8e4806e4934a3d5d112ad695abDaniel Erat#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM_LINUX_UCONTEXT_H_
70