From patchwork Mon Apr 25 14:03:08 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: German Gomez X-Patchwork-Id: 53187 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2BFEB3857C49 for ; Mon, 25 Apr 2022 14:03:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2BFEB3857C49 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650895422; bh=1RFqPAqZ9l3zri0jLUHiw1KQaZXiduH5AhbtDqBG/zU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:From; b=eiXWJih0Tyfe3g3c1fI8cx1EVg26AbOCQ3jcHxBDc4Y4kCG3EBQWku0kG+i6YOn2B EDP4yH2IyHAgXoXsb7bStcxXZ9w56Lp1htZLdnZC8F5qt887gpplYK49Q5jv72O+zT vfZXY8Md371dMVejVqYfynPtNgTjx7mSaU7eXzCs= X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 156B53858D33 for ; Mon, 25 Apr 2022 14:03:24 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 156B53858D33 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C55E9ED1; Mon, 25 Apr 2022 07:03:23 -0700 (PDT) Received: from ip-10-252-15-96.eu-west-1.compute.internal (unknown [10.252.15.96]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 2DB8C3F774; Mon, 25 Apr 2022 07:03:23 -0700 (PDT) To: elfutils-devel@sourceware.org Subject: [PATCH 1/4] aarch64: Create definitions for AARCH64_RA_SIGN_STATE register Date: Mon, 25 Apr 2022 14:03:08 +0000 Message-Id: <20220425140311.95231-2-german.gomez@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220425140311.95231-1-german.gomez@arm.com> References: <20220425140311.95231-1-german.gomez@arm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-12.2 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: German Gomez via Elfutils-devel From: German Gomez Reply-To: German Gomez Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org Sender: "Elfutils-devel" This register will be used to indicate whether a return address is mangled with a PAC or not, in accordance with the DWARF AARCH64 ABI [1]. [1] https://github.com/ARM-software/abi-aa/blob/main/aadwarf64/aadwarf64.rst#41dwarf-register-names Signed-off-by: German Gomez --- backends/aarch64_init.c | 6 +++--- backends/aarch64_initreg.c | 2 ++ backends/aarch64_regs.c | 5 ++++- libdw/dwarf.h | 5 +++++ tests/run-addrcfi.sh | 1 + tests/run-allregs.sh | 1 + 6 files changed, 16 insertions(+), 4 deletions(-) diff --git a/backends/aarch64_init.c b/backends/aarch64_init.c index bed92954..0a3a2c79 100644 --- a/backends/aarch64_init.c +++ b/backends/aarch64_init.c @@ -55,10 +55,10 @@ aarch64_init (Elf *elf __attribute__ ((unused)), HOOK (eh, data_marker_symbol); HOOK (eh, abi_cfi); - /* X0-X30 (31 regs) + SP + 1 Reserved + ELR, 30 Reserved regs (34-43) + /* X0-X30 (31 regs) + SP + 1 Reserved + ELR + RA_SIGN_STATE, 30 Reserved regs (34-43) + V0-V31 (32 regs, least significant 64 bits only) - + ALT_FRAME_RETURN_COLUMN (used when LR isn't used) = 97 DWARF regs. */ - eh->frame_nregs = 97; + + ALT_FRAME_RETURN_COLUMN (used when LR isn't used) = 98 DWARF regs. */ + eh->frame_nregs = 98; HOOK (eh, set_initial_registers_tid); HOOK (eh, unwind); diff --git a/backends/aarch64_initreg.c b/backends/aarch64_initreg.c index daf6f375..4661068a 100644 --- a/backends/aarch64_initreg.c +++ b/backends/aarch64_initreg.c @@ -73,6 +73,8 @@ aarch64_set_initial_registers_tid (pid_t tid __attribute__ ((unused)), /* ELR cannot be found. */ + /* RA_SIGN_STATE cannot be found */ + /* FP registers (only 64bits are used). */ struct user_fpsimd_struct fregs; iovec.iov_base = &fregs; diff --git a/backends/aarch64_regs.c b/backends/aarch64_regs.c index 23014bfc..e95ece37 100644 --- a/backends/aarch64_regs.c +++ b/backends/aarch64_regs.c @@ -87,7 +87,10 @@ aarch64_register_info (Ebl *ebl __attribute__ ((unused)), case 33: return regtype ("integer", DW_ATE_address, "elr"); - case 34 ... 63: + case 34: + return regtype ("integer", DW_ATE_unsigned, "ra_sign_state"); + + case 35 ... 63: return 0; case 64 ... 95: diff --git a/libdw/dwarf.h b/libdw/dwarf.h index 3ce7f236..f234c411 100644 --- a/libdw/dwarf.h +++ b/libdw/dwarf.h @@ -1011,6 +1011,11 @@ enum DW_EH_PE_indirect = 0x80 }; +/* AARCH64 DWARF registers. */ +enum + { + DW_AARCH64_RA_SIGN_STATE = 34 + }; /* DWARF XXX. */ #define DW_ADDR_none 0 diff --git a/tests/run-addrcfi.sh b/tests/run-addrcfi.sh index 64fa24d7..ce9e753e 100755 --- a/tests/run-addrcfi.sh +++ b/tests/run-addrcfi.sh @@ -3639,6 +3639,7 @@ dwarf_cfi_addrframe (.eh_frame): no matching address range integer reg30 (x30): same_value integer reg31 (sp): location expression: call_frame_cfa stack_value integer reg33 (elr): undefined + integer reg34 (ra_sign_state): undefined FP/SIMD reg64 (v0): undefined FP/SIMD reg65 (v1): undefined FP/SIMD reg66 (v2): undefined diff --git a/tests/run-allregs.sh b/tests/run-allregs.sh index 87b16c95..ed086651 100755 --- a/tests/run-allregs.sh +++ b/tests/run-allregs.sh @@ -2693,6 +2693,7 @@ integer registers: 30: x30 (x30), signed 64 bits 31: sp (sp), address 64 bits 33: elr (elr), address 64 bits + 34: ra_sign_state (ra_sign_state), unsigned 64 bits FP/SIMD registers: 64: v0 (v0), unsigned 128 bits 65: v1 (v1), unsigned 128 bits From patchwork Mon Apr 25 14:03:09 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: German Gomez X-Patchwork-Id: 53188 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6F0F43858430 for ; Mon, 25 Apr 2022 14:03:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 6F0F43858430 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650895432; bh=V/lBf4jsMWRbllSpf+9uRUhlhGAtfUhVHdygBeXCKQQ=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:From; b=Xnyy95DVcYTaQidVwJLrNxaR1LJqKRsOMT6r9OAWerqwYqRM4i7dStRZHYTwtA9xH Vcupi3Jp9nP4kab/lPC8Oh62grsQ7GZ3092zMtiVvbVVhHubcJOz5UFnSufLEQM/km AX6lidat6wWSieHZFZfhrRxfcT2i3aK+IprRFOXA= X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 730CD3858403 for ; Mon, 25 Apr 2022 14:03:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 730CD3858403 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 38BFD1FB; Mon, 25 Apr 2022 07:03:25 -0700 (PDT) Received: from ip-10-252-15-96.eu-west-1.compute.internal (unknown [10.252.15.96]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 9524F3F774; Mon, 25 Apr 2022 07:03:24 -0700 (PDT) To: elfutils-devel@sourceware.org Subject: [PATCH 2/4] libdw, aarch64: Implement DW_CFA_AARCH64_negate_ra_state CFI instruction Date: Mon, 25 Apr 2022 14:03:09 +0000 Message-Id: <20220425140311.95231-3-german.gomez@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220425140311.95231-1-german.gomez@arm.com> References: <20220425140311.95231-1-german.gomez@arm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: German Gomez via Elfutils-devel From: German Gomez Reply-To: German Gomez Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org Sender: "Elfutils-devel" Implement DW_CFA_AARCH64_negate_ra_state in accordance with the DWARF AARCH64 ABI [1]. Followup commits will use the value of this register to remove the PAC from return addresses. [1] https://github.com/ARM-software/abi-aa/blob/main/aadwarf64/aadwarf64.rst#44call-frame-instructions Signed-off-by: German Gomez --- libdw/cfi.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/libdw/cfi.c b/libdw/cfi.c index a73fb03f..f985b4d8 100644 --- a/libdw/cfi.c +++ b/libdw/cfi.c @@ -125,6 +125,15 @@ execute_cfi (Dwarf_CFI *cache, fs->regs[regno].value = (r_value); \ } while (0) + /* The AARCH64 DWARF ABI states that register 34 (ra_sign_state) must + be initialized to 0. So do it before executing the CFI. */ + if (cache->e_machine == EM_AARCH64) + { + if (unlikely (! enough_registers (DW_AARCH64_RA_SIGN_STATE, &fs, &result))) + goto out; + fs->regs[DW_AARCH64_RA_SIGN_STATE].value = 0; + } + while (program < end) { uint8_t opcode = *program++; @@ -355,7 +364,10 @@ execute_cfi (Dwarf_CFI *cache, { /* Toggles the return address state, indicating whether the return address is encrypted or not on - aarch64. XXX not handled yet. */ + aarch64. */ + if (unlikely (! enough_registers (DW_AARCH64_RA_SIGN_STATE, &fs, &result))) + goto out; + fs->regs[DW_AARCH64_RA_SIGN_STATE].value ^= 0x1; } else { From patchwork Mon Apr 25 14:03:10 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: German Gomez X-Patchwork-Id: 53189 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B76753858406 for ; Mon, 25 Apr 2022 14:04:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B76753858406 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650895442; bh=SRzentKfn7jfJnsRkCkbNkPSoRV1ZrGGigwmsjxy74c=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:From; b=RQGACn8mI0PY4klaI23g7fJwtcWM4mT01of1KoCXCeGgl5bZnPBRJjqEE2m+YYHQh g9sWgUqOASVWPoEWBPgdbKMv/J5CKkWjvezw4P2Gu1WWRK8Yd9HrPxV9QpWKL47xAa 3UkxlTfuP1AU9nhuCJccnGq5r23wCGvnyGxR25NY= X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 0F1923858009 for ; Mon, 25 Apr 2022 14:03:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 0F1923858009 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id A02EBED1; Mon, 25 Apr 2022 07:03:26 -0700 (PDT) Received: from ip-10-252-15-96.eu-west-1.compute.internal (unknown [10.252.15.96]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 087523F774; Mon, 25 Apr 2022 07:03:25 -0700 (PDT) To: elfutils-devel@sourceware.org Subject: [PATCH 3/4] libdwfl, aarch64: Demangle return addresses using a PAC mask Date: Mon, 25 Apr 2022 14:03:10 +0000 Message-Id: <20220425140311.95231-4-german.gomez@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220425140311.95231-1-german.gomez@arm.com> References: <20220425140311.95231-1-german.gomez@arm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-13.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: German Gomez via Elfutils-devel From: German Gomez Reply-To: German Gomez Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org Sender: "Elfutils-devel" Demangle mangled return addresses on AARCH64. The value of the masks is stored in the struct Dwfl_Thread. Signed-off-by: German Gomez --- libdwfl/dwfl_frame.c | 3 +++ libdwfl/frame_unwind.c | 14 +++++++++++++- libdwfl/libdwflP.h | 7 +++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c index 77e0c5cb..88972d8e 100644 --- a/libdwfl/dwfl_frame.c +++ b/libdwfl/dwfl_frame.c @@ -270,6 +270,8 @@ dwfl_getthreads (Dwfl *dwfl, int (*callback) (Dwfl_Thread *thread, void *arg), thread.process = process; thread.unwound = NULL; thread.callbacks_arg = NULL; + thread.aarch64.pauth_insn_mask = 0; + for (;;) { thread.tid = process->callbacks->next_thread (dwfl, @@ -340,6 +342,7 @@ getthread (Dwfl *dwfl, pid_t tid, thread.process = process; thread.unwound = NULL; thread.callbacks_arg = NULL; + thread.aarch64.pauth_insn_mask = 0; if (process->callbacks->get_thread (dwfl, tid, process->callbacks_arg, &thread.callbacks_arg)) diff --git a/libdwfl/frame_unwind.c b/libdwfl/frame_unwind.c index 9ac33833..839d1eff 100644 --- a/libdwfl/frame_unwind.c +++ b/libdwfl/frame_unwind.c @@ -610,7 +610,19 @@ handle_cfi (Dwfl_Frame *state, Dwarf_Addr pc, Dwarf_CFI *cfi, Dwarf_Addr bias) /* Some architectures encode some extra info in the return address. */ if (regno == frame->fde->cie->return_address_register) - regval &= ebl_func_addr_mask (ebl); + { + regval &= ebl_func_addr_mask (ebl); + + /* In aarch64, pseudo-register RA_SIGN_STATE indicates whether the + return address needs demangling using the PAC mask from the + thread. */ + if (cfi->e_machine == EM_AARCH64 && + frame->nregs > DW_AARCH64_RA_SIGN_STATE && + frame->regs[DW_AARCH64_RA_SIGN_STATE].value & 0x1) + { + regval &= ~(state->thread->aarch64.pauth_insn_mask); + } + } /* This is another strange PPC[64] case. There are two registers numbers that can represent the same DWARF return diff --git a/libdwfl/libdwflP.h b/libdwfl/libdwflP.h index 7503a627..d3fe8118 100644 --- a/libdwfl/libdwflP.h +++ b/libdwfl/libdwflP.h @@ -244,6 +244,12 @@ struct Dwfl_Thread /* Bottom (innermost) frame while we're initializing, NULL afterwards. */ Dwfl_Frame *unwound; void *callbacks_arg; + + /* Data for handling AARCH64 (currently limited to demangling PAC from + return addresses). */ + struct { + Dwarf_Addr pauth_insn_mask; + } aarch64; }; /* See its typedef in libdwfl.h. */ @@ -782,6 +788,7 @@ INTDECL (dwfl_thread_tid) INTDECL (dwfl_frame_thread) INTDECL (dwfl_thread_state_registers) INTDECL (dwfl_thread_state_register_pc) +INTDECL (dwfl_thread_state_aarch64_pauth) INTDECL (dwfl_getthread_frames) INTDECL (dwfl_getthreads) INTDECL (dwfl_thread_getframes) From patchwork Mon Apr 25 14:03:11 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: German Gomez X-Patchwork-Id: 53190 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 35F7D3858016 for ; Mon, 25 Apr 2022 14:04:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 35F7D3858016 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1650895453; bh=a3lxPDL/f6lU1ryFuVewLfLXcOlctlRGAW/sBcYBPu4=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Help:List-Subscribe:From:Reply-To:From; b=VdsFlR7bwd63040YEATlGoQXwQd49m3i7vZ3sK5MrzLi0WMAUuq9RHfO8cv2id8nv zv05XzoSgyvaIO8AumigISKvoCB+KEGLLkl82kR1GdfTo5x1uX+zCpPkGCOOSbcRgU MXJJgZp+66hycZK1sItAh1qWLLi0kHql/AjUNtRs= X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 5BAA13858C83 for ; Mon, 25 Apr 2022 14:03:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5BAA13858C83 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1F60011FB; Mon, 25 Apr 2022 07:03:28 -0700 (PDT) Received: from ip-10-252-15-96.eu-west-1.compute.internal (unknown [10.252.15.96]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 7BB473F774; Mon, 25 Apr 2022 07:03:27 -0700 (PDT) To: elfutils-devel@sourceware.org Subject: [PATCH 4/4] libdwfl, eu-stack, aarch64: Add API for setting AARCH64 PAC mask. Date: Mon, 25 Apr 2022 14:03:11 +0000 Message-Id: <20220425140311.95231-5-german.gomez@arm.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220425140311.95231-1-german.gomez@arm.com> References: <20220425140311.95231-1-german.gomez@arm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-Patchwork-Original-From: German Gomez via Elfutils-devel From: German Gomez Reply-To: German Gomez Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org Sender: "Elfutils-devel" Add user API for setting the PAC mask. The function is intended to be called in Dwfl_Thread_Callbacks.set_initial_registers. Testing notes: ... consider the following program.c | int a = 0; | void leaf(void) { | for (;;) | a += a; | } | void parent(void) { | leaf(); | } | int main(void) { | parent(); | return 0; | } ... compiled with "gcc-10 -O0 -g -mbranch-protection=pac-ret+leaf program.c" ... should yield the correct call stack, without mangled addresses: | $ eu-stack -p | | PID 760267 - process | TID 760267: | #0 0x0000aaaaaebd0804 leaf | #1 0x0000aaaaaebd0818 parent | #2 0x0000aaaaaebd0838 main | #3 0x0000ffffbd52ad50 __libc_start_main | #4 0x0000aaaaaebd0694 $x Signed-off-by: German Gomez --- libdw/libdw.map | 5 +++++ libdwfl/dwfl_frame_regs.c | 10 ++++++++++ libdwfl/libdwfl.h | 6 ++++++ libdwfl/linux-pid-attach.c | 34 ++++++++++++++++++++++++++++++++-- 4 files changed, 53 insertions(+), 2 deletions(-) diff --git a/libdw/libdw.map b/libdw/libdw.map index 4f530378..469c72ab 100644 --- a/libdw/libdw.map +++ b/libdw/libdw.map @@ -366,3 +366,8 @@ ELFUTILS_0.186 { dwarf_linecontext; dwarf_linefunctionname; } ELFUTILS_0.177; + +ELFUTILS_0.188 { + global: + dwfl_thread_state_aarch64_pauth; +} ELFUTILS_0.186; diff --git a/libdwfl/dwfl_frame_regs.c b/libdwfl/dwfl_frame_regs.c index 83b1abef..f8baf6d3 100644 --- a/libdwfl/dwfl_frame_regs.c +++ b/libdwfl/dwfl_frame_regs.c @@ -59,3 +59,13 @@ dwfl_thread_state_register_pc (Dwfl_Thread *thread, Dwarf_Word pc) state->pc_state = DWFL_FRAME_STATE_PC_SET; } INTDEF(dwfl_thread_state_register_pc) + +void +dwfl_thread_state_aarch64_pauth(Dwfl_Thread *thread, Dwarf_Word insn_mask) +{ + Dwfl_Frame *state = thread->unwound; + assert (state && state->unwound == NULL); + assert (state->initial_frame); + thread->aarch64.pauth_insn_mask = insn_mask; +} +INTDEF(dwfl_thread_state_aarch64_pauth) diff --git a/libdwfl/libdwfl.h b/libdwfl/libdwfl.h index f98f1d52..9eef703c 100644 --- a/libdwfl/libdwfl.h +++ b/libdwfl/libdwfl.h @@ -753,6 +753,12 @@ bool dwfl_thread_state_registers (Dwfl_Thread *thread, int firstreg, void dwfl_thread_state_register_pc (Dwfl_Thread *thread, Dwarf_Word pc) __nonnull_attribute__ (1); +/* Called by Dwfl_Thread_Callbacks.set_initial_registers implementation. + On AARCH64 platforms with Pointer Authentication, the bits from this mask + indicate the position of the PAC bits in return addresses. */ +void dwfl_thread_state_aarch64_pauth (Dwfl_Thread *thread, Dwarf_Word insn_mask) + __nonnull_attribute__ (1); + /* Iterate through the threads for a process. Returns zero if all threads have been processed by the callback, returns -1 on error, or the value of the callback when not DWARF_CB_OK. -1 returned on error will set dwfl_errno (). diff --git a/libdwfl/linux-pid-attach.c b/libdwfl/linux-pid-attach.c index 09cba07b..bf50a5bc 100644 --- a/libdwfl/linux-pid-attach.c +++ b/libdwfl/linux-pid-attach.c @@ -321,6 +321,28 @@ pid_thread_state_registers_cb (int firstreg, unsigned nregs, return INTUSE(dwfl_thread_state_registers) (thread, firstreg, nregs, regs); } +#if defined(__aarch64__) + +#include /* struct user_pac_mask */ + +static void +pid_set_aarch64_pauth(Dwfl_Thread *thread, pid_t tid) +{ + struct user_pac_mask pac_mask; + struct iovec iovec; + + iovec.iov_base = &pac_mask; + iovec.iov_len = sizeof (pac_mask); + + /* If the ptrace returns an error, the system may not support pointer + authentication. In that case, set the masks to 0 (no PAC bits). */ + if (ptrace(PTRACE_GETREGSET, tid, NT_ARM_PAC_MASK, &iovec)) + pac_mask.insn_mask = 0; + + INTUSE(dwfl_thread_state_aarch64_pauth) (thread, pac_mask.insn_mask); +} +#endif /* __aarch64__ */ + static bool pid_set_initial_registers (Dwfl_Thread *thread, void *thread_arg) { @@ -333,8 +355,16 @@ pid_set_initial_registers (Dwfl_Thread *thread, void *thread_arg) pid_arg->tid_attached = tid; Dwfl_Process *process = thread->process; Ebl *ebl = process->ebl; - return ebl_set_initial_registers_tid (ebl, tid, - pid_thread_state_registers_cb, thread); + if (!ebl_set_initial_registers_tid (ebl, tid, + pid_thread_state_registers_cb, thread)) + return false; + +#if defined(__aarch64__) + /* Set aarch64 pointer authentication data. */ + pid_set_aarch64_pauth(thread, tid); +#endif + + return true; } static void