14906e5653c57d49f94940f28556009a88c42a583Elliott Hughes/* 24906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * Copyright (C) 2013 The Android Open Source Project 34906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * All rights reserved. 44906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * 54906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * Redistribution and use in source and binary forms, with or without 64906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * modification, are permitted provided that the following conditions 74906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * are met: 84906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * * Redistributions of source code must retain the above copyright 94906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * notice, this list of conditions and the following disclaimer. 104906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * * Redistributions in binary form must reproduce the above copyright 114906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * notice, this list of conditions and the following disclaimer in 124906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * the documentation and/or other materials provided with the 134906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * distribution. 144906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * 154906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 164906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 174906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 184906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 194906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 204906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 214906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 224906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 234906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 244906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 254906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 264906e5653c57d49f94940f28556009a88c42a583Elliott Hughes * SUCH DAMAGE. 274906e5653c57d49f94940f28556009a88c42a583Elliott Hughes */ 284906e5653c57d49f94940f28556009a88c42a583Elliott Hughes 29851e68a2402fa414544e66650e09dfdaac813e51Elliott Hughes#include <private/bionic_asm.h> 304906e5653c57d49f94940f28556009a88c42a583Elliott Hughes 318eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin// DWARF constants. 328eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_CFA_def_cfa_expression 0x0f 338eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_CFA_expression 0x10 348eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_EH_PE_pcrel 0x10 358eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_EH_PE_sdata4 0x0b 368eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_OP_breg4 0x74 378eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_OP_breg7 0x77 388eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_OP_deref 0x06 398eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin 408eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin// Offsets into struct ucontext_t of uc_mcontext.gregs[x]. 418eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_R8 40 428eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_R9 48 438eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_R10 56 448eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_R11 64 458eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_R12 72 468eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_R13 80 478eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_R14 88 488eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_R15 96 498eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_RDI 104 508eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_RSI 112 518eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_RBP 120 528eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_RSP 160 538eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_RBX 128 548eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_RDX 136 558eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_RAX 144 568eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_RCX 152 578eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define OFFSET_RIP 168 588eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin 598eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin// Non-standard DWARF constants for the x86-64 registers. 608eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_RAX 0 618eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_RDX 1 628eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_RCX 2 638eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_RBX 3 648eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_RSI 4 658eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_RDI 5 668eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_RBP 6 678eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_RSP 7 688eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_R8 8 698eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_R9 9 708eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_R10 10 718eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_R11 11 728eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_R12 12 738eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_R13 13 748eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_R14 14 758eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_R15 15 768eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define DW_x86_64_RIP 16 778eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin 788eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define cfi_signal_frame_start(f) \ 798eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin.section .eh_frame,"a",@progbits; \ 808eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin.L ## f ## _START_EH_FRAME: \ 818eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .long 2f - 1f; /* CIE length. */ \ 828eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin1:.long 0; /* CIE ID. */ \ 838eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .byte 1; /* Version. */ \ 848eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .string "zRS"; /* Augmentation string. */ \ 858eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .uleb128 1; /* Code alignment factor. */ \ 868eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .sleb128 -8; /* Data alignment factor. */ \ 878eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .uleb128 DW_x86_64_RIP; /* Return address register. */ \ 888eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .uleb128 1; /* 1 byte of augmentation data. */ \ 898eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .byte (DW_EH_PE_pcrel | DW_EH_PE_sdata4); /* FDE encoding. */ \ 908eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .align 8; \ 918eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin2: \ 928eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .long .L ## f ## _END_FDE - .L ## f ## _START_FDE; /* FDE length. */ \ 938eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin.L ## f ## _START_FDE: \ 948eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .long .L ## f ## _START_FDE - .L ## f ## _START_EH_FRAME; /* CIE location. */ \ 958eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .long (.L ## f ## _START - 1) - .; /* pcrel start address (see FDE encoding above). */ \ 968eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .long .L ## f ## _END - (.L ## f ## _START - 1); /* Function this FDE applies to. */ \ 978eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .uleb128 0; /* FDE augmentation length. */ \ 988eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin 998eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define cfi_signal_frame_end(f) \ 1008eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin.L ## f ## _END_FDE: \ 1018eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin 1028eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define cfi_def_cfa(offset) \ 1038eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .byte DW_CFA_def_cfa_expression; \ 1048eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .uleb128 2f-1f; \ 1058eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin1:.byte DW_OP_breg7; \ 1068eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .sleb128 offset; \ 1078eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .byte DW_OP_deref; \ 1088eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin2: \ 1098eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin 1108eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin#define cfi_offset(reg_number,offset) \ 1118eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .byte DW_CFA_expression; \ 1128eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .uleb128 reg_number; \ 1138eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .uleb128 2f-1f; \ 1148eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin1:.byte DW_OP_breg7; \ 1158eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin .sleb128 offset; \ 1168eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin2: \ 1178eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin 1188eb8c3929974060e0d8b5063886d6ed250198d41Pavel ChupinENTRY_PRIVATE(__restore_rt) 1198eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin.L__restore_rt_START: 1207dc2b7b30ddc158a5e7aa6945526eb65d354b96cElliott Hughes mov $__NR_rt_sigreturn, %rax 1214906e5653c57d49f94940f28556009a88c42a583Elliott Hughes syscall 1228eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin.L__restore_rt_END: 1237dc2b7b30ddc158a5e7aa6945526eb65d354b96cElliott HughesEND(__restore_rt) 1248eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupincfi_signal_frame_start(__restore_rt) 1258eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_def_cfa(OFFSET_RSP) 1268eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_R8, OFFSET_R8) 1278eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_R9, OFFSET_R9) 1288eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_R10, OFFSET_R10) 1298eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_R11, OFFSET_R11) 1308eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_R12, OFFSET_R12) 1318eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_R13, OFFSET_R13) 1328eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_R14, OFFSET_R14) 1338eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_R15, OFFSET_R15) 1348eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_RDI, OFFSET_RDI) 1358eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_RSI, OFFSET_RSI) 1368eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_RBP, OFFSET_RBP) 1378eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_RSP, OFFSET_RSP) 1388eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_RBX, OFFSET_RBX) 1398eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_RDX, OFFSET_RDX) 1408eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_RAX, OFFSET_RAX) 1418eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_RCX, OFFSET_RCX) 1428eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupin cfi_offset(DW_x86_64_RIP, OFFSET_RIP) 1438eb8c3929974060e0d8b5063886d6ed250198d41Pavel Chupincfi_signal_frame_end(__restore_rt) 144