From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0B30ACCFA1A for ; Wed, 12 Nov 2025 04:38:44 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 95F058E0013; Tue, 11 Nov 2025 23:38:29 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 8726E8E0010; Tue, 11 Nov 2025 23:38:29 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 69E428E0013; Tue, 11 Nov 2025 23:38:29 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 49E5E8E0010 for ; Tue, 11 Nov 2025 23:38:29 -0500 (EST) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay03.hostedemail.com (Postfix) with ESMTP id 0F4DBB83EF for ; Wed, 12 Nov 2025 04:38:29 +0000 (UTC) X-FDA: 84100698738.08.B612511 Received: from mail.zytor.com (terminus.zytor.com [198.137.202.136]) by imf22.hostedemail.com (Postfix) with ESMTP id 55816C0006 for ; Wed, 12 Nov 2025 04:38:27 +0000 (UTC) Authentication-Results: imf22.hostedemail.com; dkim=pass header.d=zytor.com header.s=2025102301 header.b=daWKesqs; spf=pass (imf22.hostedemail.com: domain of hpa@zytor.com designates 198.137.202.136 as permitted sender) smtp.mailfrom=hpa@zytor.com; dmarc=pass (policy=none) header.from=zytor.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1762922307; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=ZWeLM+eLZ6QkLHozb4m4psR5mDIpb4RWIDkUQvFl5po=; b=kLqtF8OC/AT5aChOlqs+AUkecN31t41/x9E5jKhv2eZr8Iqfxn4Y0415tGDBWOFnmJIr8Z OqFxcBX5I0AsyqgxiSVeAv+db82KSC2XbeAgr6tbfcB1o8PuUWbgALLfI4MD2GTaVaUYIk Lyoco2PaUj7HnZfeRacUivQrKbKZmC4= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1762922307; a=rsa-sha256; cv=none; b=ujhJ+KN6XV1bFH8JFQ2aR49hgl9RAq7t49+hZ/xgYe+ENwFqQvwsQL+7Uw4Q/c+N42VIIU fSoJFM7q9NObeLgppTGh6gMOD1b292B7XV730gdxllpZxzyAK6kWkTA6Wj3pPOMsVQ2Xml /YIrJFk0rUPNVkZgExMVTrcGziBQCxg= ARC-Authentication-Results: i=1; imf22.hostedemail.com; dkim=pass header.d=zytor.com header.s=2025102301 header.b=daWKesqs; spf=pass (imf22.hostedemail.com: domain of hpa@zytor.com designates 198.137.202.136 as permitted sender) smtp.mailfrom=hpa@zytor.com; dmarc=pass (policy=none) header.from=zytor.com Received: from mail.zytor.com (c-76-133-66-138.hsd1.ca.comcast.net [76.133.66.138]) (authenticated bits=0) by mail.zytor.com (8.18.1/8.17.1) with ESMTPSA id 5AC4bYDR542538 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Tue, 11 Nov 2025 20:37:44 -0800 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.zytor.com 5AC4bYDR542538 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zytor.com; s=2025102301; t=1762922265; bh=ZWeLM+eLZ6QkLHozb4m4psR5mDIpb4RWIDkUQvFl5po=; h=From:To:Subject:Date:In-Reply-To:References:From; b=daWKesqsgq3AjzFWfCh0PIfWBznmeeyRPV3LIZ0XLsRmblnVVsN8mnlxtcoUk1CBR uhMtyKnblwAyf+rHsXNgXlHhJz7Dp/m5NSbNVCrTFQ/oNWTO4jz0wboxIGVT3t55gS Bd1fVcZPGgQMPk4YDp/96e1WYrvtO75Vka6lyTB0D8nFfzlYN5Zq/kwvblGsnrd9IX nDBUsrVFswzy3O17m5Qv88mB/nBrgYDwahoVLlwc6CGwkedBm4/2hH9XpewH0tVmgi AVFL5pncnkfXevzqEcHvx9i1vrLVolFzurKaY+6p6HaUV45NXEm0UWCHo18PX452bC XRlq+D1R7eskw== From: "H. Peter Anvin" To: "H. Peter Anvin" , "Jason A. Donenfeld" , "Peter Zijlstra (Intel)" , "Theodore Ts'o" , =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= , Xin Li , Andrew Cooper , Andy Lutomirski , Ard Biesheuvel , Borislav Petkov , Brian Gerst , Dave Hansen , Ingo Molnar , James Morse , Jarkko Sakkinen , Josh Poimboeuf , Kees Cook , Nam Cao , Oleg Nesterov , Perry Yuan , Thomas Gleixner , Thomas Huth , Uros Bizjak , linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-sgx@vger.kernel.org, x86@kernel.org Subject: [PATCH v2 5/9] x86/entry/vdso32: remove open-coded DWARF in sigreturn.S Date: Tue, 11 Nov 2025 20:37:23 -0800 Message-ID: <20251112043730.992152-6-hpa@zytor.com> X-Mailer: git-send-email 2.51.1 In-Reply-To: <20251112043730.992152-1-hpa@zytor.com> References: <20251112043730.992152-1-hpa@zytor.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: mb7cm4cxodchu8stncpszpoafjkac7sx X-Rspam-User: X-Rspamd-Queue-Id: 55816C0006 X-Rspamd-Server: rspam01 X-HE-Tag: 1762922307-527805 X-HE-Meta: U2FsdGVkX18s1WLhWrl5Z3aB1prHxcwiO40/haQU2Lut5LKrPBqILM2VcxHiITBix74ihliIxApHn1T9qtneqVDf1sVq7nJAwg2hpl1V4MVpPtCBidY1Kp8eB44DbK0kvYodjkJpw4MPSBcYjhIFkIVd3zKU9nMhFepcFxKGz2/l+Fos/CFjmb05bak3PC5yyh2S+Pox2NUAbkWrH5ZhL7L/Q9KfH4eEt5m5W/bt0Oqb8fIhG9nDXdIkpwHvr5SJyz4rLAgw+yrVNI3z2/KSMvdiGooM4lfkMisUdcvxbQlZQk8wa0TkqG8OuBX/FcCfp0tZAhVbxjT6ebDgBb6Puyij53cpBhXGh/kKj8JAwM7KRUZSGVMoCWtQAbP3LwUUpwAaK9nupBX7ICo9sDwVCt9Zh6DA90FzjzRElgSz6ouKy72Hwdreszuc5Rbl01fPmNZ2cILjSMlFGfwnjkL9OLMBAgO1Xgou5I4Vd65nDVQGd09jADB5nunsV0EBsy0zq18//pNmxzSu+3+X9mH779hSrWz7mdP8iR/j6pY9teu9hcV5ynrGHrNTxUX/N6GFmZGE94xK3abkuc2NMsRwCF3AHi9mQsB0IsiVUfJcvqwZUGUB8jJjrBEtR5An0OWhYTC/Vm5qLwQdqK4Mad0LDVttHcgblHHd9mjn9chPFokgeq1RN7iCvXEuK4bwrRYc9Sj1jFbHv6IwaLTNW6Wsd0j3Js5qcXgcflzUHgmJB5d5/PqVK9GQn8mHbSMzRMiR6/Lu5lyyQHF45go3vWSef7aegRZJBIaZc26pXeOQmLgAOl2lw5Z8LbV2z9lGYZzrJgq0D3ndvpocgDPUGdsIFpCYf3VijAzUEQvazxU2iQBZT5tY93wQZLk8WSfZ+pgDB4UEmua7/4/dco9z/bEmy4ZqoGEXlrlsbkYbYr7BqT86GqA8Ity+mRtz/WKkuVr+km8ntlSPlxc0op90uxc fVjsQfVp g9LS+Luw/uiHvKYurFCswv8h3Z6A3+w9ZptOukxw5MUHSw55yUu5g2N080c1ow77PXqQCDnkbrR4N5pWxAkoVxleugdtdzyHlajt8jcx2cHjDrV+4fpgez/CkyRL4PUOqaAer5jOaVT+2K4DudxCtXp7lfm8Z0WuR2ftkIZoS9ZPRhM08siKyCiHsAcpgozrvvWJzBMLRBMCXGW0NNpeGFIIVpTKCAZ8zt1lx8LQRMsLkuzcKTTeYLbJ6noZ98J2vud31MiyS5aMRqchLrrQBAp+6+Ga77vutQHQ/tTfIZw/Sou0= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: The vdso32 sigreturn.S contains open-coded DWARF bytecode, which includes a hack for gdb to not try to step back to a previous call instruction when backtracing from a signal handler. Neither of those are necessary anymore: the backtracing issue is handled by ".cfi_entry simple" and ".cfi_signal_frame", both of which have been supported for a very long time now, which allows the remaining frame to be built using regular .cfi annotations. Add a few more register offsets to the signal frame just for good measure. Replace the nop on fallthrough of the system call (which should never, ever happen) with a ud2a trap. Signed-off-by: H. Peter Anvin (Intel) --- arch/x86/entry/vdso/vdso32/sigreturn.S | 146 ++++++------------------- arch/x86/include/asm/dwarf2.h | 1 + arch/x86/kernel/asm-offsets.c | 6 + 3 files changed, 39 insertions(+), 114 deletions(-) diff --git a/arch/x86/entry/vdso/vdso32/sigreturn.S b/arch/x86/entry/vdso/vdso32/sigreturn.S index 965900c6763b..25b0ac4b4bfe 100644 --- a/arch/x86/entry/vdso/vdso32/sigreturn.S +++ b/arch/x86/entry/vdso/vdso32/sigreturn.S @@ -1,136 +1,54 @@ /* SPDX-License-Identifier: GPL-2.0 */ #include #include +#include #include +.macro STARTPROC_SIGNAL_FRAME sc + CFI_STARTPROC simple + CFI_SIGNAL_FRAME + /* -4 as pretcode has already been popped */ + CFI_DEF_CFA esp, \sc - 4 + CFI_OFFSET eip, IA32_SIGCONTEXT_ip + CFI_OFFSET eax, IA32_SIGCONTEXT_ax + CFI_OFFSET ebx, IA32_SIGCONTEXT_bx + CFI_OFFSET ecx, IA32_SIGCONTEXT_cx + CFI_OFFSET edx, IA32_SIGCONTEXT_dx + CFI_OFFSET esp, IA32_SIGCONTEXT_sp + CFI_OFFSET ebp, IA32_SIGCONTEXT_bp + CFI_OFFSET esi, IA32_SIGCONTEXT_si + CFI_OFFSET edi, IA32_SIGCONTEXT_di + CFI_OFFSET es, IA32_SIGCONTEXT_es + CFI_OFFSET cs, IA32_SIGCONTEXT_cs + CFI_OFFSET ss, IA32_SIGCONTEXT_ss + CFI_OFFSET ds, IA32_SIGCONTEXT_ds + CFI_OFFSET eflags, IA32_SIGCONTEXT_flags +.endm + .text .globl __kernel_sigreturn .type __kernel_sigreturn,@function - nop /* this guy is needed for .LSTARTFDEDLSI1 below (watch for HACK) */ ALIGN __kernel_sigreturn: -.LSTART_sigreturn: - popl %eax /* XXX does this mean it needs unwind info? */ + STARTPROC_SIGNAL_FRAME IA32_SIGFRAME_sigcontext + popl %eax + CFI_ADJUST_CFA_OFFSET -4 movl $__NR_sigreturn, %eax int $0x80 -.LEND_sigreturn: SYM_INNER_LABEL(vdso32_sigreturn_landing_pad, SYM_L_GLOBAL) - nop - .size __kernel_sigreturn,.-.LSTART_sigreturn + ud2a + CFI_ENDPROC + .size __kernel_sigreturn,.-__kernel_sigreturn .globl __kernel_rt_sigreturn .type __kernel_rt_sigreturn,@function ALIGN __kernel_rt_sigreturn: -.LSTART_rt_sigreturn: + STARTPROC_SIGNAL_FRAME IA32_RT_SIGFRAME_sigcontext movl $__NR_rt_sigreturn, %eax int $0x80 -.LEND_rt_sigreturn: SYM_INNER_LABEL(vdso32_rt_sigreturn_landing_pad, SYM_L_GLOBAL) - nop - .size __kernel_rt_sigreturn,.-.LSTART_rt_sigreturn - .previous - - .section .eh_frame,"a",@progbits -.LSTARTFRAMEDLSI1: - .long .LENDCIEDLSI1-.LSTARTCIEDLSI1 -.LSTARTCIEDLSI1: - .long 0 /* CIE ID */ - .byte 1 /* Version number */ - .string "zRS" /* NUL-terminated augmentation string */ - .uleb128 1 /* Code alignment factor */ - .sleb128 -4 /* Data alignment factor */ - .byte 8 /* Return address register column */ - .uleb128 1 /* Augmentation value length */ - .byte 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4. */ - .byte 0 /* DW_CFA_nop */ - .align 4 -.LENDCIEDLSI1: - .long .LENDFDEDLSI1-.LSTARTFDEDLSI1 /* Length FDE */ -.LSTARTFDEDLSI1: - .long .LSTARTFDEDLSI1-.LSTARTFRAMEDLSI1 /* CIE pointer */ - /* HACK: The dwarf2 unwind routines will subtract 1 from the - return address to get an address in the middle of the - presumed call instruction. Since we didn't get here via - a call, we need to include the nop before the real start - to make up for it. */ - .long .LSTART_sigreturn-1-. /* PC-relative start address */ - .long .LEND_sigreturn-.LSTART_sigreturn+1 - .uleb128 0 /* Augmentation */ - /* What follows are the instructions for the table generation. - We record the locations of each register saved. This is - complicated by the fact that the "CFA" is always assumed to - be the value of the stack pointer in the caller. This means - that we must define the CFA of this body of code to be the - saved value of the stack pointer in the sigcontext. Which - also means that there is no fixed relation to the other - saved registers, which means that we must use DW_CFA_expression - to compute their addresses. It also means that when we - adjust the stack with the popl, we have to do it all over again. */ - -#define do_cfa_expr(offset) \ - .byte 0x0f; /* DW_CFA_def_cfa_expression */ \ - .uleb128 1f-0f; /* length */ \ -0: .byte 0x74; /* DW_OP_breg4 */ \ - .sleb128 offset; /* offset */ \ - .byte 0x06; /* DW_OP_deref */ \ -1: - -#define do_expr(regno, offset) \ - .byte 0x10; /* DW_CFA_expression */ \ - .uleb128 regno; /* regno */ \ - .uleb128 1f-0f; /* length */ \ -0: .byte 0x74; /* DW_OP_breg4 */ \ - .sleb128 offset; /* offset */ \ -1: - - do_cfa_expr(IA32_SIGCONTEXT_sp+4) - do_expr(0, IA32_SIGCONTEXT_ax+4) - do_expr(1, IA32_SIGCONTEXT_cx+4) - do_expr(2, IA32_SIGCONTEXT_dx+4) - do_expr(3, IA32_SIGCONTEXT_bx+4) - do_expr(5, IA32_SIGCONTEXT_bp+4) - do_expr(6, IA32_SIGCONTEXT_si+4) - do_expr(7, IA32_SIGCONTEXT_di+4) - do_expr(8, IA32_SIGCONTEXT_ip+4) - - .byte 0x42 /* DW_CFA_advance_loc 2 -- nop; popl eax. */ - - do_cfa_expr(IA32_SIGCONTEXT_sp) - do_expr(0, IA32_SIGCONTEXT_ax) - do_expr(1, IA32_SIGCONTEXT_cx) - do_expr(2, IA32_SIGCONTEXT_dx) - do_expr(3, IA32_SIGCONTEXT_bx) - do_expr(5, IA32_SIGCONTEXT_bp) - do_expr(6, IA32_SIGCONTEXT_si) - do_expr(7, IA32_SIGCONTEXT_di) - do_expr(8, IA32_SIGCONTEXT_ip) - - .align 4 -.LENDFDEDLSI1: - - .long .LENDFDEDLSI2-.LSTARTFDEDLSI2 /* Length FDE */ -.LSTARTFDEDLSI2: - .long .LSTARTFDEDLSI2-.LSTARTFRAMEDLSI1 /* CIE pointer */ - /* HACK: See above wrt unwind library assumptions. */ - .long .LSTART_rt_sigreturn-1-. /* PC-relative start address */ - .long .LEND_rt_sigreturn-.LSTART_rt_sigreturn+1 - .uleb128 0 /* Augmentation */ - /* What follows are the instructions for the table generation. - We record the locations of each register saved. This is - slightly less complicated than the above, since we don't - modify the stack pointer in the process. */ - - do_cfa_expr(IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_sp) - do_expr(0, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_ax) - do_expr(1, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_cx) - do_expr(2, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_dx) - do_expr(3, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_bx) - do_expr(5, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_bp) - do_expr(6, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_si) - do_expr(7, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_di) - do_expr(8, IA32_RT_SIGFRAME_sigcontext-4 + IA32_SIGCONTEXT_ip) - - .align 4 -.LENDFDEDLSI2: + ud2a + CFI_ENDPROC + .size __kernel_rt_sigreturn,.-__kernel_rt_sigreturn .previous diff --git a/arch/x86/include/asm/dwarf2.h b/arch/x86/include/asm/dwarf2.h index 302e11b15da8..09c9684d3ad6 100644 --- a/arch/x86/include/asm/dwarf2.h +++ b/arch/x86/include/asm/dwarf2.h @@ -20,6 +20,7 @@ #define CFI_RESTORE_STATE .cfi_restore_state #define CFI_UNDEFINED .cfi_undefined #define CFI_ESCAPE .cfi_escape +#define CFI_SIGNAL_FRAME .cfi_signal_frame #ifndef BUILD_VDSO /* diff --git a/arch/x86/kernel/asm-offsets.c b/arch/x86/kernel/asm-offsets.c index 32ba599a51f8..a7e7df837405 100644 --- a/arch/x86/kernel/asm-offsets.c +++ b/arch/x86/kernel/asm-offsets.c @@ -63,8 +63,14 @@ static void __used common(void) OFFSET(IA32_SIGCONTEXT_bp, sigcontext_32, bp); OFFSET(IA32_SIGCONTEXT_sp, sigcontext_32, sp); OFFSET(IA32_SIGCONTEXT_ip, sigcontext_32, ip); + OFFSET(IA32_SIGCONTEXT_es, sigcontext_32, es); + OFFSET(IA32_SIGCONTEXT_cs, sigcontext_32, cs); + OFFSET(IA32_SIGCONTEXT_ss, sigcontext_32, ss); + OFFSET(IA32_SIGCONTEXT_ds, sigcontext_32, ds); + OFFSET(IA32_SIGCONTEXT_flags, sigcontext_32, flags); BLANK(); + OFFSET(IA32_SIGFRAME_sigcontext, sigframe_ia32, sc); OFFSET(IA32_RT_SIGFRAME_sigcontext, rt_sigframe_ia32, uc.uc_mcontext); #endif -- 2.51.1