diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-03-18 08:32:14 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-03-18 08:32:14 +0000 |
commit | 1df46a28b98d8aee7b393112553f8b324c969739 (patch) | |
tree | ab5dcad716d39472de751a4ad5ed2f05351dcf4c /android/include | |
parent | d8797fe581a44965c29d9a1909fbdf0e39a3333b (diff) |
Move Android ucontext.h out of third_party.
Google is re-licensing this code under the standard dual license of
compiler-rt.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@204128 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'android/include')
-rw-r--r-- | android/include/sys/ucontext.h | 154 | ||||
-rw-r--r-- | android/include/ucontext.h | 36 |
2 files changed, 190 insertions, 0 deletions
diff --git a/android/include/sys/ucontext.h b/android/include/sys/ucontext.h new file mode 100644 index 000000000..81e65a5c5 --- /dev/null +++ b/android/include/sys/ucontext.h @@ -0,0 +1,154 @@ +//===-- ucontext.h ----------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +// ===----------------------------------------------------------------------=== + +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_UCONTEXT_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_UCONTEXT_H + +#include <sys/cdefs.h> +#include <signal.h> + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +#ifndef __BIONIC_HAVE_UCONTEXT_T + +// Ensure that 'stack_t' is defined. +#include <asm/signal.h> + +// This version of the Android C library headers do not provide ucontext_t. +// Provide custom definitions for Google Breakpad. +#if defined(__arm__) + +// Ensure that 'struct sigcontext' is defined. +#include <asm/sigcontext.h> +typedef struct sigcontext mcontext_t; + +// The ARM kernel uses a 64-bit signal mask. +typedef uint32_t kernel_sigmask_t[2]; + +typedef struct ucontext { + uint32_t uc_flags; + struct ucontext* uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + kernel_sigmask_t uc_sigmask; + // Other fields are not used by Google Breakpad. Don't define them. +} ucontext_t; + +#elif defined(__i386__) + +/* 80-bit floating-point register */ +struct _libc_fpreg { + unsigned short significand[4]; + unsigned short exponent; +}; + +/* Simple floating-point state, see FNSTENV instruction */ +struct _libc_fpstate { + unsigned long cw; + unsigned long sw; + unsigned long tag; + unsigned long ipoff; + unsigned long cssel; + unsigned long dataoff; + unsigned long datasel; + struct _libc_fpreg _st[8]; + unsigned long status; +}; + +typedef uint32_t greg_t; + +typedef struct { + uint32_t gregs[19]; + struct _libc_fpstate* fpregs; + uint32_t oldmask; + uint32_t cr2; +} mcontext_t; + +enum { + REG_GS = 0, + REG_FS, + REG_ES, + REG_DS, + REG_EDI, + REG_ESI, + REG_EBP, + REG_ESP, + REG_EBX, + REG_EDX, + REG_ECX, + REG_EAX, + REG_TRAPNO, + REG_ERR, + REG_EIP, + REG_CS, + REG_EFL, + REG_UESP, + REG_SS, +}; + +// The i386 kernel uses a 64-bit signal mask. +typedef uint32_t kernel_sigmask_t[2]; + +typedef struct ucontext { + uint32_t uc_flags; + struct ucontext* uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + kernel_sigmask_t uc_sigmask; + struct _libc_fpstate __fpregs_mem; +} ucontext_t; + +#elif defined(__mips__) + +typedef struct { + uint32_t regmask; + uint32_t status; + uint64_t pc; + uint64_t gregs[32]; + uint64_t fpregs[32]; + uint32_t acx; + uint32_t fpc_csr; + uint32_t fpc_eir; + uint32_t used_math; + uint32_t dsp; + uint64_t mdhi; + uint64_t mdlo; + uint32_t hi1; + uint32_t lo1; + uint32_t hi2; + uint32_t lo2; + uint32_t hi3; + uint32_t lo3; +} mcontext_t; + +// The MIPS kernel uses a 128-bit signal mask. +typedef uint32_t kernel_sigmask_t[4]; + +typedef struct ucontext { + uint32_t uc_flags; + struct ucontext* uc_link; + stack_t uc_stack; + mcontext_t uc_mcontext; + kernel_sigmask_t uc_sigmask; + // Other fields are not used by Google Breakpad. Don't define them. +} ucontext_t; + +#else +# error "Unsupported Android CPU ABI!" +#endif + +#endif // __BIONIC_HAVE_UCONTEXT_T + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_SYS_UCONTEXT_H diff --git a/android/include/ucontext.h b/android/include/ucontext.h new file mode 100644 index 000000000..178ddf3d4 --- /dev/null +++ b/android/include/ucontext.h @@ -0,0 +1,36 @@ +//===-- ucontext.h ----------------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is dual licensed under the MIT and the University of Illinois Open +// Source Licenses. See LICENSE.TXT for details. +// +// ===----------------------------------------------------------------------=== + +#ifndef GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_UCONTEXT_H +#define GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_UCONTEXT_H + +#include <sys/cdefs.h> + +#ifdef __BIONIC_UCONTEXT_H +#include <ucontext.h> +#else + +#include <sys/ucontext.h> + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +// Provided by src/android/common/breakpad_getcontext.S +int breakpad_getcontext(ucontext_t* ucp); + +#define getcontext(x) breakpad_getcontext(x) + +#ifdef __cplusplus +} // extern "C" +#endif // __cplusplus + +#endif // __BIONIC_UCONTEXT_H + +#endif // GOOGLE_BREAKPAD_COMMON_ANDROID_INCLUDE_UCONTEXT_H |