12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef SANDBOX_LINUX_SERVICES_ANDROID_I386_UCONTEXT_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define SANDBOX_LINUX_SERVICES_ANDROID_I386_UCONTEXT_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// We do something compatible with glibc. Hopefully, at some point Android will 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// provide that for us, and __BIONIC_HAVE_UCONTEXT_T should be defined. 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This is mostly copied from breakpad (common/android/include/sys/ucontext.h), 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// except we do use sigset_t for uc_sigmask instead of a custom type. 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(__BIONIC_HAVE_UCONTEXT_T) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <asm/sigcontext.h> 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* 80-bit floating-point register */ 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct _libc_fpreg { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned short significand[4]; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned short exponent; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/* Simple floating-point state, see FNSTENV instruction */ 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct _libc_fpstate { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned long cw; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned long sw; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned long tag; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned long ipoff; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned long cssel; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned long dataoff; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned long datasel; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct _libc_fpreg _st[8]; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned long status; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef uint32_t greg_t; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct { 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t gregs[19]; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct _libc_fpstate* fpregs; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t oldmask; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t cr2; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} mcontext_t; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_GS = 0, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_FS, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_ES, 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_DS, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_EDI, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_ESI, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_EBP, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_ESP, 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_EBX, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_EDX, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_ECX, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_EAX, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_TRAPNO, 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_ERR, 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_EIP, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_CS, 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_EFL, 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_UESP, 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REG_SS, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)typedef struct ucontext { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint32_t uc_flags; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct ucontext* uc_link; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stack_t uc_stack; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mcontext_t uc_mcontext; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sigset_t uc_sigmask; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct _libc_fpstate __fpregs_mem; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} ucontext_t; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <sys/ucontext.h> 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // __BIONIC_HAVE_UCONTEXT_T 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // SANDBOX_LINUX_SERVICES_ANDROID_I386_UCONTEXT_H_ 80