#ifndef _ARM_MCONTEXT_H_
#define _ARM_MCONTEXT_H_
#include <sys/stdint.h>
#if defined(__aarch64__)
#define _NGREG 35
#define _NGREG32 17
typedef __uint64_t __greg_t;
typedef unsigned int __greg32_t;
typedef __greg32_t __gregset32_t[_NGREG32];
#elif defined(__arm__)
#define _NGREG 17
typedef unsigned int __greg_t;
#endif
typedef __greg_t __gregset_t[_NGREG];
#define _REG_R0 0
#define _REG_R1 1
#define _REG_R2 2
#define _REG_R3 3
#define _REG_R4 4
#define _REG_R5 5
#define _REG_R6 6
#define _REG_R7 7
#define _REG_R8 8
#define _REG_R9 9
#define _REG_R10 10
#define _REG_R11 11
#define _REG_R12 12
#define _REG_R13 13
#define _REG_R14 14
#define _REG_R15 15
#define _REG_CPSR 16
#define _REG_X0 0
#define _REG_X1 1
#define _REG_X2 2
#define _REG_X3 3
#define _REG_X4 4
#define _REG_X5 5
#define _REG_X6 6
#define _REG_X7 7
#define _REG_X8 8
#define _REG_X9 9
#define _REG_X10 10
#define _REG_X11 11
#define _REG_X12 12
#define _REG_X13 13
#define _REG_X14 14
#define _REG_X15 15
#define _REG_X16 16
#define _REG_X17 17
#define _REG_X18 18
#define _REG_X19 19
#define _REG_X20 20
#define _REG_X21 21
#define _REG_X22 22
#define _REG_X23 23
#define _REG_X24 24
#define _REG_X25 25
#define _REG_X26 26
#define _REG_X27 27
#define _REG_X28 28
#define _REG_X29 29
#define _REG_X30 30
#define _REG_X31 31
#define _REG_ELR 32
#define _REG_SPSR 33
#define _REG_TPIDR 34
#if defined(__aarch64__)
#define _REG_RV _REG_X0
#define _REG_FP _REG_X29
#define _REG_LR _REG_X30
#define _REG_SP _REG_X31
#define _REG_PC _REG_ELR
#elif defined(__arm__)
#define _REG_RV _REG_R0
#define _REG_FP _REG_R11
#define _REG_SP _REG_R13
#define _REG_LR _REG_R14
#define _REG_PC _REG_R15
#endif
#if defined(__aarch64__)
#define _NFREG 32
typedef struct {
union __freg {
__uint8_t __b8[16];
__uint16_t __h16[8];
__uint32_t __s32[4];
__uint64_t __d64[2];
__uint128_t __q128[1];
} __qregs[_NFREG] __aligned(16);
__uint32_t __fpcr;
__uint32_t __fpsr;
} __fregset_t;
typedef struct {
#if 1
unsigned int __vfp_fpscr;
uint64_t __vfp_fstmx[32];
unsigned int __vfp_fpsid;
#else
unsigned int __vfp_fpscr;
unsigned int __vfp_fstmx[33];
unsigned int __vfp_fpsid;
#endif
} __vfpregset32_t;
typedef struct {
__gregset32_t __gregs;
__vfpregset32_t __vfpregs;
__greg32_t _mc_tlsbase;
__greg32_t _mc_user_tpid;
} mcontext32_t;
typedef struct {
__gregset_t __gregs;
__fregset_t __fregs;
__greg_t __spare[8];
} mcontext_t;
#elif defined(__arm__)
typedef struct {
unsigned int __fp_fpsr;
struct {
unsigned int __fp_exponent;
unsigned int __fp_mantissa_hi;
unsigned int __fp_mantissa_lo;
} __fp_fr[8];
} __fpregset_t;
typedef struct {
#ifdef __ARM_EABI__
unsigned int __vfp_fpscr;
uint64_t __vfp_fstmx[32];
unsigned int __vfp_fpsid;
#else
unsigned int __vfp_fpscr;
unsigned int __vfp_fstmx[33];
unsigned int __vfp_fpsid;
#endif
} __vfpregset_t;
typedef struct {
__gregset_t __gregs;
union {
__fpregset_t __fpregs;
__vfpregset_t __vfpregs;
} __fpu;
__greg_t _mc_tlsbase;
__greg_t _mc_user_tpid;
} mcontext_t, mcontext32_t;
#define _UC_MACHINE_PAD 1
#ifdef __ARM_EABI__
#define __UCONTEXT_SIZE (256 + 144)
#else
#define __UCONTEXT_SIZE 256
#endif
#endif
#define _UC_TLSBASE _UC_MD_BIT19
#define _UC_ARM_VFP _UC_MD_BIT16
#define _UC_SETSTACK _UC_MD_BIT17
#define _UC_CLRSTACK _UC_MD_BIT18
#define _UC_MACHINE_SP(uc) ((uc)->uc_mcontext.__gregs[_REG_SP])
#define _UC_MACHINE_FP(uc) ((uc)->uc_mcontext.__gregs[_REG_FP])
#define _UC_MACHINE_PC(uc) ((uc)->uc_mcontext.__gregs[_REG_PC])
#define _UC_MACHINE_INTRV(uc) ((uc)->uc_mcontext.__gregs[_REG_RV])
#define _UC_MACHINE_SET_PC(uc, pc) \
_UC_MACHINE_PC(uc) = (pc)
#if defined(_KERNEL)
__BEGIN_DECLS
void vfp_getcontext(struct lwp *, mcontext_t *, int *);
void vfp_setcontext(struct lwp *, const mcontext_t *);
__END_DECLS
#endif
#endif