12a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris/*
22a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * Copyright (C) 2016 The Android Open Source Project
32a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * All rights reserved.
42a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris *
52a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * Redistribution and use in source and binary forms, with or without
62a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * modification, are permitted provided that the following conditions
72a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * are met:
82a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris *  * Redistributions of source code must retain the above copyright
92a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris *    notice, this list of conditions and the following disclaimer.
102a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris *  * Redistributions in binary form must reproduce the above copyright
112a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris *    notice, this list of conditions and the following disclaimer in
122a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris *    the documentation and/or other materials provided with the
132a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris *    distribution.
142a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris *
152a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
162a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
172a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
182a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
192a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
202a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
212a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
222a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
232a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
242a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
252a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
262a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris * SUCH DAMAGE.
272a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris */
282a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
292a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#ifndef _LIBUNWINDSTACK_UCONTEXT_H
302a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#define _LIBUNWINDSTACK_UCONTEXT_H
312a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
322a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#include <stdint.h>
332a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
34d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferrisnamespace unwindstack {
35d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris
362a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
372a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris// ARM ucontext structures
382a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
392a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct arm_stack_t {
402a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t ss_sp;    // void __user*
412a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  int32_t ss_flags;  // int
422a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t ss_size;  // size_t
432a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
442a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
452a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct arm_mcontext_t {
462a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t trap_no;             // unsigned long
472a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t error_code;          // unsigned long
482a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t oldmask;             // unsigned long
492a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t regs[ARM_REG_LAST];  // unsigned long
502a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t cpsr;                // unsigned long
512a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t fault_address;       // unsigned long
522a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
532a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
542a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct arm_ucontext_t {
552a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t uc_flags;  // unsigned long
562a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t uc_link;   // struct ucontext*
572a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  arm_stack_t uc_stack;
582a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  arm_mcontext_t uc_mcontext;
592a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  // Nothing else is used, so don't define it.
602a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
612a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
622a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
632a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
642a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris// ARM64 ucontext structures
652a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
662a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct arm64_stack_t {
672a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t ss_sp;    // void __user*
682a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  int32_t ss_flags;  // int
692a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t ss_size;  // size_t
702a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
712a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
722a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct arm64_sigset_t {
732a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t sig;  // unsigned long
742a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
752a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
762a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct arm64_mcontext_t {
772a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t fault_address;         // __u64
782a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t regs[ARM64_REG_LAST];  // __u64
792a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t pstate;                // __u64
802a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  // Nothing else is used, so don't define it.
812a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
822a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
832a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct arm64_ucontext_t {
842a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t uc_flags;  // unsigned long
852a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t uc_link;   // struct ucontext*
862a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  arm64_stack_t uc_stack;
872a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  arm64_sigset_t uc_sigmask;
882a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  // The kernel adds extra padding after uc_sigmask to match glibc sigset_t on ARM64.
892a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  char __padding[128 - sizeof(arm64_sigset_t)];
902a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  // The full structure requires 16 byte alignment, but our partial structure
912a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  // doesn't, so force the alignment.
922a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  arm64_mcontext_t uc_mcontext __attribute__((aligned(16)));
932a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
942a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
952a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
962a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
972a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris// X86 ucontext structures
982a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
992a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct x86_stack_t {
1002a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t ss_sp;    // void __user*
1012a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  int32_t ss_flags;  // int
1022a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t ss_size;  // size_t
1032a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
1042a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
1052a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct x86_mcontext_t {
1062a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t gs;
1072a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t fs;
1082a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t es;
1092a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t ds;
1102a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t edi;
1112a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t esi;
1122a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t ebp;
1132a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t esp;
1142a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t ebx;
1152a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t edx;
1162a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t ecx;
1172a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t eax;
1182a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t trapno;
1192a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t err;
1202a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t eip;
1212a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t cs;
1222a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t efl;
1232a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t uesp;
1242a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t ss;
1252a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  // Only care about the registers, skip everything else.
1262a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
1272a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
1282a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct x86_ucontext_t {
1292a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t uc_flags;  // unsigned long
1302a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint32_t uc_link;   // struct ucontext*
1312a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  x86_stack_t uc_stack;
1322a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  x86_mcontext_t uc_mcontext;
1332a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  // Nothing else is used, so don't define it.
1342a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
1352a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
1362a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
1372a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
1382a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris// X86_64 ucontext structures
1392a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
1402a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct x86_64_stack_t {
1412a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t ss_sp;    // void __user*
1422a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  int32_t ss_flags;  // int
1432a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t ss_size;  // size_t
1442a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
1452a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
1462a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferrisstruct x86_64_mcontext_t {
1472a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t r8;
1482a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t r9;
1492a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t r10;
1502a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t r11;
1512a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t r12;
1522a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t r13;
1532a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t r14;
1542a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t r15;
1552a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t rdi;
1562a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t rsi;
1572a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t rbp;
1582a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t rbx;
1592a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t rdx;
1602a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t rax;
1612a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t rcx;
1622a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t rsp;
1632a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t rip;
1642a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t efl;
1652a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t csgsfs;
1662a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t err;
1672a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t trapno;
1682a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t oldmask;
1692a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t cr2;
1702a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  // Only care about the registers, skip everything else.
1712a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris};
1722a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
173a019665b3cb73609c888af7f17c64bf80ec40283Christopher Ferrisstruct x86_64_ucontext_t {
1742a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t uc_flags;  // unsigned long
1752a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  uint64_t uc_link;   // struct ucontext*
1762a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  x86_64_stack_t uc_stack;
1772a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  x86_64_mcontext_t uc_mcontext;
1782a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris  // Nothing else is used, so don't define it.
179a019665b3cb73609c888af7f17c64bf80ec40283Christopher Ferris};
1802a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris//-------------------------------------------------------------------
1812a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris
182d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris}  // namespace unwindstack
183d226a5140989f509a0ed3e2723f05d5fc93ce8dfChristopher Ferris
1842a25c4aab5c7d0f0f6018789cce0b6e8c4abb03bChristopher Ferris#endif  // _LIBUNWINDSTACK_UCONTEXT_H
185