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