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 06CADD637B3 for ; Tue, 16 Dec 2025 21:29:20 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 54F166B0088; Tue, 16 Dec 2025 16:29:19 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 4D2056B00A5; Tue, 16 Dec 2025 16:29:19 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3D0AE6B00A6; Tue, 16 Dec 2025 16:29:19 -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 2408E6B0088 for ; Tue, 16 Dec 2025 16:29:19 -0500 (EST) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id DB65F13BB4C for ; Tue, 16 Dec 2025 21:29:18 +0000 (UTC) X-FDA: 84226625196.03.C695620 Received: from mail.zytor.com (terminus.zytor.com [198.137.202.136]) by imf05.hostedemail.com (Postfix) with ESMTP id 24696100006 for ; Tue, 16 Dec 2025 21:29:16 +0000 (UTC) Authentication-Results: imf05.hostedemail.com; dkim=pass header.d=zytor.com header.s=2025112201 header.b=aIOynUn0; dmarc=pass (policy=none) header.from=zytor.com; spf=pass (imf05.hostedemail.com: domain of hpa@zytor.com designates 198.137.202.136 as permitted sender) smtp.mailfrom=hpa@zytor.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1765920557; a=rsa-sha256; cv=none; b=4lRFLHmzfbSj9xilu9ew8qjNtEXNL4UtgnrYa5jME84czEBW6/nkhcqisS9lY5i9oJR3vH XpLYM0xtEQjUtVydqpW6NC8vL49QzNg6mBTJVd0WooHb9t64mvB3sNP6NkLWwBaw//SWgX 66cMv8hS+tcS3c8YGC1nN5mzkWWShkc= ARC-Authentication-Results: i=1; imf05.hostedemail.com; dkim=pass header.d=zytor.com header.s=2025112201 header.b=aIOynUn0; dmarc=pass (policy=none) header.from=zytor.com; spf=pass (imf05.hostedemail.com: domain of hpa@zytor.com designates 198.137.202.136 as permitted sender) smtp.mailfrom=hpa@zytor.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1765920557; 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=wIICqKngmY3M/xEXouuddTda7wdwqxugttI9lzZICi0=; b=x3ud/oSJv7BmXkYuXp7eKJ9f0Q8A0laninGcAxXgHOCbulYUJRhZ4SvvXZeBxwAh8w3wP5 DuIUHeQyUJgvdz4qOMzI+rlHew5GK4JqweIyhP+YDQVRRn7og9p8n/MlLf03g6k/lO8sdg Yng4weVpXjN6zepnMGNtTFdw68/RdPI= 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 5BGLQC252563820 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Tue, 16 Dec 2025 13:26:24 -0800 DKIM-Filter: OpenDKIM Filter v2.11.0 mail.zytor.com 5BGLQC252563820 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=zytor.com; s=2025112201; t=1765920386; bh=wIICqKngmY3M/xEXouuddTda7wdwqxugttI9lzZICi0=; h=From:To:Subject:Date:In-Reply-To:References:From; b=aIOynUn0ccNgU54mQ1f8G0xOW19byGDvnoE8VjzcdE7kl9FCQz/tBCu3cWCbfrTMe qyBQa3vrQgXoiidKLH3XX1unfbs2xtMsGB1G/T6Xk4Z9WojYukxxwjfcBvwJ5pLHQx thyoK9KB1XTBMpwdM6E8WNwr46yfEbVIL4ktPJjW8WBqUiBOqGUNwyJ0VEmiq8Nnw3 sm06wd+21ipQs/dBxtgzrHEKp6u57CuCrd2Lz3S4lH8C1mCbZalJCW8coxKQgDBj2t 7pO/4YcWtPNutRaS/V++Ly8F9b0t7BtubaP3W//Ov2e7mM35sjn70xa4FxYx1pNLWI me4yo2uF9gM7g== 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 v4 06/10] x86/entry/vdso32: remove open-coded DWARF in sigreturn.S Date: Tue, 16 Dec 2025 13:26:00 -0800 Message-ID: <20251216212606.1325678-7-hpa@zytor.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20251216212606.1325678-1-hpa@zytor.com> References: <20251216212606.1325678-1-hpa@zytor.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: 24696100006 X-Stat-Signature: 8rwrydkfgjmpkru99e33sb9mhc5cptbz X-Rspam-User: X-Rspamd-Server: rspam06 X-HE-Tag: 1765920556-948686 X-HE-Meta: U2FsdGVkX1+ySMPoy90Cs78mI+WnnPEvK3ufjOqHW1IqIVBLUON7jg5uTKz82T2SCCw8uLJcAEpD6enQFMs32zr6b8XM+g1u6NVc8359KYJ4XV+O6rGv6KGjjMqwZXsAA4e5ROACxVrAwTLSToasRdMjlvbhxqv3S4iXqJaghLNj8GLw+LSXE3B54nPSeeT4xaxh9XhzYIYrHX90KN1PmzL8xeG9gXcKX7SrMIqK62vjW4iQqjxI1F3qFofGRtwXIzI24q64HJuY3nEzn5/jTwvTrlVdd3HmND6RLjNzjLD2DOCcwBq/7jnvsBP6NdL7kWdIeWWcfUlGfdBnRja7xl3i3NJ1wwTcM7uvGt69s+CD50l0Nte/atlFzHQhZVW8XglJM+WB5TnxlBvTHU56IoI2kELldHM2eNLYJEf4ph5YYtqMdQ6+Nd3u8FunG2/vQe8onxePYf3YcMe9PyXsEqcag5bDDHyNpPu8sq5A7C7Sr+PHuBj3OnbRuxtADT4mPD1yHLqH8OpuLELhFQdvQh6fTGNsL/EhnQF5HPmca/ajcKA/vABuHDCmMib5ABCXInx3qQAOLqDtC40qVhGJDdeZhHWPDiEYIWosh/k3yAsGDeuFl2w5KmtqziegP0XjvC2HO6YUrFm/4qnGCdHoozc8pomUtKS1CyxGQY5G+BXNknRBjWO0mUl5LGF3C69c5/NNe1NsSMea0gn+P87vuWm+Fd9t6rtfpznmIrjbwfdWbYc2Dmd8jaouuqf3PLmy+a/V72W2VGeMVhHN6qbYolz8ax13UDGS9F3rRtEPVALCyZRI4W6/JhfkzYhp87OTsHUP9ipjLb7xaL/zZnCXlN603APV65HuBLmAsnE1INFJQOCC153G3I0b1cN9SR/p2gy88vZf+Huk2W+DIWLg5sHBZ9G2NxS5SK33IMVqMLPUmh4sAvqajCsp1aITA81h3ytytV3uKnDJhnW1JJD 5VIefxR9 UPD6Ns487aMPFjfRg6SI7QZ50XyWXuSrf1q5J6fB9LtS9rkr4w1A8lFEVB00F7a30jwasimbB9YsMWyTLw0pX29rdnPyYYd9tO4eJfDt0cNbWsJfqzk1QXw+4kfen57Qwa3uT+I7ChxPPPcLbF7T6VSAimctI1D3UeFWws/UzF07mNoFiYnGfp4XVKput4e0xUwfSGniJ821+U0QrkFcBA4FDp8OrczHFvp64Ud37dino5QqFWoKQdIcha5mPUkhh/FUqqIo1TJLJmEDbjIXez4t6BHSodlF1c+NHr/hAK+xvCnI= 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 25fcde525c68..081816888f7a 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.52.0