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_ANDROID_I386_UCONTEXT_H_ 6#define SANDBOX_LINUX_SYSTEM_HEADERS_ANDROID_I386_UCONTEXT_H_ 7 8#include <stddef.h> 9#include <stdint.h> 10 11// We do something compatible with glibc. Hopefully, at some point Android will 12// provide that for us, and __BIONIC_HAVE_UCONTEXT_T should be defined. 13// This is mostly copied from breakpad (common/android/include/sys/ucontext.h), 14// except we do use sigset_t for uc_sigmask instead of a custom type. 15 16#if !defined(__BIONIC_HAVE_UCONTEXT_T) 17#if !defined(__native_client_nonsfi__) 18#include <asm/sigcontext.h> 19#else 20// In PNaCl toolchain, sigcontext is not defined. So here declare it. 21typedef struct sigaltstack { 22 void* ss_sp; 23 int ss_flags; 24 size_t ss_size; 25} stack_t; 26#endif 27 28/* 80-bit floating-point register */ 29struct _libc_fpreg { 30 unsigned short significand[4]; 31 unsigned short exponent; 32}; 33 34/* Simple floating-point state, see FNSTENV instruction */ 35struct _libc_fpstate { 36 unsigned long cw; 37 unsigned long sw; 38 unsigned long tag; 39 unsigned long ipoff; 40 unsigned long cssel; 41 unsigned long dataoff; 42 unsigned long datasel; 43 struct _libc_fpreg _st[8]; 44 unsigned long status; 45}; 46 47typedef uint32_t greg_t; 48 49typedef struct { 50 uint32_t gregs[19]; 51 struct _libc_fpstate* fpregs; 52 uint32_t oldmask; 53 uint32_t cr2; 54} mcontext_t; 55 56enum { 57 REG_GS = 0, 58 REG_FS, 59 REG_ES, 60 REG_DS, 61 REG_EDI, 62 REG_ESI, 63 REG_EBP, 64 REG_ESP, 65 REG_EBX, 66 REG_EDX, 67 REG_ECX, 68 REG_EAX, 69 REG_TRAPNO, 70 REG_ERR, 71 REG_EIP, 72 REG_CS, 73 REG_EFL, 74 REG_UESP, 75 REG_SS, 76}; 77 78typedef struct ucontext { 79 uint32_t uc_flags; 80 struct ucontext* uc_link; 81 stack_t uc_stack; 82 mcontext_t uc_mcontext; 83 // Android and PNaCl toolchain's sigset_t has only 32 bits, though Linux 84 // ABI requires 64 bits. 85 union { 86 sigset_t uc_sigmask; 87 uint32_t kernel_sigmask[2]; 88 }; 89 struct _libc_fpstate __fpregs_mem; 90} ucontext_t; 91 92#else 93#include <sys/ucontext.h> 94#endif // __BIONIC_HAVE_UCONTEXT_T 95 96#endif // SANDBOX_LINUX_SYSTEM_HEADERS_ANDROID_I386_UCONTEXT_H_ 97