From patchwork Mon Aug 26 10:52:55 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steve Capper X-Patchwork-Id: 96488 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 818FD385EC13 for ; Mon, 26 Aug 2024 10:53:36 +0000 (GMT) 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 781F83858C3A for ; Mon, 26 Aug 2024 10:53:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 781F83858C3A Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=arm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 781F83858C3A Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=217.140.110.172 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1724669604; cv=none; b=dTHWfppgs3PjZ/qS9w0/ZrRIWopPYj48mZoFsyw+3ebVghUqTAAs0ktRHStYLwbDLMnwqoBnLKlDhhGT4vxu1f5wIZxYL8/fdjjSYK+CsZ1oWMAIOJswGsa5yyumEIB622YioMfWDU2lgBZBpsiGxG2dDq2QKxJMbXvXyJjUFOE= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1724669604; c=relaxed/simple; bh=MMFeZj1/0XnDO1m2fwuTuVUJ+2Q5JlyyHwAY2BUC4yI=; h=From:To:Subject:Date:Message-ID:MIME-Version; b=DRFnDQNHSTiMo0Yog7+QSDYa7DsOXhiyX/1t5+LY6+EmgJzIvmGDfhQS7qpO2k2ONizOGyg576j9rG+csJ7swEuRB6YTKnI8t0Kmz+wlpWcVlbtIMeAv/a8sbruF8XUzCn//qkuAKuBzh901NcgMlHXpqghy+mk5L5vGtjQ3RRY= ARC-Authentication-Results: i=1; server2.sourceware.org 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 752ED139F; Mon, 26 Aug 2024 03:53:48 -0700 (PDT) Received: from localhost.localdomain (usa-sjc-mx-foss1.foss.arm.com [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 96DD73F66E; Mon, 26 Aug 2024 03:53:21 -0700 (PDT) From: Steve Capper To: elfutils-devel@sourceware.org Cc: mark@klomp.org, german.gomez@arm.com, ema@debian.org, Steve Capper Subject: [PATCH v2 3/5] libdwfl, aarch64: Demangle return addresses using a PAC mask Date: Mon, 26 Aug 2024 11:52:55 +0100 Message-ID: <20240826105257.2669-4-steve.capper@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240826105257.2669-1-steve.capper@arm.com> References: <20240826105257.2669-1-steve.capper@arm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-12.3 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_NONE, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: elfutils-devel-bounces~patchwork=sourceware.org@sourceware.org From: German Gomez Demangle mangled return addresses on AARCH64. The value of the masks is stored in the struct Dwfl_Thread. Signed-off-by: German Gomez [SteveC: remove dwfl_thread_state_aarch64_pauth] Signed-off-by: Steve Capper --- libdwfl/dwfl_frame.c | 3 +++ libdwfl/frame_unwind.c | 14 +++++++++++++- libdwfl/libdwflP.h | 6 ++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/libdwfl/dwfl_frame.c b/libdwfl/dwfl_frame.c index 5ee71dd4..8af8843f 100644 --- a/libdwfl/dwfl_frame.c +++ b/libdwfl/dwfl_frame.c @@ -269,6 +269,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, @@ -339,6 +341,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 1e2f0255..ab444d25 100644 --- a/libdwfl/frame_unwind.c +++ b/libdwfl/frame_unwind.c @@ -599,7 +599,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 e0055d65..d0a5f056 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. */