12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines//===-- ucontext.h ----------------------------------------------*- C++ -*-===// 22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// 32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// The LLVM Compiler Infrastructure 42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This file is dual licensed under the MIT and the University of Illinois Open 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Source Licenses. See LICENSE.TXT for details. 72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// 82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// ===----------------------------------------------------------------------=== 92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_UCONTEXT_H 112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_UCONTEXT_H 122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <sys/cdefs.h> 142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <signal.h> 152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef __cplusplus 172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextern "C" { 182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // __cplusplus 192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifndef __BIONIC_HAVE_UCONTEXT_T 212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Ensure that 'stack_t' is defined. 232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <asm/signal.h> 242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// This version of the Android C library headers do not provide ucontext_t. 262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Provide custom definitions for Google Breakpad. 272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#if defined(__arm__) 282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// Ensure that 'struct sigcontext' is defined. 302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#include <asm/sigcontext.h> 312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef struct sigcontext mcontext_t; 322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// The ARM kernel uses a 64-bit signal mask. 342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef uint32_t kernel_sigmask_t[2]; 352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef struct ucontext { 372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t uc_flags; 382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct ucontext* uc_link; 392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines stack_t uc_stack; 402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines mcontext_t uc_mcontext; 412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines kernel_sigmask_t uc_sigmask; 422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Other fields are not used by Google Breakpad. Don't define them. 432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} ucontext_t; 442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#elif defined(__i386__) 462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/* 80-bit floating-point register */ 482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstruct _libc_fpreg { 492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned short significand[4]; 502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned short exponent; 512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines/* Simple floating-point state, see FNSTENV instruction */ 542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesstruct _libc_fpstate { 552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned long cw; 562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned long sw; 572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned long tag; 582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned long ipoff; 592d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned long cssel; 602d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned long dataoff; 612d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned long datasel; 622d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct _libc_fpreg _st[8]; 632d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines unsigned long status; 642d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 652d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 662d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef uint32_t greg_t; 672d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 682d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef struct { 692d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t gregs[19]; 702d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct _libc_fpstate* fpregs; 712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t oldmask; 722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t cr2; 732d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} mcontext_t; 742d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 752d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesenum { 762d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_GS = 0, 772d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_FS, 782d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_ES, 792d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_DS, 802d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_EDI, 812d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_ESI, 822d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_EBP, 832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_ESP, 842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_EBX, 852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_EDX, 862d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_ECX, 872d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_EAX, 882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_TRAPNO, 892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_ERR, 902d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_EIP, 912d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_CS, 922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_EFL, 932d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_UESP, 942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines REG_SS, 952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}; 962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// The i386 kernel uses a 64-bit signal mask. 982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef uint32_t kernel_sigmask_t[2]; 992d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1002d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef struct ucontext { 1012d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t uc_flags; 1022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct ucontext* uc_link; 1032d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines stack_t uc_stack; 1042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines mcontext_t uc_mcontext; 1052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines kernel_sigmask_t uc_sigmask; 1062d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct _libc_fpstate __fpregs_mem; 1072d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} ucontext_t; 1082d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1092d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#elif defined(__mips__) 1102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef struct { 1122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t regmask; 1132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t status; 1142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint64_t pc; 1152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint64_t gregs[32]; 1162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint64_t fpregs[32]; 1172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t acx; 1182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t fpc_csr; 1192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t fpc_eir; 1202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t used_math; 1212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t dsp; 1222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint64_t mdhi; 1232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint64_t mdlo; 1242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t hi1; 1252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t lo1; 1262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t hi2; 1272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t lo2; 1282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t hi3; 1292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t lo3; 1302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} mcontext_t; 1312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// The MIPS kernel uses a 128-bit signal mask. 1332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef uint32_t kernel_sigmask_t[4]; 1342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinestypedef struct ucontext { 1362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines uint32_t uc_flags; 1372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines struct ucontext* uc_link; 1382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines stack_t uc_stack; 1392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines mcontext_t uc_mcontext; 1402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines kernel_sigmask_t uc_sigmask; 1412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines // Other fields are not used by Google Breakpad. Don't define them. 1422d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} ucontext_t; 1432d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#else 1452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# error "Unsupported Android CPU ABI!" 1462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif 1472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // __BIONIC_HAVE_UCONTEXT_T 1492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#ifdef __cplusplus 1512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines} // extern "C" 1522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // __cplusplus 1532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines 1542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_UCONTEXT_H 155