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