1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SANDBOX_LINUX_SYSTEM_HEADERS_ARM_LINUX_UCONTEXT_H_
6#define SANDBOX_LINUX_SYSTEM_HEADERS_ARM_LINUX_UCONTEXT_H_
7
8#include <stddef.h>
9
10#if !defined(__BIONIC_HAVE_UCONTEXT_T)
11#if !defined(__native_client_nonsfi__)
12#include <asm/sigcontext.h>
13#else
14// In PNaCl toolchain, sigcontext and stack_t is not defined. So here declare
15// them.
16struct sigcontext {
17  unsigned long trap_no;
18  unsigned long error_code;
19  unsigned long oldmask;
20  unsigned long arm_r0;
21  unsigned long arm_r1;
22  unsigned long arm_r2;
23  unsigned long arm_r3;
24  unsigned long arm_r4;
25  unsigned long arm_r5;
26  unsigned long arm_r6;
27  unsigned long arm_r7;
28  unsigned long arm_r8;
29  unsigned long arm_r9;
30  unsigned long arm_r10;
31  unsigned long arm_fp;
32  unsigned long arm_ip;
33  unsigned long arm_sp;
34  unsigned long arm_lr;
35  unsigned long arm_pc;
36  unsigned long arm_cpsr;
37  unsigned long fault_address;
38};
39
40typedef struct sigaltstack {
41  void* ss_sp;
42  int ss_flags;
43  size_t ss_size;
44} stack_t;
45
46#endif
47
48// We also need greg_t for the sandbox, include it in this header as well.
49typedef unsigned long greg_t;
50
51// typedef unsigned long sigset_t;
52typedef struct ucontext {
53  unsigned long uc_flags;
54  struct ucontext* uc_link;
55  stack_t uc_stack;
56  struct sigcontext uc_mcontext;
57  sigset_t uc_sigmask;
58  /* Allow for uc_sigmask growth.  Glibc uses a 1024-bit sigset_t.  */
59  int __not_used[32 - (sizeof(sigset_t) / sizeof(int))];
60  /* Last for extensibility.  Eight byte aligned because some
61     coprocessors require eight byte alignment.  */
62  unsigned long uc_regspace[128] __attribute__((__aligned__(8)));
63} ucontext_t;
64
65#else
66#include <sys/ucontext.h>
67#endif  // __BIONIC_HAVE_UCONTEXT_T
68
69#endif  // SANDBOX_LINUX_SYSTEM_HEADERS_ARM_LINUX_UCONTEXT_H_
70