From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 15ECF1EA7CC for ; Sat, 19 Apr 2025 22:35:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102161; cv=none; b=UDGvlUrjynfBUmUbwpKB9JxXCqDc4PQqkmDFZ1YLnVpSzyIDKx7uWHRXBAA9jVmAkNwQI4ik4GV+RRTX0L5l0D7VB63iz0e3RPzLL9u4Qi0VhVmONiH5kY4OUn3H8fhtRpMsI4Bg4KvQT5jCKdHv3A+t0BscV2Gil+Z1VGSoXzU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102161; c=relaxed/simple; bh=O1OoucjBrhFHCd0WkL97vrJaw60M6S6g08VBYJMvcEg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JVyN3+WpwiWJmt1LcSLObr13N61MzgIvy/1+Lf/ouGxG6YPvB0WTtfzT6oslp9uuemx+DaPpt28gHRJ04EeRVef75kqZqSwQ7rP1XtlX5HsFfgeQ7pZj5MzSw7A0aUZuAsSToU7yRWOcBkHD21yXpKT6Z0amzzI6CojNb4lVclQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=HZv4ooEt; arc=none smtp.client-ip=209.85.167.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="HZv4ooEt" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-54ac9d57173so4205407e87.0 for ; Sat, 19 Apr 2025 15:35:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102158; x=1745706958; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=IQ5CSP2wGdcgzWF//+b4znU12TMJTdW+6/VKhNWGia4=; b=HZv4ooEtOdKEhz3QJ8wE6VfVjeWjlcfjnB/jAOVhOQe36ypiDnQFmwhhR4dpxdML54 g1Ss/GuLLHEfSnK2UWF9PQLo7t+4IkKmMjVSScHeWa9QttUry6pjVCllt/y94sw9oGh4 LcETzwrVsqH8laP8JhGw2ei/8oMSpNHAanfdawy68I92gcjmMEpdO/Hi4y05U4z7Z40k F+DnSCUzuSD0MzmPDybHgy/VzaxdH3arTipD1JowEbArv3mxAEgCU3q5q7bskdlBg+9s OHYDP8mlmhBvAFvzHSxTE4LjhhuSikZTXp0p+aHmmokzcyF3KgyviAJkiPJtONBAAMr2 mbxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102158; x=1745706958; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IQ5CSP2wGdcgzWF//+b4znU12TMJTdW+6/VKhNWGia4=; b=KNBM3iqGHwzxS//Cap7pWLKADZWQVCQzi833O8gSXyWXZCVKWw15g4q3WeAOVna/GX zf4HC9swg1SJIZpzDYDwzNmNfoTPpxI3X+7KFiWxtUUc5fCADctOD2HTSCPlNOszU8Bv ZSKV96CXxi5ISuun54Kw2c727P2oAGtof8qrnLKKrsUryhzJOkVSB9oBQQvm9COO+200 j63CgeziZIFhs4WZY41QvWNw23hcBjTHcqcyzYGEsjqNpQ+riUjEJzW0sK4WwJNWeuKH mr4Oh8dgSmZNjSRuOrTqBLaRDuvKI6eR/r7/5R5s+8zTMVH3uv3DzBKLfbk7+CD21Em8 YIng== X-Forwarded-Encrypted: i=1; AJvYcCVMYGPJBrMpAYT3rzhVWluCIV0oNurv7G2GcJgA0a8VsoV9UJJ6qyGHiNy5SMIK38ZKWSmAeNbeH+ybpTE=@vger.kernel.org X-Gm-Message-State: AOJu0Yzz69usMtCle3vh45RD+XgP+Nj+PRzw4NJPffolFyCLq0hGE3MM 3aQhZWKPbVNfxvvLjyLo723OfFOkVq4t/tHi41iuq3fFCUaiYH6P13EZIqqg+KY= X-Gm-Gg: ASbGncupx8N8FeXkXjwYuIGsunNxClPWlDW8LfU1Tma1wSJ9IVfcTCNe6P9AejgG7G2 mggAyJX48XuaplAAZMES5e7140UIzpIBShxom/2nhMEDm6WKcQJEoVNC93f/AzBNbgr2HvXe/pf EeubC2AipgxLkOOWauNdBrreknvwx7hP7dv0Z6YtMTXvvXUvHB98KyGMQx0/FfCAbPmE5iA3pf1 646LJ+ZPk/p5FhG1wgfrGaWQt2bUJdja3esiMBNyzzMyAINBVpzjp1Oeij6e/nanFZN019+VsLk Zru+8Z4etkMS8SkCN61LtWXrMkcWcnPc+oYa9Kl9C7YjmnXQHBE= X-Google-Smtp-Source: AGHT+IGLMvDVq11ln0AcImjW5loG4OTpHEIEWmQKeTgHMYpB1Kkl5IPq2/e++cLfj64OrAhwHsThtw== X-Received: by 2002:a05:6512:3d29:b0:54d:6c14:3caf with SMTP id 2adb3069b0e04-54d6e780055mr1794485e87.11.1745102158136; Sat, 19 Apr 2025 15:35:58 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.35.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:35:57 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:48 +0200 Subject: [PATCH v6 01/31] ARM: Prepare includes for generic entry Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-1-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The generic entry code needs a static inline function for regs_irq_disabled() so add this, in further requires the signature of on_thread_stack() to be __always_inline so add this as well. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/ptrace.h | 5 +++++ arch/arm/include/asm/stacktrace.h | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h index 6eb311fb2da06fa393f8be7caec8d997637a88b2..a01c66f0ad907882af2a383e53d= e8aca68c551e5 100644 --- a/arch/arm/include/asm/ptrace.h +++ b/arch/arm/include/asm/ptrace.h @@ -52,6 +52,11 @@ struct svc_pt_regs { #define fast_interrupts_enabled(regs) \ (!((regs)->ARM_cpsr & PSR_F_BIT)) =20 +static inline int regs_irqs_disabled(struct pt_regs *regs) +{ + return !interrupts_enabled(regs); +} + /* Are the current registers suitable for user mode? * (used to maintain security in signal handlers) */ diff --git a/arch/arm/include/asm/stacktrace.h b/arch/arm/include/asm/stack= trace.h index f80a85b091d6c4ff365e15ae7100af1c3aed597f..815b5f256af164daa053f3bfd6c= b2f54042a8d2b 100644 --- a/arch/arm/include/asm/stacktrace.h +++ b/arch/arm/include/asm/stacktrace.h @@ -26,7 +26,7 @@ struct stackframe { #endif }; =20 -static inline bool on_thread_stack(void) +static __always_inline bool on_thread_stack(void) { unsigned long delta =3D current_stack_pointer ^ (unsigned long)current->s= tack; =20 --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 103701EB19B for ; Sat, 19 Apr 2025 22:36:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102162; cv=none; b=bkH3zCVvTVbS+MR+jItflJmsYUbAOtIkYbgaO17rQiEl0/gVMx1wXoK2HpYWgFkkak5fn45wA1f7K/DhB/ksSfPX7NU7uF/yLJYPa89EwMGHRrTj+Qq+GFh5avWwY8dszGMjyavOp5GteP3BXAbLUNmr7quKO7hwjh45JXOH7mQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102162; c=relaxed/simple; bh=C4h+gx0/1cRWyZmov3YVUGgb/6MevMRGPWN5ZX+l1qo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eKoK2+cGyK755sz94+cGA/7J5vA6X/g/vJzZ7ZAKjCWiqXio+ryCyjPL4THPrzbqfsOfW+qn+xF2jIkMLmliKsYnXtUMZkbn2DyAcn/MWEvJDMjXl079/gaQuqZzw9Xo0OFFoLnVtFXAwDXT++1uY43Sn1tYoWDXMt+3rvNpDPU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=feUIs0vg; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="feUIs0vg" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-549963b5551so3109501e87.2 for ; Sat, 19 Apr 2025 15:36:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102159; x=1745706959; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Xa+6PSlNL4t/65YhlpxeyjZxsZsxKfkQGqf+kwb8SlM=; b=feUIs0vgbOjhIiQ5gDS2nCp+pwvsCgop8PEAh1gxqoOEsK2hikV21iOEJIF5zgvG+O llS15DlissJdS2fXWmyCylw10ZMPVRSiMAirYSe5vYl69fpgC5yyoMrjTdgqzJQwDkLu misATRZXl4lUvD3eUbz0skXbVCqLyc0RvCHHEgnybrZUKHK18SJHR1sO4r2/n1DUK+Pl TkP2bnRg2hKuSC/8szCvT4pO8F/cpdDpsoaEny4jf5fsyUFfSfSiMG8bkLOO7JzOgYDR Tz+DBgQTj7h0LNbibjOi9XOx+dpb6M8Dx6sabX7bW57EqJBhsqAJGOS4/yLpED5/Pjr1 hMyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102159; x=1745706959; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Xa+6PSlNL4t/65YhlpxeyjZxsZsxKfkQGqf+kwb8SlM=; b=qNCxw+KUV+UQfmXNRCg06BbnfWAiF7UmDe+GM/RIVXZbgSAAeUTlXMen3baFXcYKX9 JEXyRjrspJ+UsU8qwB1PoodVUZJGQWttEZxN8EMvVVN7kORGjKugg98CteFD/iw9A06D 6mQwS+SZQYc7lE/40KdwSr1Upx4TSEPIqktKLJOhWW4Xy4y5RmypCzbg/0KiFFIKTwc+ Daq4gZoZvobCMxzJ/fLIePBlJnO8sivmK17KDHb34gIZVrJ+wLCchEctYB4742Xkj96z EeynzW4y6hzvhEPdwI31LKcY0hxvSpGSqN1Mc9fH1j9toubKlBWD2BO5X38oHeeqdxjF Hkog== X-Forwarded-Encrypted: i=1; AJvYcCVjkvwc3a1OR6WSmUUED4T61gqJjNnA6DWIVIsmiPAsRRn6Ioj8NzgKzOI/6RRGCWqVZW5329BKemcCMGs=@vger.kernel.org X-Gm-Message-State: AOJu0YyFA2YhcRrtYeMY3BougqJSkG34a9ZHQhTMWDnaZIYVwaLDWmn6 xPvEE+rTxJBcLkCfrPbSKeTlH4q+sjDrm/proXD9dIiUcUCsXTVJpcDt4mOwhiE= X-Gm-Gg: ASbGnctroLiJwzW119mAQXxtqXzNmLxtR5No5ftcQEJmk5L/1JAuKTrkkrRYzdqLgGT izzA82ggFSevfuPFGa45mqX+XEa37cRPU0iHrYbYql5mdL2VEoalmL5K8bBulYVwVjEUDWWVSIE IxK23BWMe0P0TbHM/X8WdZBA8s9lmkv/Wp8CtHWDN2N1dYx5kdpx86uEEE66qXJIY2oohPfysr4 W9hcJakFiMSzxo6ORlHuBUTQ8OIs8wJk0FgRFhLSVJTMYzQ509DCf7/0cRrktMO2ig5ujPv3zW4 Q1fRp4F49//aSQwmEMvt5Aa4QkzmfDvyv/el9ZLqU0G+duUkFW0= X-Google-Smtp-Source: AGHT+IFxQdlR3XbwN3+K/S07VkZdxfUuHrjaKg+XbMlUjDGQX29Og6QcKArMltGpAQ4oZl3D4gBdWQ== X-Received: by 2002:a05:6512:b06:b0:549:5769:6ae3 with SMTP id 2adb3069b0e04-54d6e61c9c7mr2111296e87.6.1745102159063; Sat, 19 Apr 2025 15:35:59 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.35.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:35:58 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:49 +0200 Subject: [PATCH v6 02/31] ARM: ptrace: Split report_syscall() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-2-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The generic entry code requires that report_syscall() be provided in two parts: report_syscall_enter() and report_syscall_exit() so split the combined function in two. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/ptrace.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index c421a899fc84c476a672cbfe1c8ece8355d8512d..07b0daf47441f1f76a8af416acc= 74fa5ed770403 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -827,31 +827,45 @@ enum ptrace_syscall_dir { PTRACE_SYSCALL_EXIT, }; =20 -static void report_syscall(struct pt_regs *regs, enum ptrace_syscall_dir d= ir) +static void report_syscall_enter(struct pt_regs *regs) { unsigned long ip; =20 /* * IP is used to denote syscall entry/exit: - * IP =3D 0 -> entry, =3D1 -> exit + * IP =3D 0 -> entry */ ip =3D regs->ARM_ip; - regs->ARM_ip =3D dir; + regs->ARM_ip =3D PTRACE_SYSCALL_ENTER; =20 - if (dir =3D=3D PTRACE_SYSCALL_EXIT) - ptrace_report_syscall_exit(regs, 0); - else if (ptrace_report_syscall_entry(regs)) + if (ptrace_report_syscall_entry(regs)) current_thread_info()->abi_syscall =3D -1; =20 regs->ARM_ip =3D ip; } =20 +static void report_syscall_exit(struct pt_regs *regs) +{ + unsigned long ip; + + /* + * IP is used to denote syscall entry/exit: + * IP =3D 1 -> exit + */ + ip =3D regs->ARM_ip; + regs->ARM_ip =3D PTRACE_SYSCALL_EXIT; + + ptrace_report_syscall_exit(regs, 0); + + regs->ARM_ip =3D ip; +} + asmlinkage int syscall_trace_enter(struct pt_regs *regs) { int scno; =20 if (test_thread_flag(TIF_SYSCALL_TRACE)) - report_syscall(regs, PTRACE_SYSCALL_ENTER); + report_syscall_enter(regs); =20 /* Do seccomp after ptrace; syscall may have changed. */ #ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER @@ -892,5 +906,5 @@ asmlinkage void syscall_trace_exit(struct pt_regs *regs) trace_sys_exit(regs, regs_return_value(regs)); =20 if (test_thread_flag(TIF_SYSCALL_TRACE)) - report_syscall(regs, PTRACE_SYSCALL_EXIT); + report_syscall_exit(regs); } --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 985E61EB5E1 for ; Sat, 19 Apr 2025 22:36:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102164; cv=none; b=n7GsKhcYlHduI4MUcpy0/Ge5IOkb2gJ2DIoxZwQ53fVVixSYBCxJwAkFy6rlG0WTDszM++7ZYrt6enDLZolihNfuzQnbRJI6YThd6gPJ/YDs87DpMa64KN4j5XbHr45EQJXI6yUyU+VBybXUMBjRxycDiIXlV8XV5qCB814T0GU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102164; c=relaxed/simple; bh=LYUB6ojvp/Jp16vOwOoV897BobFnAnUUIGrNHHNIUfI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rYI9uGPovbSlrzwalk3sc2zcSadcCpyvr70ESOt5Rj0SRGjE4VfDMUrevjpiO135gdWyyoZ/c4H1ikcH24ln7HsHVr+SyGW+VyLwyxn/bFbWDtl85G8BJTwfNfd6L+5m7MqHPPZADnwZ3i8sIq2PoO9W3Rk3O+e8vn+RZnbTpsk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=qlntZJ/d; arc=none smtp.client-ip=209.85.167.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="qlntZJ/d" Received: by mail-lf1-f45.google.com with SMTP id 2adb3069b0e04-54d65eb26b2so2640458e87.2 for ; Sat, 19 Apr 2025 15:36:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102160; x=1745706960; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=TzY2xOh4ktNlX/Hf1UnvL25R4SqMvTbsJsIcKtlm9vA=; b=qlntZJ/dzgo3hGkFumikqkw9ObiWXMNRpEIFK9TcvUHEbE+zfniQOU6V6KvaG/vxmj 7eFPfhGkc5v9tCKM80HzGbh407xIO60RGxwBdk5MWw54lAowo2FKCkgME707kp7ImgIL MPGbQl0Y/RmvhcyCpKs2+B98vzAnRyiH0i6T+LEY/jC+sHO0M0gR3Mfsf1rTKxkcqlDo 32bKnkA6u77C+lQJa15A5C+0DQPxWXawSJ6pgp4OjIcByktW6thNPcE1xLcBU3PJIKki kFQjDSBih0EYpW6iQ04HS9F23q0Trau17FwN+kurXDmoKEvjAmkU74XqH1Gmu3camh/q E60g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102160; x=1745706960; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TzY2xOh4ktNlX/Hf1UnvL25R4SqMvTbsJsIcKtlm9vA=; b=vuOCC1UW9q+4ABWHwmllrtapoNdDwm7z49o+MR79K2AOyinZJe0x+NWo5PW2xde3bM 1grMZ8sAXqebpXsgsTZzED036sPMAUEfpqVuYSxC8rNULDUM9HevzHsFU1FNTbRdj3Y7 rKCu4f7/HWF4+kfExxxcH7T6Ej9SJT/JODwc0M2r0e3cy3yvvRVLmhKW04i9YYtnbIxd 3Ex4v1o0tU/DXF/Dyt/4dVQ9w2hL2t4Vd770UtulIb1lb23E9RJgizbambD64tfrmkUz nZ8N+1X+B1R94LjArp11v8oUvIUoqwzoxi9aES2/oZuJJDmlfdIH+K0Ny3wXRK2squTw +MQQ== X-Forwarded-Encrypted: i=1; AJvYcCWVdWC62AhvzYtmsGRSYwZ3bYEF5DM5u2sD/noMtFCj2diyqal2r4Z1eXmXa3QfaZeis+jyFmPK5znsBRo=@vger.kernel.org X-Gm-Message-State: AOJu0Yz2B4M4uae1j7lP71gMIJ7Wcz/fHcCAwMyo9WV6pj7U1vdrVo6t 8WYJ8JImjQ6lxy/+S2bhJK5qSKUYpOdJlAk9LiVxuyfd1+QagNON9xNnzmBEYWtdwTt9T1K7An/ LYmo= X-Gm-Gg: ASbGncsOxo54cHMvr9UJX6BNgXWxgbJuZF9bdJ5lFf2CSte42kimu+jRMWb4GrelS/c +t+fXcloNaKDBPflZkpcryMO/bm3isWaF7ft7YlMiADrSEkdZC+rwgrDSq0xlC1gv2aNDrZh8Wh IcLvnwWgin+WpjsIlwtXWPfv85bBTUMd3pKFqgdwwf3tuJZWTisjc78AF3pQKEp0YZsEDpShsQx i1/x6NcbE0rwx8mEym4wWb0uB3SOsqhvjIVfUNnSD0YShq11rG6Wx1hec8uqUlzkE4mbIoDxErU KvNlzUvFtgzYdJ9lGKT51EZ5ikimsK/WnONaPoRI7PkKpjsNRlM= X-Google-Smtp-Source: AGHT+IFH9xGcTNIlSs+IadMVQj6+iIYdg0THeCQHNZBemp4bp++lCg0nA15nRYVihEO1x52fF5YrhA== X-Received: by 2002:a05:6512:318b:b0:54a:f757:f8ac with SMTP id 2adb3069b0e04-54d6e61c168mr1950777e87.8.1745102160571; Sat, 19 Apr 2025 15:36:00 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.35.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:35:59 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:50 +0200 Subject: [PATCH v6 03/31] ARM: entry: Skip ret_slow_syscall label Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-3-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 Don't introduce this extra label anymore now that we have a clearly defined entry point for ret_to_user. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-common.S | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index f379c852dcb72fa5e960bba5621cc2152f0df0d3..2f93c2f6d5b8fdf6aaf3dda0192= bde144fcf238d 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -102,7 +102,6 @@ ENDPROC(ret_fast_syscall) * do_work_pending() will update this state if necessary. */ ENTRY(ret_to_user) -ret_slow_syscall: #if IS_ENABLED(CONFIG_DEBUG_RSEQ) /* do_rseq_syscall needs interrupts enabled. */ enable_irq_notrace @ enable interrupts @@ -136,7 +135,7 @@ ENTRY(ret_from_fork) badrne lr, 1f retne r5 1: get_thread_info tsk - b ret_slow_syscall + b ret_to_user ENDPROC(ret_from_fork) =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D @@ -310,13 +309,13 @@ __sys_trace_return_nosave: enable_irq_notrace mov r0, sp bl syscall_trace_exit - b ret_slow_syscall + b ret_to_user =20 __sys_trace_return: str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 mov r0, sp bl syscall_trace_exit - b ret_slow_syscall + b ret_to_user =20 .macro syscall_table_start, sym .equ __sys_nr, 0 --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8B3161EB9ED for ; Sat, 19 Apr 2025 22:36:03 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102165; cv=none; b=PXu5bsRqu/CBxX+cXmx2tLpMr3bHKYCeEnYOIHozO4KIJqOTk+/5Myaub2mIfziDTd3mHByiW5YHut7A5CpLOTa+j1P1GpE80xsRPCO4miHgAUc52xNiATMA9llBtTupUiz2u1+eKf9xPivCqxwARAgvG4Lh/BeVvChkqOgyqAw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102165; c=relaxed/simple; bh=x51ftGxFUB9O1hqt7z81KzMyFEFQ3AVXRy2zKxRqQ0c=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=KRqz8TDYX65EM5obGHVCwKIwFXLNNOkTEoEa9JI/QCPZYG1K2VNrm5JwzH8kTflkdgfPo0lFwK0v/xkbW1fJLooqhEL3HyyJCrqiMroqBMAPun514oMUtszMFY8B06JEvCaSCoAyZiHVLcop/DQ+V8g9hCiXsEQabVzOOxhWFgo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=w8ZgwVc6; arc=none smtp.client-ip=209.85.167.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="w8ZgwVc6" Received: by mail-lf1-f50.google.com with SMTP id 2adb3069b0e04-54d65eb26b2so2640466e87.2 for ; Sat, 19 Apr 2025 15:36:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102162; x=1745706962; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=TGj2mqpewSEqRb9t6DrzjDdnFip55vEOgyWPwRrWkco=; b=w8ZgwVc68SkIG+MVpRpd1e+aMB2a7pvY+PVaSrSZJXNOjTWhvhzDmCP2ZDauikF47f 79ejk83UWqMoTyR18PebjeemizUiN+X5IaZ277L1nCR2tYJcx174AXcTzpQFioaTpoPc Xm7vjt3DOGqlWAh2QDcn3HxQ6WGVz9mNLIsy4yVgw9fb1g3l4FC32lcTYEJ38ZiwNMJ0 hVnQwCIJFrPcNLe7B0F7LGJcgKnT3aUGQ0ENgqwIXRfNNSIXz9SIqi1GK6zYICzeeKRm 1/uq5nLtRhwUgUd+yvoaiFqznUJcD9S0Mt+P9VI9P7fV2LXjyOwmMMTHXT5VdcRnjMYg TdMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102162; x=1745706962; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TGj2mqpewSEqRb9t6DrzjDdnFip55vEOgyWPwRrWkco=; b=OiBFirg8dTunDCbcpa49znegohOnmekxFaKbwllXtdEXAeZbOJa48nUzw2fRHh8VVy l15u2At4f1FC495shQ+91nYZkyu6Qlx30Jt9aLJd/4cGLlLkcDvC6kT37IcOeIbNl7ey 2vYQzidvGl7iUgAOmOAHZ5tHlEGSXBRvvv0Vd+m+CLkA6ihGG/IQYwZWeRZtIqgCDtet sJWVl97s2Fv5APBz+dbzEzS/3Uza6iESJNeX9WBrUO1bUGxi9mJlbanzkJcMXtwaMnfN jkizHwg82BZcEfk1KcaU1COF4j1VI3WdLXLi/avjZBprS7kgpfWwJeCdHYanikR6jtBo Q2pg== X-Forwarded-Encrypted: i=1; AJvYcCXPmXtUa07hntB4WtJE1Af/BWYnGcKVAX4xTHPcooziXtIaVlT7dxvGKHOsvoeALcqFcctYrGp3HBN5FWM=@vger.kernel.org X-Gm-Message-State: AOJu0YwEXYFYbuWDdFkH9P0S8h4SZ/XeGEa9K99Y0duUyq/OxwK+gtIL erHUK9eh1codXg6InmpaVlYU3Qoj+yu/QYMYVd7nIVixkMSErT9QjyJBe+fm+eg= X-Gm-Gg: ASbGncsJGJrMMfeewRyR/d8L3iudaybqxRy0YKcAdf9UZDDqeztXiLWwmlY1/ZHfHPW TxtQ268W7nVeBBeTLcwVu1VN7pr2wwNt9bJHdq3btj2r5bpGh4wEHGBTuAOz1ZkiIOZ2QWI7c8x 4UifOFrY+JMpuZv2LV1lZN4VckH9svOxbZcVzAr1u8iCbt8O2p/1apVXk3z9L/8qLu7vDmAkuta qY4ha/beFNSdHZ0hqviARCEfGmiX57KgOeTxhldhOEHcCsy9PJ32+tQGtW5UsV444UO0vHNTr6L w9s3IKyIt/Ej7SQRuR8y9K9DWuBOWYwqZ7F7UQdUO+bVReUzmMw= X-Google-Smtp-Source: AGHT+IEgRdGrAKuD8P++6CqHoCvgvQ5QEk0YY5omU/4y6fTVMIpqUi+sqyaRus7zaV38Lo9BtOSCaA== X-Received: by 2002:a05:6512:3e16:b0:549:8f15:db36 with SMTP id 2adb3069b0e04-54d6e675800mr2197914e87.51.1745102161596; Sat, 19 Apr 2025 15:36:01 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:01 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:51 +0200 Subject: [PATCH v6 04/31] ARM: process: Rewrite ret_from_fork i C Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-4-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 Move the direct assembly call to schedule_tail() and the call starting a kernel thread into a C version of ret_from_fork() in process.c and rename the old ret_from_fork to ret_from_fork_asm following the pattern in x86. Leave a comment on what we will do when we get to switching to generic entry with this as a base. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/switch_to.h | 4 ++++ arch/arm/kernel/entry-common.S | 22 +++++++++++++++------- arch/arm/kernel/process.c | 24 ++++++++++++++++++++++-- 3 files changed, 41 insertions(+), 9 deletions(-) diff --git a/arch/arm/include/asm/switch_to.h b/arch/arm/include/asm/switch= _to.h index 9372348516ce9b80fa713966943d0bc622e86066..18d084aff5a4faa7cc5e40d48fb= c4aa97a89b0c6 100644 --- a/arch/arm/include/asm/switch_to.h +++ b/arch/arm/include/asm/switch_to.h @@ -17,6 +17,10 @@ #define __complete_pending_tlbi() #endif =20 +asmlinkage void ret_from_fork_asm(void); +__visible void ret_from_fork(struct task_struct *prev, struct pt_regs *reg= s, + int (*fn)(void *), void *fn_arg); + /* * switch_to(prev, next) should switch from task `prev' to `next' * `prev' will never be the same as `next'. schedule() itself diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 2f93c2f6d5b8fdf6aaf3dda0192bde144fcf238d..df6961a1006b7a0f3522728812b= f52ccb849e511 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -5,6 +5,7 @@ * Copyright (C) 2000 Russell King */ =20 +#include #include #include #include @@ -128,15 +129,22 @@ ENDPROC(ret_to_user) /* * This is how we return from a fork. */ -ENTRY(ret_from_fork) - bl schedule_tail - cmp r5, #0 - movne r0, r4 - badrne lr, 1f - retne r5 +SYM_TYPED_FUNC_START(ret_from_fork_asm) + /* + * ret_from_fork() expects: + * r0: prev + * r1: regs + * r2: fn() for kernel process or NULL + * r3: fn_arg for kernel process or N/A + */ + mov r1, sp + mov r2, r5 + mov r3, r4 + bl ret_from_fork + mov r0, #0 1: get_thread_info tsk b ret_to_user -ENDPROC(ret_from_fork) +SYM_FUNC_END(ret_from_fork_asm) =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D * SWI handler diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index e16ed102960cb01d625e2ccc484f238b824b03b3..81c1c3f988344185917cf4e53d0= d8ee47ae912f4 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -230,7 +231,26 @@ void flush_thread(void) thread_notify(THREAD_NOTIFY_FLUSH, thread); } =20 -asmlinkage void ret_from_fork(void) __asm__("ret_from_fork"); +/* The assembly stub sets up the parameters and calls ret_from_fork() */ +asmlinkage void ret_from_fork_asm(void) __asm__("ret_from_fork_asm"); + +__visible void ret_from_fork(struct task_struct *prev, struct pt_regs *reg= s, + int (*fn)(void *), void *fn_arg) +{ + schedule_tail(prev); + + /* Is this a kernel thread? */ + if (unlikely(fn)) { + fn(fn_arg); + /* + * A kernel thread is allowed to return here after successfully + * calling kernel_execve(). Exit to userspace to complete the + * execve() syscall. + */ + } + + /* syscall_exit_to_user_mode(regs); here once we switch to generic entry = */ +} =20 int copy_thread(struct task_struct *p, const struct kernel_clone_args *arg= s) { @@ -263,7 +283,7 @@ int copy_thread(struct task_struct *p, const struct ker= nel_clone_args *args) thread->cpu_context.r5 =3D (unsigned long)args->fn; childregs->ARM_cpsr =3D SVC_MODE; } - thread->cpu_context.pc =3D (unsigned long)ret_from_fork; + thread->cpu_context.pc =3D (unsigned long)ret_from_fork_asm; thread->cpu_context.sp =3D (unsigned long)childregs; =20 clear_ptrace_hw_breakpoint(p); --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f47.google.com (mail-lf1-f47.google.com [209.85.167.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 24B7B1EDA2A for ; Sat, 19 Apr 2025 22:36:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102167; cv=none; b=mMr8CbvdEnMtb0vyrwURmBakNcFlLa8WocZe8+rGLLLoWHhmgCvKRTYa5gBuSxF6+UwzDcI/WCgiRs/PepAkKyVH2PqG7DfhqYyM+ihW5H4WEK21c20D3O1bOYzDi795LqYWQ1MadeIbnNjdW76+ZWYLj63sHZB8/G2yRMKF8C0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102167; c=relaxed/simple; bh=vxXREzGudOwqK27uoMMKU7o1vWyo48YpN/GHhfP2amM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=L7voastF0K/dVfLlPpGrxqXlhpwkt1gZF9Bn4pGbAfpZL+Yx+/xpOgQN/sSI08gyLCNOzCKR6HJ9cGKuf3pYqHt+7RJ3x/KEnqHCRUb+ztNiljeSWSgVsa1KGokV3ivRjAwH37NV/on3Y4S7Ys5Y4Vj7QrTwZM3Chlah4VYJUo8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=Off9w2yR; arc=none smtp.client-ip=209.85.167.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="Off9w2yR" Received: by mail-lf1-f47.google.com with SMTP id 2adb3069b0e04-548409cd2a8so3915411e87.3 for ; Sat, 19 Apr 2025 15:36:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102163; x=1745706963; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=uRhCeJvUzi6fE4P1HsVoSPsfz0kLlIAvb//vG5rLP0o=; b=Off9w2yRwcXZt4Mrh8gU6U8D2gbwhrq7L30C4WfEY8vG01KF/GxVp/zWpSyjYoHBYe T+Y5ShskyVE37tVJH3jmenWg7XpdHwIP8IcC5Smo0Eb79CcYpHAgjKtSobkNkl0JEwj4 hVRXaFkjoqqlNyhs+E12BtzXGT2mXOY17AITT2/cJrEF19vEmQFH38EZ7Jz/ZW/LGK6Y 7ACSMCyWa4ST7I4WDKThhqT8ZtNP1I5b54Rdf6krVmbqNMdaqGcaikGZvUBUlRKsaoIB xtGW/yh+nQ3SFQcD59Sog9XMc8nK3TupeQQ5+PkKWA7eVwwujiiWKZdadHauC2nqSPWR m/Vw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102163; x=1745706963; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uRhCeJvUzi6fE4P1HsVoSPsfz0kLlIAvb//vG5rLP0o=; b=NLPa/BMGLuw6JQF7aNACU604OXbweW59V7AQ3QDfQFIc4yOjwQCRz49QvktH1PF3zZ gDQXJJ6rY2nBqnxYz07txgKOyxvouRwHUjctYgVIus1KECCDfWTXnUfx7S/5/f2L6Kxs Ai2IXcrzuV8tKDT/eXXTHj/D+3TGmbnQeYJeYKBtYbf9GK9RGTSGZvjneWfc/37pHnoH opBEz7aFY9J9D0o+UsncXtocRhir+7LcPukXttZpUfzWhDPGBJ5E2aXPfLk+FSP3+brj gmSohov0ve3MPMjboYBgvC6zeIwD6UHNeiZxsypdKg8n8GZGRAXVXdqIv0ZQUvEC4RXE yd3A== X-Forwarded-Encrypted: i=1; AJvYcCWlGG9F9Yw15/+FdhuenWB/vHi0Vd2b+hED0sIJeO0vFr+KtQoyEC9UsJzpzmoiJzuiJ8q20RPmS6kfyK4=@vger.kernel.org X-Gm-Message-State: AOJu0YwANDuXKpzUHkOQpjdrcd6dmtnygVFQd/FO+GNMbQYvIOwoSCRI yZPAfixfhFE5eaw9uoaZ/JaDtszot7Ps/KIKQoiFMGQUX+e+vyAHqaimLnVH77c= X-Gm-Gg: ASbGncvq9wck5/kB0OqIWCEkgO0s+MeXRlQXfEO63fTXeDBcBDi/cz21OWFfUbGYPbs KJPAABszDglRsEt+y4RDHJO5EaUjslInbknZzDGJQnemc6CcHqy/vvyGeceHqfe3b6xLGUm4yBb wr1VE7Vh7KSLhafuqlWbSELh9D3VeoYY6rybGRR+gSe3S9gOkhm7SF3bjWaozlDMTPZJ2alSZdn xNrJIscicQGqpwzP2JFUe+Rdii4zd1jCXzud4SWZoXcf6I31RzxmXpxV8DD5+oUGB32g3FJUhxn cACerZZ/uplxFaq4vGP/02FUVINDiZHoddgTgdVpnoeNhY23+Sj9rh3oVuyJ0Q== X-Google-Smtp-Source: AGHT+IEeGCMHqxwit+Owc8qaBud2K8eXJfTXFHX95D/1MI3+kTRdPxunWD+MPU/Bh4fCWiX1DSmdpA== X-Received: by 2002:a05:6512:10d4:b0:545:ea9:1a1f with SMTP id 2adb3069b0e04-54d6e6301e0mr1711739e87.25.1745102163166; Sat, 19 Apr 2025 15:36:03 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:02 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:52 +0200 Subject: [PATCH v6 05/31] ARM: process: Remove local restart Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-5-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The ARM kernel contains a quirk to handle syscall restarts inside the kernel without exiting to userspace. The generic entry cannot handle this. Rename do_signal() to arch_do_signal_or_restart() to fit with the upcoming generic entry conversion. This is essentially a revert of commit 81783786d5cf "ARM: 7473/1: deal with handlerless restarts without leaving the kernel" from 2012. After the conversion to generic entry later in this series, the local restart will be reimplemented again, but in C. Link: http://lists.infradead.org/pipermail/linux-arm-kernel/2012-June/10473= 3.html Link: https://lore.kernel.org/all/1340377626-17075-1-git-send-email-will.de= acon@arm.com/ Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/signal.h | 3 +-- arch/arm/kernel/entry-common.S | 9 +-------- arch/arm/kernel/signal.c | 28 +++++++++------------------- 3 files changed, 11 insertions(+), 29 deletions(-) diff --git a/arch/arm/include/asm/signal.h b/arch/arm/include/asm/signal.h index 8b84092d151800cb4076672d1c31f0a83777d0d8..7acccc96840c8a17744cc3f2894= f19d142aba4fd 100644 --- a/arch/arm/include/asm/signal.h +++ b/arch/arm/include/asm/signal.h @@ -24,7 +24,6 @@ typedef struct { #include =20 void do_rseq_syscall(struct pt_regs *regs); -int do_work_pending(struct pt_regs *regs, unsigned int thread_flags, - int syscall); +void do_work_pending(struct pt_regs *regs, unsigned int thread_flags); =20 #endif diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index df6961a1006b7a0f3522728812bf52ccb849e511..da5c2d4b62e56cce644b15e329a= b4149d69c5b79 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -86,14 +86,8 @@ ENDPROC(ret_fast_syscall) bne __sys_trace_return_nosave slow_work_pending: mov r0, sp @ 'regs' - mov r2, why @ 'syscall' bl do_work_pending - cmp r0, #0 - beq no_work_pending - movlt scno, #(__NR_restart_syscall - __NR_SYSCALL_BASE) - str scno, [tsk, #TI_ABI_SYSCALL] @ make sure tracers see update - ldmia sp, {r0 - r6} @ have to reload r0 - r6 - b local_restart @ ... and off we go + b no_work_pending ENDPROC(ret_fast_syscall) =20 /* @@ -266,7 +260,6 @@ ENTRY(vector_swi) */ TRACE( ldmia sp, {r0 - r3} ) =20 -local_restart: ldr r10, [tsk, #TI_FLAGS] @ check for syscall tracing stmdb sp!, {r4, r5} @ push fifth and sixth args =20 diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 79a6730fa0eb7d6581343bdbbeb6834dcaabb9f8..7b1a16e86b236575efdc29cda9b= 751e8e2a3f64e 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -18,6 +18,7 @@ #include #include #include +#include #include =20 #include "signal.h" @@ -534,9 +535,10 @@ static void handle_signal(struct ksignal *ksig, struct= pt_regs *regs) * the kernel can handle, and then we build all the user-level signal hand= ling * stack-frames in one go after that. */ -static int do_signal(struct pt_regs *regs, int syscall) +static void arch_do_signal_or_restart(struct pt_regs *regs) { unsigned int retval =3D 0, continue_addr =3D 0, restart_addr =3D 0; + bool syscall =3D (syscall_get_nr(current, regs) !=3D -1); struct ksignal ksig; int restart =3D 0; =20 @@ -590,16 +592,14 @@ static int do_signal(struct pt_regs *regs, int syscal= l) } else { /* no handler */ restore_saved_sigmask(); - if (unlikely(restart) && regs->ARM_pc =3D=3D restart_addr) { + if (unlikely(restart) && regs->ARM_pc =3D=3D restart_addr) regs->ARM_pc =3D continue_addr; - return restart; - } } - return 0; + return; } =20 -asmlinkage int -do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int sysca= ll) +asmlinkage void +do_work_pending(struct pt_regs *regs, unsigned int thread_flags) { /* * The assembly code enters us with IRQs off, but it hasn't @@ -612,19 +612,10 @@ do_work_pending(struct pt_regs *regs, unsigned int th= read_flags, int syscall) schedule(); } else { if (unlikely(!user_mode(regs))) - return 0; + return; local_irq_enable(); if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) { - int restart =3D do_signal(regs, syscall); - if (unlikely(restart)) { - /* - * Restart without handlers. - * Deal with it without leaving - * the kernel space. - */ - return restart; - } - syscall =3D 0; + arch_do_signal_or_restart(regs); } else if (thread_flags & _TIF_UPROBE) { uprobe_notify_resume(regs); } else { @@ -634,7 +625,6 @@ do_work_pending(struct pt_regs *regs, unsigned int thre= ad_flags, int syscall) local_irq_disable(); thread_flags =3D read_thread_flags(); } while (thread_flags & _TIF_WORK_MASK); - return 0; } =20 struct page *get_signal_page(void) --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f54.google.com (mail-lf1-f54.google.com [209.85.167.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 174291EE7B6 for ; Sat, 19 Apr 2025 22:36:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102168; cv=none; b=MCJnUgcvtwI+OeXC7W1j7aGzXQnc29Q0WVZDeVcplUu4/hUCYlHV9UKXyuioGvQJF6b4pHkFEAkeP8SXdAzDwoK6oLlSm45GOx5cPEbNT5IJmysfAvEPBknYz/0JYPEogQYQvLd7Fr0uplEJQVaORPC3U4XxbKLPlK2NbPRvTHA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102168; c=relaxed/simple; bh=vHJ6hKyjPK9/VnvJJFsVbStSsVdAnTrU8oOpLaxYpko=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rREmqknj1tfZwJQ9xP0/+v/WffUVLj1ye2EzaJ9HAP7A4QtH3G2O40PZ77nkaWoEbpgoA1Aeu4SPkgeGj6Xnsf59nGdwtFEsneoX6wNXSUb+KHFWzCUMJyN2LcquVp0fz579ushjIxxtLQX3QCmHXza7YHlSKhfsQmc7Hw56BnY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=LjB+/rTo; arc=none smtp.client-ip=209.85.167.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="LjB+/rTo" Received: by mail-lf1-f54.google.com with SMTP id 2adb3069b0e04-54d3ee30af1so3101545e87.0 for ; Sat, 19 Apr 2025 15:36:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102164; x=1745706964; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=7/zBRaBIfgD03SLfWB2fpie1ECbuX1JEqLTmdVNljN0=; b=LjB+/rTolPS02YuZMxlCKG3edPcSjy6PdjWRkfpTEs0dEiPrcd6jdDDffbb5Ma8Ejd vFQXA+TJbgUjYPXgbR796AQ6vbeqTcU8PQwry9BLfRIoQ2VLAlh7X1GXTdB67eQLUu0E k7bj5QCI9AqXzrZiyxoRsyw4BtJHFrvFv5eXG88a38vmXeHzH4cr9n1i+4FedQFcqqP3 F//IMjj9zilgdYTBQJ+IVPLducR3+iB9AFdjzPB0B65jse+VnpDSHPjfUpglicd/LA18 tWDOsmKb8MWa77aFpkFsPWY65Fm9FTrve13JYP5n4IU8bxJiIzN0GPQeJh6euLnO8sdA TTgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102164; x=1745706964; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7/zBRaBIfgD03SLfWB2fpie1ECbuX1JEqLTmdVNljN0=; b=ZgfLnfuxFC8n9sUcBg1LeHeruCm+gj7vQBSqLI3QHjrAw7NwRAJzK7qumNfE7k6tAs 8RvXo0rHo4cMcCo5ndWVuLslWu1L/TA18NoamJe/sLiVPkDQaaWcZVYFKa5+QRxF21RD fJycUuA39LCEDR7l1so3wlfq+GF0On/s4pKa08pSEzrqiY/Rsmi6V8vVqeh00s1hf6Dd UTIKUyo4YzffgKvf7XIV/N1jfTtqT+QKY5Lkq/X0RF86XrXg30W6LSIgLvk995e6UIXM Ew/e+D1SAwep7eCFxZ0j6cYwQQKsTpsXHbdVo8UXQEfveP/UAwYjtT15z7PFRBbqoLoV 5b2w== X-Forwarded-Encrypted: i=1; AJvYcCV5SYRTkIlBwWkcfpvFXd2jf8xxYpCI24/DldRPws1HZuULvKxce9CMWOXTF6EdnEbaJNVV+aqY5Z/dMp0=@vger.kernel.org X-Gm-Message-State: AOJu0YwDZymhYVRgS3UpMNBd1mjC7HC13dANFM2tzG17WerynmL5ms6Y +D9AEAZGcLmYaY4Z3DO5C2fT50/WBckNBFfLZGL+DyFrWmM5KyRULFTkE1IPVTG1wE3SorUoE/H MfLA= X-Gm-Gg: ASbGnct9ihHNil3e68FtDa+/oM8zRzTanL3vZUW90jees2A2l0a46cZXIpSeDwB47XE H9ocELUenhwL4TxHyHpkalHJ9GdII80elR3GvIVF7zELHVoV7JPXoorRBR+wYbHBGuXSn9ne8QP V66UVG0YZrmyAKbXajSurGnIGTlCMXlD1tm+x0KGVAlbpSkbzfWBg4iJbsyJzs5mZB0KbNzrOvE HkzJNiznlPZwELPil8eSY6Uwqq7vr2pizxhy/r/eMhY1s8eZPgYIDCmNJVJzR4y1NAUrVQ6fBy3 07OhTggRHJuwEd+f3eFRURiXIxhhLXBfsu0knhDv/CLdVQOVhUM= X-Google-Smtp-Source: AGHT+IGnYl36iobf0ClJBjp9ukIPfElQP0sR9IENkVwuBI5zDR+urZvC5l7btb+28mbhOG6+h12jCQ== X-Received: by 2002:a05:6512:118b:b0:545:c7d:1791 with SMTP id 2adb3069b0e04-54d6e663ee5mr1864316e87.43.1745102164214; Sat, 19 Apr 2025 15:36:04 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:03 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:53 +0200 Subject: [PATCH v6 06/31] ARM: entry: Invoke syscalls using C Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-6-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 This makes the assembly invoking syscalls switch over to doing this from C with a small assembly stub to actually jump into the syscall. Split the syscall invocation into two paths: one for plain invocation and one for tracing (also known as "reload" as it was reloading the registers from regs). We rename this path with the infix "trace" as that code will be trace-specific as we move code over to C. Some registers such as r1 and lr get cobbled during the C calls and need to be restored when we return. Right now the part in C doesn't do much more than check the syscall number to be valid (a test previously done with a cmp r #NR_syscalls inside the invoke_syscall macro) but we will gradually factor over more assembly to C that can then be switched to the generic entry code so the exercise gets a point. Since both functions are called from a C file that is in turn only called from assembly, the functions have to be tagged with __ADDRESSABLE() in order not to upset CFI. Tested with a full system boot and by issuing some command line tools with strace to make sure the tracing path still works. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/syscall.h | 3 ++ arch/arm/kernel/Makefile | 3 +- arch/arm/kernel/entry-common.S | 65 ++++++++++++++++++++++++++++++++++++--= ---- arch/arm/kernel/entry-header.S | 25 ---------------- arch/arm/kernel/syscall.c | 28 ++++++++++++++++++ 5 files changed, 90 insertions(+), 34 deletions(-) diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h index fe4326d938c18efb54c96930e6b52ab7da9b2942..1d21f26ecf510ac00a878b4d51a= 5753ee49475f5 100644 --- a/arch/arm/include/asm/syscall.h +++ b/arch/arm/include/asm/syscall.h @@ -19,6 +19,9 @@ =20 extern const unsigned long sys_call_table[]; =20 +int invoke_syscall(void *table, struct pt_regs *regs, int scno, void *retp= ); +int invoke_syscall_trace(void *table, struct pt_regs *regs, int scno, void= *retp); + static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) { diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index b3333d070390a8ff366a306931614b1b260647bd..69ddf51081f4791982518d37df6= 0c11211b8955a 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -20,7 +20,8 @@ CFLAGS_REMOVE_return_address.o =3D -pg obj-y :=3D elf.o entry-common.o irq.o opcodes.o \ process.o ptrace.o reboot.o io.o \ setup.o signal.o sigreturn_codes.o \ - stacktrace.o sys_arm.o time.o traps.o + stacktrace.o sys_arm.o time.o traps.o \ + syscall.o =20 KASAN_SANITIZE_stacktrace.o :=3D n KASAN_SANITIZE_traps.o :=3D n diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index da5c2d4b62e56cce644b15e329ab4149d69c5b79..57aa1084a0476e9c218cd100ce4= fdf4aaa748234 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -254,21 +254,23 @@ ENTRY(vector_swi) #else str scno, [tsk, #TI_ABI_SYSCALL] #endif - /* - * Reload the registers that may have been corrupted on entry to - * the syscall assembly (by tracing or context tracking.) - */ - TRACE( ldmia sp, {r0 - r3} ) - + mov r1, sp @ put regs into r1 ldr r10, [tsk, #TI_FLAGS] @ check for syscall tracing stmdb sp!, {r4, r5} @ push fifth and sixth args =20 tst r10, #_TIF_SYSCALL_WORK @ are we tracing syscalls? bne __sys_trace =20 - invoke_syscall tbl, scno, r10, __ret_fast_syscall + mov r0, tbl + /* r1 already contains regs */ + mov r2, scno @ syscall number from r7 + badr r3, __ret_fast_syscall + bl invoke_syscall =20 + /* Restore regs into r1 and lr after C call */ + badr lr, __ret_fast_syscall add r1, sp, #S_OFF + 2: cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE) eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back bcs arm_syscall @@ -301,7 +303,16 @@ __sys_trace: add r0, sp, #S_OFF bl syscall_trace_enter mov scno, r0 - invoke_syscall tbl, scno, r10, __sys_trace_return, reload=3D1 + mov r2, r0 @ scno into r2 + add r1, sp, #S_R0 + S_OFF @ pointer to regs + mov r0, tbl + badr r3, __sys_trace_return + bl invoke_syscall_trace + + /* Restore regs into r1 and lr after C call */ + add r1, sp, #S_R0 + S_OFF @ pointer to regs + badr lr, __sys_trace_return + cmp scno, #-1 @ skip the syscall? bne 2b add sp, sp, #S_OFF @ restore stack @@ -415,6 +426,44 @@ sys_mmap2: b sys_mmap_pgoff ENDPROC(sys_mmap2) =20 +/* + * This call wants: + * r0: syscall table + * r1: regs + * r2: syscall number + * r3: pointer to return function + */ +SYM_TYPED_FUNC_START(invoke_syscall_asm) +#ifdef CONFIG_CPU_SPECTRE + csdb +#endif + mov tbl, r0 + mov scno, r2 + mov lr, r3 @ return address + ldmia r1, {r0 - r3} @ reload r0-r3 + /* Arguments 5 and 6 are (hopefully) on the stack */ + ldr pc, [tbl, scno, lsl #2] @ call sys_* routine +SYM_FUNC_END(invoke_syscall_asm) + +/* + * This call wants: + * r0: syscall table + * r1: regs + * r2: syscall number + * r3: pointer to return function + */ +SYM_TYPED_FUNC_START(invoke_syscall_trace_asm) +#ifdef CONFIG_CPU_SPECTRE + csdb +#endif + mov tbl, r0 + mov scno, r2 + mov lr, r3 @ return address + ldmia r1, {r0 - r6} @ reload r0-r6 + stmia sp, {r4, r5} @ update stack arguments + ldr pc, [tbl, scno, lsl #2] @ call sys_* routine +SYM_FUNC_END(invoke_syscall_trace_asm) + #ifdef CONFIG_OABI_COMPAT =20 /* diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 99411fa913501cad8b55ef04a2b8ab3d44f3e39e..52b4fa97226dbfa4b55aca8eaf7= 4ae24e1e220f8 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -389,31 +389,6 @@ ALT_UP_B(.L1_\@) #endif .endm =20 - .macro invoke_syscall, table, nr, tmp, ret, reload=3D0 -#ifdef CONFIG_CPU_SPECTRE - mov \tmp, \nr - cmp \tmp, #NR_syscalls @ check upper syscall limit - movcs \tmp, #0 - csdb - badr lr, \ret @ return address - .if \reload - add r1, sp, #S_R0 + S_OFF @ pointer to regs - ldmiacc r1, {r0 - r6} @ reload r0-r6 - stmiacc sp, {r4, r5} @ update stack arguments - .endif - ldrcc pc, [\table, \tmp, lsl #2] @ call sys_* routine -#else - cmp \nr, #NR_syscalls @ check upper syscall limit - badr lr, \ret @ return address - .if \reload - add r1, sp, #S_R0 + S_OFF @ pointer to regs - ldmiacc r1, {r0 - r6} @ reload r0-r6 - stmiacc sp, {r4, r5} @ update stack arguments - .endif - ldrcc pc, [\table, \nr, lsl #2] @ call sys_* routine -#endif - .endm - /* * These are the registers used in the syscall handler, and allow us to * have in theory up to 7 arguments to a function - r0 to r6. diff --git a/arch/arm/kernel/syscall.c b/arch/arm/kernel/syscall.c new file mode 100644 index 0000000000000000000000000000000000000000..edc0ac88ec60ce3f23149a526de= 7dc1205906552 --- /dev/null +++ b/arch/arm/kernel/syscall.c @@ -0,0 +1,28 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include +#include + +int invoke_syscall_asm(void *table, struct pt_regs *regs, int scno, void *= retp); +__ADDRESSABLE(invoke_syscall_asm); + +__visible int invoke_syscall(void *table, struct pt_regs *regs, int scno, = void *retp) +{ + if (scno < NR_syscalls) + /* Doing this with return makes sure the stack gets pop:ed */ + return invoke_syscall_asm(table, regs, scno, retp); + + return 0; +} + +int invoke_syscall_trace_asm(void *table, struct pt_regs *regs, int scno, = void *retp); +__ADDRESSABLE(invoke_syscall_trace_asm); + +__visible int invoke_syscall_trace(void *table, struct pt_regs *regs, int = scno, void *retp) +{ + if (scno < NR_syscalls) + /* Doing this with return makes sure the stack gets pop:ed */ + return invoke_syscall_trace_asm(table, regs, scno, retp); + + return 0; +} --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CB17E1EF087 for ; Sat, 19 Apr 2025 22:36:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102169; cv=none; b=OogCdaywHrhwrK8b1B0vs5D72va7pCtobRPbuYCLlwZSoULXJvAAwY7dfLYrRhv9Oe4+YDmeQjeDtTBHHoaeEwqAeuPrZed9+/5H5LYvKtT3HEfodDTIP5LE7ssU2le2dA4wA8a8pDb90wwvHmAJmss+VtmOEpwGF4UcLWG8quY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102169; c=relaxed/simple; bh=k1h1ntubma0+2YoJLfPA39BbWfB7bKHrWcN4BPqVCHQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HoyvAMEyRtjdYt9lDn7rp2lGd9laQE0jWNdxa+qEbXbtF/8sIqanwqEVgL3a/qLTTBnYYthIAGp8otKyjhotm87doqCQtY+ipQZ2CFJHBohSHW3lahLuBkZccaBu2HfteUjKBxMQjE60yWdxbCMGAMYIHqLlBNwx4HRs7aWYASI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=Sxh+p30t; arc=none smtp.client-ip=209.85.167.41 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="Sxh+p30t" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-54afb5fcebaso3889746e87.3 for ; Sat, 19 Apr 2025 15:36:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102166; x=1745706966; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=aZmnKukadbd2DVD0OEXjqg+oIWqCHiujZSlF23WxiBI=; b=Sxh+p30tlE0m+FfoAmNSbLt+di6QjpJr59aMan2vb5JlsWgrfsQYuIgHYPHMp92OOv hGn3Ltw+VCTbYFKe4sKIrJI/jZQcVd79hr2X4CcuAlNAr1PpkS8jQ0odciq1/3e/Yshc NmC46nTGbNkCAznCQzuDN+brEZDbF93lNy7luN7oBQDvPB+AlvHAijdjJ4w2PbzTxxeF SX8evFxA6LH7bsW0Hh5cm9cZPsibQfMpP2KgN+3ALOikMN+lsgM4VYnS6Vd4G081ZPuF kWD3SePs0knNjQXuF0s87EYgp2IH//bacvmOTNPPpfi6klk9HySPsNChKrhyyTuhh5ei TOsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102166; x=1745706966; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aZmnKukadbd2DVD0OEXjqg+oIWqCHiujZSlF23WxiBI=; b=eMedWM6OuLHIfm7rzoQDSez6NNGKO0yYh1Xq+CZQUPygEyMXZXV/fqEkunmQtfH7Xj stNHEux41IICv6HZ+TPGm/peRvLCS2VnhqyLMDCGiYQqrBWFIv1Rqim0Wx0VD6zVP00k g49hsUK1+mxVXLl1bVdzXOatbjhGg13To9V43Y7PZwAd0jc194YWzJry9HO8rrt7h5qP iiWeEIWby3Y2kv2yF44hKFA/Frrpdo9JAttA7BqtqrMeZMX4n9cTMADaKR0Wx2yu9wmO ko9fZmtCN1TXiH7V8EBOLwbesWWg2GWnSWnLfGo3p5wkZUUVaU4BE832BGVoufNIdktY AwbQ== X-Forwarded-Encrypted: i=1; AJvYcCXh6DXXdxzj978/DS5vP6ClilioiAVJ1/R9U5/ouKXn7rtBbO1v8SurssN5c/QOTrHWyznN1yPriw9qQ2Q=@vger.kernel.org X-Gm-Message-State: AOJu0YycaGZuEUfQ4Aj4pvClzBDZVYBkxX3capy8N+Rnbx7VeftT4IC5 20R+Gn6Lduh5iTNn1WuM+cEUBSeOFDQa/fUciO40mluApOa5zPPKz89bipf2ybX44tn15nSwevc HqdQ= X-Gm-Gg: ASbGncsa2lcmDzrHEgTa1Ua083tspp5NGo7ADmIokApSAjjtSJOG0BqzHS2ng6RX4Vc 7o66dooiyEhDH50Ayst5qkpybeL7r1fRBEM4zZEtxZ4k3aKKu54qDJQMmnKz+UDIKtPnmniR5Xq JJLepXrnjD97+C5xmI3qieqYtyQOVO0bcbfhdvcPCW2Rj3YGQY/MpTIPqWtY85VLcxo70Omfe27 Jkc/auGf1KiVJ+Gij8lgwLIQyC0ApQyQ0dsv0RK4NiuSMOCjxVARedF0mmGS0m64dFLXzGvzylo eQTjyUSth2bqVRIidz5Lc2UzsXa47uNIcXGBkydiPoa530CvdoU= X-Google-Smtp-Source: AGHT+IEcKs0MGpbznfsnmrfRQLSqoFKUEdc6MfTqSjSELeLCkrqH4RJxAyZmrS5qBrUmlZKS7RcNVQ== X-Received: by 2002:a05:6512:3b93:b0:545:2ab1:3de with SMTP id 2adb3069b0e04-54d6e62b725mr1819788e87.13.1745102165769; Sat, 19 Apr 2025 15:36:05 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:04 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:54 +0200 Subject: [PATCH v6 07/31] ARM: entry: Rewrite two asm calls in C Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-7-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The normal and trace entry code calls out to arm_syscall() and sys_ni_syscall() from assembly, but these calls can be moved over to the new C implementation. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/traps.h | 2 +- arch/arm/kernel/entry-common.S | 23 +++++------------------ arch/arm/kernel/syscall.c | 13 +++++++++++-- arch/arm/kernel/traps.c | 2 +- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/arch/arm/include/asm/traps.h b/arch/arm/include/asm/traps.h index 2621b9fb9b19b064aa40a8ab4a3a89067b98a010..b888912c2450e0e8eec8139166c= 7292f283545c7 100644 --- a/arch/arm/include/asm/traps.h +++ b/arch/arm/include/asm/traps.h @@ -40,7 +40,7 @@ asmlinkage void dump_backtrace_stm(u32 *stack, u32 instru= ction, const char *logl asmlinkage void do_undefinstr(struct pt_regs *regs); asmlinkage void handle_fiq_as_nmi(struct pt_regs *regs); asmlinkage void bad_mode(struct pt_regs *regs, int reason); -asmlinkage int arm_syscall(int no, struct pt_regs *regs); +int arm_syscall(int no, struct pt_regs *regs); asmlinkage void baddataabort(int code, unsigned long instr, struct pt_regs= *regs); asmlinkage void __div0(void); asmlinkage void handle_bad_stack(struct pt_regs *regs); diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 57aa1084a0476e9c218cd100ce4fdf4aaa748234..77801d039b5f6562b231a6fd497= 9e318c7e736a6 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -264,18 +264,10 @@ ENTRY(vector_swi) mov r0, tbl /* r1 already contains regs */ mov r2, scno @ syscall number from r7 - badr r3, __ret_fast_syscall - bl invoke_syscall - - /* Restore regs into r1 and lr after C call */ + /* We return here no matter what, also pass this as an argument */ badr lr, __ret_fast_syscall - add r1, sp, #S_OFF - -2: cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE) - eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back - bcs arm_syscall - mov why, #0 @ no longer a real syscall - b sys_ni_syscall @ not private func + mov r3, lr + b invoke_syscall =20 #if defined(CONFIG_OABI_COMPAT) || !defined(CONFIG_AEABI) /* @@ -308,13 +300,8 @@ __sys_trace: mov r0, tbl badr r3, __sys_trace_return bl invoke_syscall_trace - - /* Restore regs into r1 and lr after C call */ - add r1, sp, #S_R0 + S_OFF @ pointer to regs - badr lr, __sys_trace_return - - cmp scno, #-1 @ skip the syscall? - bne 2b + cmp r0, #-1 + bne __sys_trace_return add sp, sp, #S_OFF @ restore stack =20 __sys_trace_return_nosave: diff --git a/arch/arm/kernel/syscall.c b/arch/arm/kernel/syscall.c index edc0ac88ec60ce3f23149a526de7dc1205906552..d637dc74b1c70415933898fbcad= bedc71df5f654 100644 --- a/arch/arm/kernel/syscall.c +++ b/arch/arm/kernel/syscall.c @@ -12,7 +12,10 @@ __visible int invoke_syscall(void *table, struct pt_regs= *regs, int scno, void * /* Doing this with return makes sure the stack gets pop:ed */ return invoke_syscall_asm(table, regs, scno, retp); =20 - return 0; + if (scno >=3D __ARM_NR_BASE) + return arm_syscall(scno, regs); + + return sys_ni_syscall(); } =20 int invoke_syscall_trace_asm(void *table, struct pt_regs *regs, int scno, = void *retp); @@ -20,9 +23,15 @@ __ADDRESSABLE(invoke_syscall_trace_asm); =20 __visible int invoke_syscall_trace(void *table, struct pt_regs *regs, int = scno, void *retp) { + if (scno =3D=3D -1) + return -1; + if (scno < NR_syscalls) /* Doing this with return makes sure the stack gets pop:ed */ return invoke_syscall_trace_asm(table, regs, scno, retp); =20 - return 0; + if (scno >=3D __ARM_NR_BASE) + return arm_syscall(scno, regs); + + return sys_ni_syscall(); } diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index afbd2ebe5c39dca42e5cfac1d46213f0d5b63d5c..2e673ebf44abe5e7224acbe4f67= 2bb74730a7f6c 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -602,7 +602,7 @@ do_cache_op(unsigned long start, unsigned long end, int= flags) * 0x9f0000 - 0x9fffff are some more esoteric system calls */ #define NR(x) ((__ARM_NR_##x) - __ARM_NR_BASE) -asmlinkage int arm_syscall(int no, struct pt_regs *regs) +int arm_syscall(int no, struct pt_regs *regs) { if ((no >> 16) !=3D (__ARM_NR_BASE>> 16)) return bad_syscall(no, regs); --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA4791EF36B for ; Sat, 19 Apr 2025 22:36:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102170; cv=none; b=EdxXo49/ZAA8ixxDmnI4U28tnCVTPZ7wBTJUTiUJpNiIWhwJyrED23KrhuNmPYZSPum/UvVtykOs2jj7mtjqA7afZs1eXhvUxoPAXvUJ8jMJK54iM4Kh5KVjdfh05ng2mhk5x1cLQROMv+n/wc2OQsfeY5SRIWXePclWmQANf8A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102170; c=relaxed/simple; bh=GjuzgP6o/H3QbhkPNB4rDABhts4Jsa/gdYzzkN8CaaE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OAwPh1mIquvSdkgIpICt74IJhg6/evSMooNm+7hWvg9I+81KyY4r4bcsQzRiOIO5yzwrGw29hZMs0AQ5BhBWwc+GWgbu8EBXJynp6jPNBhclChoUzbDIGy1y0gaYFFVjxv1PpmKaghvPmH+Z3ILhlRO1Jt4cEdmEqqR0kBOEf38= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=VV8vOEqc; arc=none smtp.client-ip=209.85.167.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="VV8vOEqc" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-549b116321aso3285346e87.3 for ; Sat, 19 Apr 2025 15:36:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102167; x=1745706967; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ZVzjh4CI2wdh2Lb2nY0LTHSQ875qMVuhPD3D7+BHQLo=; b=VV8vOEqchbICg1PiY0tSlYtvgq8+tVF7CMYzRoRIzx8z/rIXuYZaHqWjWqmCdsOpaC kWTbsJVjoKWqZT1W1sjjHN51YVYmwVEvD38wr8gZTsPN+i6v6hEInqAt6OYfhYpJzvUM YkiZR2uYehcjgWil/6lEtIf+7hzaVIA2ytNbX9Txf3JUAwylaTCqH4YqXhvCRKKw5Azj sge1kRHNV6RZOFv/Wv4sZggE/s8IS69WDYdyncxBZtdW4DP6lxd5ES11mhU3R5dkfr0r dXijPZEyTMWEKDo13sETxhqizpSEO1v7R3+WFWgjkTcVebwoXoUmfUNK39DrdAP0i7M8 Alaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102167; x=1745706967; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=ZVzjh4CI2wdh2Lb2nY0LTHSQ875qMVuhPD3D7+BHQLo=; b=XDvCDoQ+lFobSFELBF0d6xbSqW+rKqdRFNZuHHP0a+TpxTvFbq0e+f8BkoimrPsYy7 AHOwO2jHLWAna5qsxzOhkoco8TVRL+dV90s1qYNyxqS5Ib4WVYG6IWEirq8Jwu1iWIAn LbsFnIDHqZc+pSrOoNJvKXUKnBRJkUKPpykP36QjZ451lJvWMSSEuWFHKbDm/u74Cz4g kuSz+2t+Wnvwrg5jlPVG3idwHrfJxLbEFtxfJJT80Tgmf5h7ksb+uTAQ99OfsRP7kQvB uZk3Ll3eYzWw82EL9tcXdA5/otyZuOEDf671iFVK19lzbZ+HcABGNQ8lALc+5M+rw46Z jRYw== X-Forwarded-Encrypted: i=1; AJvYcCWwpyCQqry82YiTxdw0HiVpQRtAi/xQ1n1+LbMbLarYZdrnO1zs6TUKUDIYdLie9o7I/ABDSHJPpYZ0TeM=@vger.kernel.org X-Gm-Message-State: AOJu0YwRc6355n0iYueT61Jkf5qA2kY0jTYoZunxxamPpIipVxHbyOaY OFWKP6yH2Zg4Fd1F40YOjeiFatGKqxWq+07N2K0fvAzZ9KvWEEbBz4Nt+eFCa/0= X-Gm-Gg: ASbGncs/SzdEO3Y9dkosatJOl/GXo+dYyrAnF7RJZP21jDBerxbdom90MllfVrCbWtH 9z7hwqca1vWn9k2SOC4nQt5Snt5Us9Td7bauyodde2gyHt49suE54RrxADw+N0Rvit1JvZCJji1 NrLZXv5H6U0Sink5D/LX3W6BuXzgZL4A/8BArN8u7QwGa5hukF9Q1D8DtxHXVObQ8pst4ekh8NM gu3WvnRi2ShTiO/UUDuyuILSDYFIEAWHFlEp8loeFNYwUVHkw5LLQr66K3RV0QWCOIYRqEzZhBo 9xjyEIgpDchKjxK19+1pSEUCIjuOdUDOTsbHLlBGSKNl1NFK5B8= X-Google-Smtp-Source: AGHT+IG1pK5ONP5zwkjmb5F3Kh3pNns2KgCXtbBbSCQoJiPI86cXUdyKSiDMdutuwP1A2HrNm1AC0g== X-Received: by 2002:a05:6512:3d28:b0:54d:65e8:31e0 with SMTP id 2adb3069b0e04-54d6e61be01mr1979159e87.5.1745102166756; Sat, 19 Apr 2025 15:36:06 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:06 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:55 +0200 Subject: [PATCH v6 08/31] ARM: entry: Move trace entry to C function Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-8-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 This moves over the code entering into tracing into the C syscall invocation code. As syscall_trace_enter() will provide the current syscall number from the regs we need not provide the syscall number to the invocation function any more. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/syscall.h | 2 +- arch/arm/kernel/entry-common.S | 6 +----- arch/arm/kernel/syscall.c | 5 ++++- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h index 1d21f26ecf510ac00a878b4d51a5753ee49475f5..66067d165ba3fbbe0f840a89ae3= 96eb1a311bacc 100644 --- a/arch/arm/include/asm/syscall.h +++ b/arch/arm/include/asm/syscall.h @@ -20,7 +20,7 @@ extern const unsigned long sys_call_table[]; =20 int invoke_syscall(void *table, struct pt_regs *regs, int scno, void *retp= ); -int invoke_syscall_trace(void *table, struct pt_regs *regs, int scno, void= *retp); +int invoke_syscall_trace(void *table, struct pt_regs *regs, void *retp); =20 static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 77801d039b5f6562b231a6fd4979e318c7e736a6..3cfc6d952ff99be9c4c1be4481a= c3039260e3e57 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -292,13 +292,9 @@ ENDPROC(vector_swi) * context switches, and waiting for our parent to respond. */ __sys_trace: - add r0, sp, #S_OFF - bl syscall_trace_enter - mov scno, r0 - mov r2, r0 @ scno into r2 add r1, sp, #S_R0 + S_OFF @ pointer to regs mov r0, tbl - badr r3, __sys_trace_return + badr r2, __sys_trace_return bl invoke_syscall_trace cmp r0, #-1 bne __sys_trace_return diff --git a/arch/arm/kernel/syscall.c b/arch/arm/kernel/syscall.c index d637dc74b1c70415933898fbcadbedc71df5f654..377e16c8c53c8e809e3f8b157a8= 89ef115d5c043 100644 --- a/arch/arm/kernel/syscall.c +++ b/arch/arm/kernel/syscall.c @@ -21,8 +21,11 @@ __visible int invoke_syscall(void *table, struct pt_regs= *regs, int scno, void * int invoke_syscall_trace_asm(void *table, struct pt_regs *regs, int scno, = void *retp); __ADDRESSABLE(invoke_syscall_trace_asm); =20 -__visible int invoke_syscall_trace(void *table, struct pt_regs *regs, int = scno, void *retp) +__visible int invoke_syscall_trace(void *table, struct pt_regs *regs, void= *retp) { + int scno; + + scno =3D syscall_trace_enter(regs); if (scno =3D=3D -1) return -1; =20 --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 43FC81EF39E for ; Sat, 19 Apr 2025 22:36:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102172; cv=none; b=qbUW9PwGB8tMkVyeuqXKVtycvm8WcO/PxWo3QnPEZ2JdQHsBAltisz/Zopw78xdRQSQ4ZeI5aSSdnOJgrV1MYu7xj0cJotJDo9W4T8W5r4p1VxmVZiHwoUcUA3rqF2vM61VylsmdAABuPJM87jw0/WLbDdexd0wNwZHXT40HqXE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102172; c=relaxed/simple; bh=8Lmq+B+8dQHOJgJYKg4Eu++IihkxOmet9HBYrJI4JGE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tp8XFzorhCCHaLNuuiT6X/BsQOrnmJBGzzfTO1w6Cap+J8GF37ZoeFqtwXkB2+Ljf8bMpBFfRQ66+KmnT5G/iEVLRhU7BBf4JNddFzCZ1fjS2VggtHvp2h0k83xQsugGBxC8YhbJumX2e7F9HcChWjIiNJ8TMglSkbzlRZJpKx0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=a+3nMgwp; arc=none smtp.client-ip=209.85.167.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="a+3nMgwp" Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-54b1095625dso3502733e87.0 for ; Sat, 19 Apr 2025 15:36:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102168; x=1745706968; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=kzUqR1jHKNDNB1MvP/C818suEL+5EgmWCT+bBhmdbf0=; b=a+3nMgwpMQKiVMFbFSzkZPjll5Ho0l8Q+CpPT61slP6Jd7tpiHrNNmKBDYotkXHQx2 mTExYnMnuzLjxoBbm+KMyccGD7gBAQOA/a2itFqGEodMvcN1OHT5G1nlsDFFs1lHOZ8o liPkRi+jq/WIEOiW+YbGg385D3omQ2nAxIz7apN3lB8YBeD/yTHh33s+ZhZGsCC9nxZ1 AGxamLpSEUAuORCDUkSFZVMelK1oDZFlerPQv5uESfuutrwQdbqLJQtwTaiPhtBQynGJ TfeYTedugxu1aDQ/6/K3VyiywcH4VkGrzC2TL5o+GKTluoVBsXBreKxhPd2Cne7Nx6NM f4AQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102168; x=1745706968; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=kzUqR1jHKNDNB1MvP/C818suEL+5EgmWCT+bBhmdbf0=; b=YVZX+/mTX8t7EP7gHhifFGd3fnl7/3RqnRiy1CqUNlTWUsBVLe12PGiAYSc69wT592 4VBRYaL6ZBa+v8ZGJ/Y0QEq7ytJO8UJ+QPylQLNTgAoKQRAMHCC8EZyEoUD94ee/Bpep NZ9IfWAuqicxuttdz+aCEUGeiJSsmtKMhkTl1wW+x449E7LSH+u2ypl90ihhu53z8DsJ BX1pdeSu9UfuFnkQwuvqyKX8ayHyT9eqy9rIXM8oDQnUFAFKvSPsa/OGLqash45xCw9w 54MNbQ2Pu8o5cZY2Dbkvl6djxDympGQlUrv5Mu6n+WWt7uoswk1tc3lYkF61bs/iN+aP vpkA== X-Forwarded-Encrypted: i=1; AJvYcCU7Mh1OIEv4nM+z7emXGfDvZ74cYKxdaxzAGfftPUY4f67rIU11XntjoeImbeB2HbbDOMV/cfVg5PuwDfc=@vger.kernel.org X-Gm-Message-State: AOJu0Yxk8wqyjUwUf/cYdkYnfQe7kfUBdxy1sC6maYpxTYsQiEyl0FSu kXkrYGAA1dpzKI7vvzeHwNO65/e/KClIQhTxaJCPDqGwhpSlJSQwq67z7/uDDO8= X-Gm-Gg: ASbGnctR6LcW/4crWHfVw7Y3kk86QZ8ogBeEiZa9f2gJifeUuLOtDbkwurh5OtSGvJw KQYILEe8Gk7PGfdOcD5Ihu97yCQ/P6iRKpC8Dv8YfXHrT3iq8HH4V9DajPJ8BK4VIDjhwvD+4t9 ZLqzOC7+nTtyE4Q0BFeNWq34Jyyhp9VjWyE9M5q0Df7W2k1j6toFfUlg/qqvjDi/EAgkMjygejr PEhFrEems45qnhU0ZMZm/FTeuKTH5vomoRAeP/N0lhHN3s5P/8e6ZHImL3l8P4usQ5jI8tzOxkD jGLWYBQFlgn76ES9gsnZG5IzX9NO7ZLNIAtOTifeoDgJKntxi78= X-Google-Smtp-Source: AGHT+IFmea0W7fyk5E36UX+d1KPazK0iLChsYY2dcspCJddLKNCeOYSi+wYuBVuxVxg8eew0JWKzvA== X-Received: by 2002:ac2:4c47:0:b0:545:2cb6:af31 with SMTP id 2adb3069b0e04-54d6e62cb53mr1849382e87.15.1745102168217; Sat, 19 Apr 2025 15:36:08 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:07 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:56 +0200 Subject: [PATCH v6 09/31] ARM: entry: save the syscall sp in thread_info Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-9-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 We are going to rewrite the syscall handling in C, which means that the stack used by the call code is no longer predicatably 8 bytes (for syscall arguments r4 and r5) but a varying number of bytes depending on how nested the C code is. However the current code is just assuming it can rewind the stack by adding 8 to sp if a syscall is interrupted by a sigreturn call. Solve this by storing the entry sp in the per-task struct thread_info and use that in the sigreturn wrapper instead. We already have the thread info available in the SWI entry and sigreturn is probably not so common that retrieveing a pointer to thread_info should affect anything very much. Storing this per-task in thread_info makes the solution SMP robust. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/thread_info.h | 1 + arch/arm/kernel/asm-offsets.c | 1 + arch/arm/kernel/entry-common.S | 8 ++++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thre= ad_info.h index 943ffcf069d29cf4a035964d20d56f7ebdd6d602..d8a45c5a10496aaf806bfeaa035= 3d5e8985bd6f5 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h @@ -67,6 +67,7 @@ struct thread_info { __u32 cpu_domain; /* cpu domain */ struct cpu_context_save cpu_context; /* cpu context */ __u32 abi_syscall; /* ABI type and syscall nr */ + __u32 sp_syscall; /* SP when entering syscall */ unsigned long tp_value[2]; /* TLS registers */ union fp_state fpstate __attribute__((aligned(8))); union vfp_state vfpstate; diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c index 123f4a8ef44660a39c4eff2a6e5fd86cb48fb572..291de33ec53d11d87d39d9b87c3= c82843e4ebbe8 100644 --- a/arch/arm/kernel/asm-offsets.c +++ b/arch/arm/kernel/asm-offsets.c @@ -49,6 +49,7 @@ int main(void) DEFINE(TI_CPU_DOMAIN, offsetof(struct thread_info, cpu_domain)); DEFINE(TI_CPU_SAVE, offsetof(struct thread_info, cpu_context)); DEFINE(TI_ABI_SYSCALL, offsetof(struct thread_info, abi_syscall)); + DEFINE(TI_SP_SYSCALL, offsetof(struct thread_info, sp_syscall)); DEFINE(TI_TP_VALUE, offsetof(struct thread_info, tp_value)); DEFINE(TI_FPSTATE, offsetof(struct thread_info, fpstate)); #ifdef CONFIG_VFP diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 3cfc6d952ff99be9c4c1be4481ac3039260e3e57..8baab7f97f59c434396f30b08dd= d3029c5f9c0e5 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -232,6 +232,8 @@ ENTRY(vector_swi) =20 uaccess_disable tbl get_thread_info tsk + /* Save a per-task copy of SP for sigreturn */ + str sp, [tsk, #TI_SP_SYSCALL] =20 adr tbl, sys_call_table @ load syscall table pointer =20 @@ -377,13 +379,15 @@ sys_syscall: ENDPROC(sys_syscall) =20 sys_sigreturn_wrapper: - add r0, sp, #S_OFF + get_thread_info tsk + ldr r0, [tsk, #TI_SP_SYSCALL] @ read back SP mov why, #0 @ prevent syscall restart handling b sys_sigreturn ENDPROC(sys_sigreturn_wrapper) =20 sys_rt_sigreturn_wrapper: - add r0, sp, #S_OFF + get_thread_info tsk + ldr r0, [tsk, #TI_SP_SYSCALL] @ read back SP mov why, #0 @ prevent syscall restart handling b sys_rt_sigreturn ENDPROC(sys_rt_sigreturn_wrapper) --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CD20A1F03C9 for ; Sat, 19 Apr 2025 22:36:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102173; cv=none; b=CxRZ2AU1r3fg4eVJuGw5XLuJeNpZMfPkCVvx/RbGvxRNGvmd1riH8pt0+K1OBIkZf1N5dyJOUdA5CiT6zqIPs5Xclp25XGPEp60/6+oEk2v+Zj21C0eh+0WyBr3HK0hyLxzzRzZYA3uaoTqXkxRJ2frJZ863cRxi7H/Rb20Bz+I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102173; c=relaxed/simple; bh=2OFGKWEMTrRTT5tjjZH4BJSkfjxSF6tWnNPFMBBZOXg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oZwrN7Y8SqtS/NUzJiI/xvV4qBPUxZkYPbdmwkc3YzN9xVN6Vc3GsW4GAzSEumi48ZvZ3VqD1lxedX+h1RH55np1MiF2NncD21SBeUqr4Egym9960//xsHmrLNdgfMicgit7ITdrSAc6wXUiQcs6QKluftuWWL5TMqR9ZnBcJMM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=FXRIVsoA; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="FXRIVsoA" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-54af20849adso2805458e87.1 for ; Sat, 19 Apr 2025 15:36:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102170; x=1745706970; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=xiM2m9ABoxfWOeD3G81zWg3PRWoAeqZTvFDZw3I7hGA=; b=FXRIVsoA9ERexj9OyECweIpw4x5xycgbwx8bc2KNqTr0AieeDfFsX+J5FuOpk0fiYx U5EhoLcPBHQx9CvW7UT1g2ZJo2DdYoQZ0D6BHhZSVT3TJ2eEuHKQaXJjcwrloGXkX7Da fdfnqnwsSdZgzccB60QzhZ0mvYB4MEjW0+x8KArYSs4TPW9AE8Md4g2neId7mXViDIS3 ogn8gzvoGbg0ZQauzCUUf6wU1NMmlbjsWcy42ikTOpyXVIbECylK998BDtxMyTguwA9w VwnGF1WE0R5WAoanhzGE6Hm8+ojQaqjGJgnlcwmxv1fOqCRjRLZOPmDn/WciomiIm8Rf Yp/A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102170; x=1745706970; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=xiM2m9ABoxfWOeD3G81zWg3PRWoAeqZTvFDZw3I7hGA=; b=NGzUqo6j/3JSuXhflAWMdaJPzZTelhLcvIdD+fi/gi46uoy8lZfbW0oBxjltYvAg8I ww9ceKzD7cv9yHGdutkqYDStcdFr1bgtuzF+60yNKfBeyjq37hj/yFdTGj/REN9WNLGG Vfz9yvHS642mgxzXScdt3lQCOjkOjNlhwUHdmdbhS4wl0uEfGMMuz0I3w6/gwRmJVB1U UJ2PfeFiGdfqTomC3T70KzLSNzIiGFS9zWLplQInFaFCmjXxIDRb7RCw82a8lnJehpBR s6d1hO6T2DGrqQ0bUUs+QMY3WBalOXTDaEuu0bnl9UJT7lhwMHiYdjB9/Vi15BX0RXv+ t+sg== X-Forwarded-Encrypted: i=1; AJvYcCXmoIarxh9LlgLIkPp6LUXGtWh7WzZYz1sJRcIk4LKYLtDu/rThXD9x5r3N26oAUEd5uRnscycFgpLdZEw=@vger.kernel.org X-Gm-Message-State: AOJu0YwVcswZgW8ydOKIH6sOKayiFs2L3d0zE2UiHfL2TjcCPC++t8Bo PVCSILljOxYlKWQvk6deIqWAz69Y/4pGFQKwRx5xH6x8onEQH5XgdE1cH0XQ1m0= X-Gm-Gg: ASbGnctGltKRWvXHHSikHn8Kuzy/ZKlEu+dS7bxJqzxKjDQc9I562nAzA/+B4kDgd8y gMn/LaWedaIvAoKc4uoPmJlE1CgdI7pvii4vjw9FzuNdSwDZgi1dNhsAkk5msCc9Cnij76uMVuT AUga+Pp83FjFg34ntbc9Z9VoeGaHT3Pr/g2hNKbmS2lCZOvWEPW7/VYmlG11RSF+e2FwCl8gQJE LurRnZ6zElPSOsl1GqHXbaEKXjFOqElaV/kV6PEQ1VbWno9e/13Ckb068JFy5iLY2SdXtLrCjsh NY7wf63hnSnnFBX/U02N+w0D6/sKcK0PN41W8RklxqcAVqLM9g+FebzwmyeGKQ== X-Google-Smtp-Source: AGHT+IFUHnCFl3rwYhxdXisPsoj8SpByV0bgu6OwD68TwJ1OsQbpjFjweq7RH2TQHdNEzdVERV/lRQ== X-Received: by 2002:a05:6512:1151:b0:54b:f99:776c with SMTP id 2adb3069b0e04-54d6dc055ebmr2313462e87.24.1745102169877; Sat, 19 Apr 2025 15:36:09 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:08 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:57 +0200 Subject: [PATCH v6 10/31] ARM: entry: move all tracing invocation to C Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-10-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The traced invocation of syscall is rewritten in C, moving over also the call to syscall_trace_exit() to C. To do this we cannot have invoke_syscall_trace_asm() be a leaf call, which is the mechanism we hithereto relied on to make sure the stack is pulled back to the state we were at before we called out to the code written in C. Push the registers potentially used by C on the stack, and make a copy of the two stack-pushed syscall arguments on the top of the stack before invoking the syscall and then drop these copied arguments and pop back the registers before returning from invoke_syscall_trace_asm(). As we are now calling from and returning to C, we no longer need to pass the regs pointer around so drop it. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/syscall.h | 2 +- arch/arm/kernel/entry-common.S | 32 +++++++++++++++----------------- arch/arm/kernel/ptrace.c | 2 +- arch/arm/kernel/syscall.c | 30 +++++++++++++++++++++--------- 4 files changed, 38 insertions(+), 28 deletions(-) diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h index 66067d165ba3fbbe0f840a89ae396eb1a311bacc..cb0073c4151bf70a82d15e17a95= b6b6f48b245d6 100644 --- a/arch/arm/include/asm/syscall.h +++ b/arch/arm/include/asm/syscall.h @@ -20,7 +20,7 @@ extern const unsigned long sys_call_table[]; =20 int invoke_syscall(void *table, struct pt_regs *regs, int scno, void *retp= ); -int invoke_syscall_trace(void *table, struct pt_regs *regs, void *retp); +void invoke_syscall_trace(void *table, struct pt_regs *regs); =20 static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 8baab7f97f59c434396f30b08ddd3029c5f9c0e5..dbc947d301ec11bb13007cb4bb1= 61c035ede5c10 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -296,22 +296,11 @@ ENDPROC(vector_swi) __sys_trace: add r1, sp, #S_R0 + S_OFF @ pointer to regs mov r0, tbl - badr r2, __sys_trace_return bl invoke_syscall_trace - cmp r0, #-1 - bne __sys_trace_return - add sp, sp, #S_OFF @ restore stack - -__sys_trace_return_nosave: - enable_irq_notrace - mov r0, sp - bl syscall_trace_exit + add sp, sp, #S_OFF @ restore stack pointer b ret_to_user =20 -__sys_trace_return: - str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 - mov r0, sp - bl syscall_trace_exit +__sys_trace_return_nosave: b ret_to_user =20 .macro syscall_table_start, sym @@ -437,18 +426,27 @@ SYM_FUNC_END(invoke_syscall_asm) * r0: syscall table * r1: regs * r2: syscall number - * r3: pointer to return function */ SYM_TYPED_FUNC_START(invoke_syscall_trace_asm) #ifdef CONFIG_CPU_SPECTRE csdb #endif + /* Save registers because we are being called from C */ + push {r4 - r10, lr} mov tbl, r0 + /* Make space to copy the two syscall stack arguments */ + sub sp, sp, #S_OFF mov scno, r2 - mov lr, r3 @ return address - ldmia r1, {r0 - r6} @ reload r0-r6 - stmia sp, {r4, r5} @ update stack arguments + badr lr, __invoke_syscall_trace_ret @ return right here + ldmia r1, {r0 - r6} @ reload r0-r6 from regs + stmia sp, {r4, r5} @ copy stack arguments ldr pc, [tbl, scno, lsl #2] @ call sys_* routine +__invoke_syscall_trace_ret: + /* Drop the copied stack arguments */ + add sp, sp, #S_OFF + pop {r4 - r10, lr} + ARM( mov pc, lr ) + THUMB( bx lr ) SYM_FUNC_END(invoke_syscall_trace_asm) =20 #ifdef CONFIG_OABI_COMPAT diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index 07b0daf47441f1f76a8af416acc74fa5ed770403..ac7b98ae47249b4a00fc1cb871b= b2d309bfd8c88 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -888,7 +888,7 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs) return scno; } =20 -asmlinkage void syscall_trace_exit(struct pt_regs *regs) +void syscall_trace_exit(struct pt_regs *regs) { /* * Audit the syscall before anything else, as a debugger may diff --git a/arch/arm/kernel/syscall.c b/arch/arm/kernel/syscall.c index 377e16c8c53c8e809e3f8b157a889ef115d5c043..e90f04f35b3485968a1e9046cf0= 889f56cca92e5 100644 --- a/arch/arm/kernel/syscall.c +++ b/arch/arm/kernel/syscall.c @@ -18,23 +18,35 @@ __visible int invoke_syscall(void *table, struct pt_reg= s *regs, int scno, void * return sys_ni_syscall(); } =20 -int invoke_syscall_trace_asm(void *table, struct pt_regs *regs, int scno, = void *retp); +int invoke_syscall_trace_asm(void *table, struct pt_regs *regs, int scno); __ADDRESSABLE(invoke_syscall_trace_asm); =20 -__visible int invoke_syscall_trace(void *table, struct pt_regs *regs, void= *retp) +__visible void invoke_syscall_trace(void *table, struct pt_regs *regs) { int scno; + int ret; =20 scno =3D syscall_trace_enter(regs); if (scno =3D=3D -1) - return -1; + goto trace_exit_nosave; =20 - if (scno < NR_syscalls) - /* Doing this with return makes sure the stack gets pop:ed */ - return invoke_syscall_trace_asm(table, regs, scno, retp); + if (scno < NR_syscalls) { + ret =3D invoke_syscall_trace_asm(table, regs, scno); + goto trace_exit_save; + } =20 - if (scno >=3D __ARM_NR_BASE) - return arm_syscall(scno, regs); + if (scno >=3D __ARM_NR_BASE) { + ret =3D arm_syscall(scno, regs); + goto trace_exit_save; + } =20 - return sys_ni_syscall(); + ret =3D sys_ni_syscall(); + +trace_exit_save: + /* Save return value from syscall */ + regs->ARM_r0 =3D ret; + +trace_exit_nosave: + local_irq_enable(); + syscall_trace_exit(regs); } --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 69D711F09B3 for ; Sat, 19 Apr 2025 22:36:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102175; cv=none; b=WwcUcZ1ofRAgvzq6a6jKdbCV4cYwUyps0rWHRhTMkqMzQB7eeKMQV59YlAFg661VERO+Cc4pS5R1OxpKk+zG3ZyN/MwShwgeJF/dzq4Ox0sWxRvGPEeGJXgjTVrpWfjsYUcM6+pq+uMX063IwhXh5V4bMjqR6keLs9bF4IgC44U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102175; c=relaxed/simple; bh=TP4Yh+9WJlDZaqz4bf4qUkZ08SlWdrw1wBwo43PLPwo=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eYq4tnMG2HI83TrBHIX8rXjvqO/oDAYK75iM2+LcPTjRdV4qvDkxgK0JNxKKIrgime3fdhADT4OMDy7cZ6h9FOzq8/AtupDg4kdQhWO3mnfUpoL+SSREofzyRIXMpXvVOM8tyyMcXKjOet7FIeIjMWTK5Tnc5xNyKqFVKjknJjo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=qYeUhee+; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="qYeUhee+" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-54b10956398so3476814e87.0 for ; Sat, 19 Apr 2025 15:36:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102171; x=1745706971; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=l98x3YSTQCmRpdwObE91jKVkzt4FjWNoTJCcOXRWYQo=; b=qYeUhee+2AMKeypIRHznx4N3FZLrPFjYLcicZDnv36F0MNUX1SPh2qg58xiAbNN6TH 1jj1pKsi/aQ08Rw77pTewJIft8yypgS7+wJH0WTJI6Rl/sMcaQX6Qgqh/4pYEjsIhaXp /oe4GU+W6sGD+Hy7mksFZGQlEDvqfollRUtxN3fmrLahbqBxFErlS5RnR0cShoeAPT0S WVBspt0e5ojYd+3/xHqJFg2dmjhUX+G+QGHJ+QrNg02Ufx86xkANtFtDFiXTxlWdyDyT mlGKbRCiDab5+RlO5SzfyLT1RtUGih4iF3E3vCOVGCScg45XshVKUNQCna6kZZQouxuu cafA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102171; x=1745706971; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=l98x3YSTQCmRpdwObE91jKVkzt4FjWNoTJCcOXRWYQo=; b=E4T4bs1x4sY6YZ/FyCUj9+plbSHfTLpg0l2UYQqldxE02csEiLzmf1vr6y1BKicDFv GQ0AdgDrr2/BOI9Jep2z2SUJPx3pTs5RoZxhvyO66Z3YKstPyNUI8VA/c3D8kIVo2em5 SBIGam5hGiUw7E2plQKTKnEksJHVnKzpKtatjQjegCupKpcatctO0i0cwA4ihIDvuZOG OqsGKP+gOT7ZXadslOEOowzkbCics3+YsIZ9tEUDSt+Cb4JcXDf0l9OsKFk19B8NRmdl B4k8p3pWzana+k6dFlQoqDEGzubD6gvT2wobw1JY3vjOBqsVLzTl+1WD37ZWcSfgzjne lcMA== X-Forwarded-Encrypted: i=1; AJvYcCXV0uOrDOfe4wQ/8dNYPfj04wNTB0a5gUuVICrEbcRIhIfeEOnExE4RqFprDh+LnOxY19GX60evTMBe3oY=@vger.kernel.org X-Gm-Message-State: AOJu0Yyy4ZuavorxL/JR6HovDYF5slEDl3yUuvwJVsQklwHIM9xNmKHn XN+bhq0zHPWAM/s5b2BYYrOt8cjLZ0obREFjlcHgeByJF1400gcXBbeXM+Lr1WA= X-Gm-Gg: ASbGncvW6zI44J6HWEAOwc+XC6GsUsmt1tJILhXp01ZDId+BJrSqMDUsSu2/lGUMuPV pPElRyQxpjdJ0qBQmpe3CZHRIZEade3ryecudPaPLPQxuvAW+B6TcTfI/WC+RmQaYDhFZgd6YTK HCVxyUs9SytIiDOZWtmLm/4Ig6Ymqzwgn8edg8xjvtznFUelODALCH83sgwu7cOLpGl0Kh3IhhF 6K7fP+F4GjFbgVX0jN1yF273dHVqfVYB+4Do1TDUOydcWdy3j9rmMtx75kdNt33e9O97xLSQ8xV NuvAkCy2/ZRLOcLEE6fuGzLqPAwR3tptwTcZ4fbDXVqmLq0N/zg= X-Google-Smtp-Source: AGHT+IHq/GECB8/PhsmzHvDnTv89Wx7raTEYHUi/0yF8Wzd8LfNYvvGMkk5FpZPXmnpYgbFS+fFHuw== X-Received: by 2002:a05:6512:3d29:b0:54d:6c14:3caf with SMTP id 2adb3069b0e04-54d6e780055mr1794566e87.11.1745102171471; Sat, 19 Apr 2025 15:36:11 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:10 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:58 +0200 Subject: [PATCH v6 11/31] ARM: entry: Merge the common and trace entry code Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-11-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The trace entry code now can handle recursive and complex calls in C using stack. Move the common code over to using that approach. We now use the ret_fast_syscall return path also when tracing, which appears to work just fine. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/syscall.h | 3 +-- arch/arm/kernel/entry-common.S | 61 +++++++++-----------------------------= ---- arch/arm/kernel/syscall.c | 35 +++++++++++------------- 3 files changed, 28 insertions(+), 71 deletions(-) diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h index cb0073c4151bf70a82d15e17a95b6b6f48b245d6..9c664d8c5718f58034f442c20a0= 30b59faf65dd9 100644 --- a/arch/arm/include/asm/syscall.h +++ b/arch/arm/include/asm/syscall.h @@ -19,8 +19,7 @@ =20 extern const unsigned long sys_call_table[]; =20 -int invoke_syscall(void *table, struct pt_regs *regs, int scno, void *retp= ); -void invoke_syscall_trace(void *table, struct pt_regs *regs); +int invoke_syscall_trace(void *table, struct pt_regs *regs, int scno); =20 static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index dbc947d301ec11bb13007cb4bb161c035ede5c10..f0f1f8723965313b287158fb2a2= 38908db72fcd2 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -39,7 +39,6 @@ saved_pc .req lr * from those features make this path too inefficient. */ ret_fast_syscall: -__ret_fast_syscall: UNWIND(.fnstart ) UNWIND(.cantunwind ) disable_irq_notrace @ disable interrupts @@ -47,13 +46,13 @@ __ret_fast_syscall: movs r1, r1, lsl #16 bne fast_work_pending =20 - restore_user_regs fast =3D 1, offset =3D S_OFF + restore_user_regs fast =3D 0, offset =3D S_OFF UNWIND(.fnend ) ENDPROC(ret_fast_syscall) =20 /* Ok, we need to do extra processing, enter the slow path. */ fast_work_pending: - str r0, [sp, #S_R0+S_OFF]! @ returned r0 + add sp, sp, #(S_R0 + S_OFF) /* fall through to work_pending */ #else /* @@ -63,10 +62,9 @@ fast_work_pending: * call. */ ret_fast_syscall: -__ret_fast_syscall: UNWIND(.fnstart ) UNWIND(.cantunwind ) - str r0, [sp, #S_R0 + S_OFF]! @ save returned r0 + add sp, sp, #(S_R0 + S_OFF) #if IS_ENABLED(CONFIG_DEBUG_RSEQ) /* do_rseq_syscall needs interrupts enabled. */ mov r0, sp @ 'regs' @@ -83,7 +81,9 @@ ENDPROC(ret_fast_syscall) #endif =20 tst r1, #_TIF_SYSCALL_WORK - bne __sys_trace_return_nosave + beq slow_work_pending + b ret_to_user + slow_work_pending: mov r0, sp @ 'regs' bl do_work_pending @@ -257,19 +257,15 @@ ENTRY(vector_swi) str scno, [tsk, #TI_ABI_SYSCALL] #endif mov r1, sp @ put regs into r1 - ldr r10, [tsk, #TI_FLAGS] @ check for syscall tracing stmdb sp!, {r4, r5} @ push fifth and sixth args - - tst r10, #_TIF_SYSCALL_WORK @ are we tracing syscalls? - bne __sys_trace - mov r0, tbl - /* r1 already contains regs */ mov r2, scno @ syscall number from r7 - /* We return here no matter what, also pass this as an argument */ - badr lr, __ret_fast_syscall - mov r3, lr - b invoke_syscall + bl invoke_syscall_trace + cmp r0, #0 + beq ret_fast_syscall + /* This path taken when tracing */ + add sp, sp, #(S_R0 + S_OFF) + b ret_to_user =20 #if defined(CONFIG_OABI_COMPAT) || !defined(CONFIG_AEABI) /* @@ -289,20 +285,6 @@ ENTRY(vector_swi) ENDPROC(vector_swi) .ltorg =20 - /* - * This is the really slow path. We're going to be doing - * context switches, and waiting for our parent to respond. - */ -__sys_trace: - add r1, sp, #S_R0 + S_OFF @ pointer to regs - mov r0, tbl - bl invoke_syscall_trace - add sp, sp, #S_OFF @ restore stack pointer - b ret_to_user - -__sys_trace_return_nosave: - b ret_to_user - .macro syscall_table_start, sym .equ __sys_nr, 0 .type \sym, #object @@ -402,25 +384,6 @@ sys_mmap2: b sys_mmap_pgoff ENDPROC(sys_mmap2) =20 -/* - * This call wants: - * r0: syscall table - * r1: regs - * r2: syscall number - * r3: pointer to return function - */ -SYM_TYPED_FUNC_START(invoke_syscall_asm) -#ifdef CONFIG_CPU_SPECTRE - csdb -#endif - mov tbl, r0 - mov scno, r2 - mov lr, r3 @ return address - ldmia r1, {r0 - r3} @ reload r0-r3 - /* Arguments 5 and 6 are (hopefully) on the stack */ - ldr pc, [tbl, scno, lsl #2] @ call sys_* routine -SYM_FUNC_END(invoke_syscall_asm) - /* * This call wants: * r0: syscall table diff --git a/arch/arm/kernel/syscall.c b/arch/arm/kernel/syscall.c index e90f04f35b3485968a1e9046cf0889f56cca92e5..36330023b5484399a4ca2fdb572= 7b410e2c74b6f 100644 --- a/arch/arm/kernel/syscall.c +++ b/arch/arm/kernel/syscall.c @@ -3,50 +3,45 @@ #include #include =20 -int invoke_syscall_asm(void *table, struct pt_regs *regs, int scno, void *= retp); -__ADDRESSABLE(invoke_syscall_asm); - -__visible int invoke_syscall(void *table, struct pt_regs *regs, int scno, = void *retp) +static inline bool has_syscall_work(unsigned long flags) { - if (scno < NR_syscalls) - /* Doing this with return makes sure the stack gets pop:ed */ - return invoke_syscall_asm(table, regs, scno, retp); - - if (scno >=3D __ARM_NR_BASE) - return arm_syscall(scno, regs); - - return sys_ni_syscall(); + return unlikely(flags & _TIF_SYSCALL_WORK); } =20 int invoke_syscall_trace_asm(void *table, struct pt_regs *regs, int scno); __ADDRESSABLE(invoke_syscall_trace_asm); =20 -__visible void invoke_syscall_trace(void *table, struct pt_regs *regs) +__visible int invoke_syscall_trace(void *table, struct pt_regs *regs, int = scno) { - int scno; + unsigned long flags =3D read_thread_flags(); int ret; =20 - scno =3D syscall_trace_enter(regs); - if (scno =3D=3D -1) - goto trace_exit_nosave; + if (has_syscall_work(flags)) { + scno =3D syscall_trace_enter(regs); + if (scno =3D=3D -1) + goto trace_exit_nosave; + } =20 if (scno < NR_syscalls) { ret =3D invoke_syscall_trace_asm(table, regs, scno); - goto trace_exit_save; + goto exit_save; } =20 if (scno >=3D __ARM_NR_BASE) { ret =3D arm_syscall(scno, regs); - goto trace_exit_save; + goto exit_save; } =20 ret =3D sys_ni_syscall(); =20 -trace_exit_save: +exit_save: /* Save return value from syscall */ regs->ARM_r0 =3D ret; + if (!has_syscall_work(flags)) + return 0; =20 trace_exit_nosave: local_irq_enable(); syscall_trace_exit(regs); + return 1; } --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BC94D1F0E56 for ; Sat, 19 Apr 2025 22:36:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102176; cv=none; b=R1tuShSYhnk9kBPLUmkUHE64WxdECRFyZ1Lw9Ri7UZfxZfvwdsTznEjjhgc8S7st1jET4HhppRkuqWHCZFvUFKfI6cDkc4vI3cAwvS8ieUvZR3k2UFBurrYvSz3UF/DQ4nceZIU05MiGtz0ZcSdXxQ6ASE50mjCKI2LItYvRuq8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102176; c=relaxed/simple; bh=WVu6brjsAm8LEoheLO7yeNj/XkBw3giaH9+hopl2TYw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=V+jzzsneT04R2CW72hyqJzersHwONhW8zwFiwI/8yeb6du2MFgBHJ3+EUUI43AXfURnY+TmYVZ7HgbNYJXBtPX6WZuKFcA+JYwgYSaPk2BX/EvD1XciFAxynZ6rnodkFUL1SXoJKtS9nPq53Y6VRElYSf3glQ6wooT+quOMvfo0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=M+D4jPT1; arc=none smtp.client-ip=209.85.167.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="M+D4jPT1" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-54e6788d07eso48281e87.1 for ; Sat, 19 Apr 2025 15:36:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102173; x=1745706973; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=t/0cVDZGMnreZxruSLY2dvzSLDJCCUi+BRk/vmsfPVk=; b=M+D4jPT12tY7vutkuZ1fUlSa97CsJxBtbhAvaf1HR4ZDbJQS9rxPQq+Oq9mzGuOfnJ EwFtweDrxZAsg8/NZ//qN+EVu6F3HliB8nQNFgQfi/bdcCeesiZ3UMlrHMKIyHj6yigU 2wM1Ho7uN9K3PTSU8KWsQ8s6UPKD1iQ8GB/GLxNxlJN2AW8iSJizLoMoOrGXSKL8C3Fn pfhHuGjp/dNRdClRDeNHbSaGBZSuLz22+DOfSYMWnBWbGzRzblOslOfq5aSwR76AbHNg 35xAuKAqSMO8SZlDO+ZWGgTo3DcyUnGX5ja2T/rM7q8+I3LF6NjS4L8SYMQmCEqoOamm XzJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102173; x=1745706973; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=t/0cVDZGMnreZxruSLY2dvzSLDJCCUi+BRk/vmsfPVk=; b=awm1R/ZkGrBTt60Mql3BnQv0s7aedRrpfFqRy+jN/mIGSM3dCmZT0Sh1BHfFxqZB5R A+qBh2q8nricZ7LWHnAbKTCxgKvBjHqUeLnrbIlm32IOyKfA3LbqrrYPZb3mfzK2PIBE l3ZGZaBI7Vg9378uZtz1PAtaDH/yBnmtWQ9qort93E26+JXrS8ZCUBvc4/ClY+Dx7AVa 904BnLTtRe5ay7yoMhujTkLdd/68JBtVKf87bXT/9/5xF95y4tz0NKu77UlFbnXMoQvH o/4qH3ZVReaMbacS6v37FgzFp9KLK97RwM51ZEwYKL3Pk0f1hWQGQnQMdLlv5mAjuUwn 2cbw== X-Forwarded-Encrypted: i=1; AJvYcCVw2y7qWKBdfmcbGcU2jLfu1izrxtn2lZcOw9Gmheyb7X/oJetkhPPOjJtQ/pYNFv+l2m2H+JqP1ui47zE=@vger.kernel.org X-Gm-Message-State: AOJu0YxoXfCeYv9gOuOU5eXF06EcGRmGjTWDTO6We5o4onuoAbD5pLmV ZSWjC9xiWw+MYykhCbtz+J1UnNR6in2x6tHWlbgem+o+kwOZ9na23jSLA2oWKO4= X-Gm-Gg: ASbGnctVg4PBXHGabS4Z8XIV9R1nESUvaQ20zeC70LIw7G3PYcFuGxCdbGYqK2U3qJ5 cvAwEBEoPtUd4vUEOlmT1s+Kh3Bi44ME2tvE2YNA0anZTpAlG2OUFxYtj5bn7J44uCKhrk6vmGI PLJsBAusIioRNubAXL5FXAZXf6bkw/NIAurr1JxMqcOxt0pnHao5H21NxGqJ0/MOpTEX0+Y9zjM WD8qDzmnGBGGHpOSfuhKacfGOWe73DNNeMbqW33zGOOYSWJUdAAY5Sx077C6ILfiIm/bH4QLBay z4VBEVEN4EMpmuVUjXZ4eH3Uw8s/uX/56bFZewYs1deqq2j1sVQ= X-Google-Smtp-Source: AGHT+IH5eyW+1pMgdFapklrs6OWOvrrQJkiCwqKe7oqBFGUg8NWg9+mef9o53f+m66wsGks9TAtwsg== X-Received: by 2002:a05:6512:2c98:b0:54d:69fd:3598 with SMTP id 2adb3069b0e04-54d6dbf59b2mr2418793e87.18.1745102173077; Sat, 19 Apr 2025 15:36:13 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:11 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:35:59 +0200 Subject: [PATCH v6 12/31] ARM: entry: Rename syscall invocation Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-12-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 Now that we do not have a separate trace syscall invocation path, rename the invocation functions to be generic. This can be squashed into the previous patch, it is just done here for the previous patch to be easier to get a cleaner diff and be easier to read. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/syscall.h | 2 +- arch/arm/kernel/entry-common.S | 10 +++++----- arch/arm/kernel/syscall.c | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h index 9c664d8c5718f58034f442c20a030b59faf65dd9..b94fd7ce17f82f0baf06b748002= 45112e1f13002 100644 --- a/arch/arm/include/asm/syscall.h +++ b/arch/arm/include/asm/syscall.h @@ -19,7 +19,7 @@ =20 extern const unsigned long sys_call_table[]; =20 -int invoke_syscall_trace(void *table, struct pt_regs *regs, int scno); +int invoke_syscall(void *table, struct pt_regs *regs, int scno); =20 static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index f0f1f8723965313b287158fb2a238908db72fcd2..f1e48002bd3075ea67b58831785= 83127fa0055c6 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -260,7 +260,7 @@ ENTRY(vector_swi) stmdb sp!, {r4, r5} @ push fifth and sixth args mov r0, tbl mov r2, scno @ syscall number from r7 - bl invoke_syscall_trace + bl invoke_syscall cmp r0, #0 beq ret_fast_syscall /* This path taken when tracing */ @@ -390,7 +390,7 @@ ENDPROC(sys_mmap2) * r1: regs * r2: syscall number */ -SYM_TYPED_FUNC_START(invoke_syscall_trace_asm) +SYM_TYPED_FUNC_START(invoke_syscall_asm) #ifdef CONFIG_CPU_SPECTRE csdb #endif @@ -400,17 +400,17 @@ SYM_TYPED_FUNC_START(invoke_syscall_trace_asm) /* Make space to copy the two syscall stack arguments */ sub sp, sp, #S_OFF mov scno, r2 - badr lr, __invoke_syscall_trace_ret @ return right here + badr lr, __invoke_syscall_ret @ return right here ldmia r1, {r0 - r6} @ reload r0-r6 from regs stmia sp, {r4, r5} @ copy stack arguments ldr pc, [tbl, scno, lsl #2] @ call sys_* routine -__invoke_syscall_trace_ret: +__invoke_syscall_ret: /* Drop the copied stack arguments */ add sp, sp, #S_OFF pop {r4 - r10, lr} ARM( mov pc, lr ) THUMB( bx lr ) -SYM_FUNC_END(invoke_syscall_trace_asm) +SYM_FUNC_END(invoke_syscall_asm) =20 #ifdef CONFIG_OABI_COMPAT =20 diff --git a/arch/arm/kernel/syscall.c b/arch/arm/kernel/syscall.c index 36330023b5484399a4ca2fdb5727b410e2c74b6f..6f518ec3870fb36a64d1b671b20= f96d63a52bf78 100644 --- a/arch/arm/kernel/syscall.c +++ b/arch/arm/kernel/syscall.c @@ -8,10 +8,10 @@ static inline bool has_syscall_work(unsigned long flags) return unlikely(flags & _TIF_SYSCALL_WORK); } =20 -int invoke_syscall_trace_asm(void *table, struct pt_regs *regs, int scno); -__ADDRESSABLE(invoke_syscall_trace_asm); +int invoke_syscall_asm(void *table, struct pt_regs *regs, int scno); +__ADDRESSABLE(invoke_syscall_asm); =20 -__visible int invoke_syscall_trace(void *table, struct pt_regs *regs, int = scno) +__visible int invoke_syscall(void *table, struct pt_regs *regs, int scno) { unsigned long flags =3D read_thread_flags(); int ret; @@ -23,7 +23,7 @@ __visible int invoke_syscall_trace(void *table, struct pt= _regs *regs, int scno) } =20 if (scno < NR_syscalls) { - ret =3D invoke_syscall_trace_asm(table, regs, scno); + ret =3D invoke_syscall_asm(table, regs, scno); goto exit_save; } =20 --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0D8731EF39E for ; Sat, 19 Apr 2025 22:36:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102178; cv=none; b=KHTa+MNDKLhQImr2q0tWmwke4z5dmq1wckLfzSNLnlOpkB2zBbSWIWoHBPMx2+g33gxpEwWSAC94cTFCy/ku7vffI2aqfFyDqhoi+GfMaU5FrfEGFbJce2gB9RlSUnbU+gZlUnbJVuUcdqsCriSC34Br179LG4vAAfUWoNH1G9I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102178; c=relaxed/simple; bh=I2SqRts3VUwyOzoRPfNKAEKVttfPnh16xRR50RNsoSA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=VdEQnyaYg5NShGXR5QoDCpoEfxTCkHaKPlGBUfNPMPgYlWJgOuc5FPjEm9f5Tz8Avg6h80KvRZ3sOYd0Gv0zHJj+aCtrjQGB/Z9DqIo3oz0OU9HWvvAzeCgDbPxW9nirmv5ZKXsGra8s1pih+kLIFZMOiptyJqavvn4D9B4siCY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=hiKL+bb0; arc=none smtp.client-ip=209.85.167.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="hiKL+bb0" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-54b09cb06b0so3088109e87.1 for ; Sat, 19 Apr 2025 15:36:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102174; x=1745706974; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=haBpLM2DDViWHZC+WLr3EUnb76m+EmYlOZpo3tV17aw=; b=hiKL+bb08VMjS7tvLLQFVAJyfNljewIAjw8bUoZBGXODu/m7JKHMmdz0PN0SAugzMW xkFcJPzTZNR327CDDBjhqFRmhAL4AOQEszshQqMRjMlReBN8XMOFAnDu9Kfozdv7P2Qt 080VDVTnrVoF7sJ7p52xolkDmOq7C2qxRMer2nemACOQI2E1AnPYJdO/lT1x5W488Z2o 4EVVkGbPhkVxMJwcO0304f2Z3S7/cvXaEKqP4gnS+IbPs99Dg/7NRTIj3sppUqpEbU7D /rfb4u+YZRlt14/FmHgZ8Tmd+x0L+bY+lEeEGhGNVaBC4sUdYIVolMh4M1dwv0updGGQ +t9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102174; x=1745706974; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=haBpLM2DDViWHZC+WLr3EUnb76m+EmYlOZpo3tV17aw=; b=sFLv+M875JHQs0QGmRUAoAyCOZYXXWdFqFfTlTcyKl8++2QmabCZFM2j/4pQzxxn72 onSvDDdyIchiMfvxY9+SBT6TCX210Y7P6/qGeeVL0araxPb3gmaikknpVYwG5nFmymhu x6GJ5YUWIYGUewNVSXoJsCX3kLWvgYL4joYaFqWJQy+kUU3DVEruAlWtRJ0gSdWlpLi2 ax65xEpRoxYlwYOn8iKR+kPO3b2dIOqzDRAlr09waf06mQqFCX0BYvdaTBLCQuJcPxwg 1MsPFNRKLXS0L91oWHpaDEhz3WcvEVfV67AnfM8owZv7Y6sB4ednejZE1zXqYqG0XMyt X/pw== X-Forwarded-Encrypted: i=1; AJvYcCXGEBv803V5njCX4/oL9uau9M/Hf0u5yRlp9stxZHyFO1eTj4gJ64LK/vYdf9gclDaat/VIiOE0nAPkF5M=@vger.kernel.org X-Gm-Message-State: AOJu0YxememTV/ruHEym2bQyd5zynoCAye4NACZPhvNCWLU87TxRBNOD TqUopAl2WWpl9CaizXMey+wEclOdPaice1EkvM5ONM2oOPqlUQtXmzaqco9cgb0= X-Gm-Gg: ASbGncsbvf8hET+0L7SdxIKXvgJV11YwztUjdI0w8d1NySGuag5sO1G7PpKJZdBB0hq SvqzB+QJEdUkumk3NUssgsydFKRciZXYGkoTTmMsmNQwFzoSf65q1KUwNWiv3oFkSN8LEEbBhF/ qvv8hxDq2QjE7190K8N1a/6rNIpvxmwoPGdzFN0uSTRtxco1kWQHlq3RfLvyDfqcZQnwoWUkAGF Tc1nIpYZ9esGy9jEmcS3sBWxB+Nor6PaM507ptJ7KoxbYaE5EQLbEuMKDX/gf5+B5jkSljUgvIV it4EaGBBJPN+hhDJBHOA+rs43StUG5YR5ZPD/tKpaRE1yEJtuj0= X-Google-Smtp-Source: AGHT+IGVYEfxzTi9voc5pCztNpyTSQ7pQu8il04+sUvFiXGiIYsFbJz8etUwlaq/dGEklq0WmoUWOg== X-Received: by 2002:a05:6512:12d4:b0:54b:117c:a3b7 with SMTP id 2adb3069b0e04-54d6e66da7amr1884687e87.57.1745102174033; Sat, 19 Apr 2025 15:36:14 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:13 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:00 +0200 Subject: [PATCH v6 13/31] ARM: entry: Create user_mode_enter/exit Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-13-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The callbacks to the context tracking will be repurposed for several uses that are needed on the IRQ transition to/from userspace. Rename the macro, establish call sites in C calling into the context tracking following the corresponding generic entry function prototypes, despite the assembly macro names become a bit long this makes it clear to readers exactly what is going on and where this call will go. Drop the ifdefs pertaining to context tracking from the macro. The C calls we will use have stubs that will compile these out anyway. The inversion of the signature of the context tracking calls are especially confusing since the generic entry uses the reverse semantics: *enter from* user mode (to kernel mode) and *exit to* user mode (from kernel mode) instead of the other way around as the old context tracker code user_exit_callable() and user_enter_callable() which have inverted semantics. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/entry.h | 14 ++++++++++++++ arch/arm/kernel/Makefile | 2 +- arch/arm/kernel/entry-armv.S | 2 +- arch/arm/kernel/entry-common.S | 4 ++-- arch/arm/kernel/entry-header.S | 24 ++++++++++++------------ arch/arm/kernel/entry.c | 15 +++++++++++++++ 6 files changed, 45 insertions(+), 16 deletions(-) diff --git a/arch/arm/include/asm/entry.h b/arch/arm/include/asm/entry.h new file mode 100644 index 0000000000000000000000000000000000000000..e26f369375ca3cf762f92fb4996= 57a666b223ca2 --- /dev/null +++ b/arch/arm/include/asm/entry.h @@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __ASM_ENTRY_H__ +#define __ASM_ENTRY_H__ + +struct pt_regs; + +/* + * These are copies of generic entry headers so we can transition + * to generic entry once they are semantically equivalent. + */ +void irqentry_enter_from_user_mode(struct pt_regs *regs); +void irqentry_exit_to_user_mode(struct pt_regs *regs); + +#endif /* __ASM_ENTRY_H__ */ diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index 69ddf51081f4791982518d37df60c11211b8955a..dd45c6eb8cbdd2595edc4f26026= c12b25dd49717 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -17,7 +17,7 @@ CFLAGS_REMOVE_return_address.o =3D -pg =20 # Object file lists. =20 -obj-y :=3D elf.o entry-common.o irq.o opcodes.o \ +obj-y :=3D elf.o entry.o entry-common.o irq.o opcodes.o \ process.o ptrace.o reboot.o io.o \ setup.o signal.o sigreturn_codes.o \ stacktrace.o sys_arm.o time.o traps.o \ diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index ef6a657c8d130663e68acd07226815ce8a3fff7d..93a37437a9520118eff411f009e= 8f6bd729412fc 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -406,7 +406,7 @@ ENDPROC(__fiq_abt) #ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_off #endif - ct_user_exit save =3D 0 + asm_irqentry_enter_from_user_mode save =3D 0 .endif .endm =20 diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index f1e48002bd3075ea67b5883178583127fa0055c6..ff1dd3169346f3770cad6b7e218= f5d74ffc646fe 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -111,7 +111,7 @@ ENTRY(ret_to_user_from_irq) no_work_pending: asm_trace_hardirqs_on save =3D 0 =20 - ct_user_enter save =3D 0 + asm_irqentry_exit_to_user_mode save =3D 0 =20 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase_on_task_stack @@ -191,7 +191,7 @@ ENTRY(vector_swi) alignment_trap r10, ip, cr_alignment asm_trace_hardirqs_on save=3D0 enable_irq_notrace - ct_user_exit save=3D0 + asm_irqentry_enter_from_user_mode save =3D 0 =20 /* * Get the system call number. diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 52b4fa97226dbfa4b55aca8eaf74ae24e1e220f8..fb5bb019199b2871e29e306a29b= ea8fdf47dd7f3 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -362,31 +362,31 @@ ALT_UP_B(.L1_\@) .endm =20 /* - * Context tracking subsystem. Used to instrument transitions + * Context tracking and other mode transitions. Used to instrument transit= ions * between user and kernel mode. - */ - .macro ct_user_exit, save =3D 1 -#ifdef CONFIG_CONTEXT_TRACKING_USER +*/ + .macro asm_irqentry_enter_from_user_mode, save =3D 1 .if \save stmdb sp!, {r0-r3, ip, lr} - bl user_exit_callable + mov r0, sp @ regs + bl irqentry_enter_from_user_mode ldmia sp!, {r0-r3, ip, lr} .else - bl user_exit_callable + mov r0, sp @ regs + bl irqentry_enter_from_user_mode .endif -#endif .endm =20 - .macro ct_user_enter, save =3D 1 -#ifdef CONFIG_CONTEXT_TRACKING_USER + .macro asm_irqentry_exit_to_user_mode, save =3D 1 .if \save stmdb sp!, {r0-r3, ip, lr} - bl user_enter_callable + mov r0, sp @ regs + bl irqentry_exit_to_user_mode ldmia sp!, {r0-r3, ip, lr} .else - bl user_enter_callable + mov r0, sp @ regs + bl irqentry_exit_to_user_mode .endif -#endif .endm =20 /* diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c new file mode 100644 index 0000000000000000000000000000000000000000..8b2e8ea66c1376759d6c0c14aad= 8728895b3ff1e --- /dev/null +++ b/arch/arm/kernel/entry.c @@ -0,0 +1,15 @@ +// SPDX-License-Identifier: GPL-2.0 +#include +#include + +noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs) +{ + /* This context tracking call has inverse naming */ + user_exit_callable(); +} + +noinstr void irqentry_exit_to_user_mode(struct pt_regs *regs) +{ + /* This context tracking call has inverse naming */ + user_enter_callable(); +} --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1DA191EB5FF for ; Sat, 19 Apr 2025 22:36:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102179; cv=none; b=rf2gaFbTknHmN8MQmKsqFpN0S/m1dxdQ8xsnpEUkgs0dNMAUOcXTgJ5X35VqYvu9jTfQxbp7VOJrlSZFa2OPtjT9m990S1d0PWgHDFqkPmD3tKEkCIqPYlMGqT20Cwxf2rl8oo2G7FmpfFcbel36+l/0UwiW+/DtQmPRwlwnCjc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102179; c=relaxed/simple; bh=Ux9KdL8Xwrhk8Nc9+cZ/O2L+pGIkK2cv5JJYwyFc3I8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Wwv+oijulCa+O9GD+C5ZASXDQk2c6lGMkcGZGAbQS3pFswnUfaCqo7PbRlEmgw5ZBjGQ5V3rwwqH7Du/jhBmP5zzxlpFd1KZN2YouYIAGCBCTuFxkQy8OreiCsGGxQudipXj4Y/lig2ShPcm3MsHnr7cDXrXZesUvo4KNrAB6Ck= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=QCWbEqFU; arc=none smtp.client-ip=209.85.167.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="QCWbEqFU" Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-54b166fa41bso3305264e87.0 for ; Sat, 19 Apr 2025 15:36:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102175; x=1745706975; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=S06JQqVlFUu5YQR6B7LpPsHspKKb3zlQ4EOB8DFSLhc=; b=QCWbEqFUTVOtlWu8n1JYxQH4CqVeSpGB29RxiQ1zHzlhiP7wFoeS4T3dm6hdoM5Iz7 VGDAyKFN+BmTN66lyO8GYMzQ83+hYk/nJw3lQEXAFfkL3/19ot4Ga6/i+PaO1/PX5hW7 i3e8nkT/QiiGlCUw+JWa4yvJw+XsBC+2PPzc1Nr/ip+Eqp1TLh8ueasfRKU1aQKIbNbz B1MMZmutrQH+BxIMv/SAJIfu7Ca8KoeywL3K0itsx0WEuCMP4ezHb/S0/qH8e0hz6DXY sA0SHdB25pVyUYVgmTqLEVAy4uiw1WOH9//ngyeUYTn65iPtnGIH562fM6RO85sJy6EM pp3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102175; x=1745706975; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=S06JQqVlFUu5YQR6B7LpPsHspKKb3zlQ4EOB8DFSLhc=; b=kFMpj1L3vnmTggAlh4WYecNBGx2+rzHrm7b/tNiFxGzTHs6TV/m0HQYvyr/Ghzcyr9 qVfqd0jZQby0uGPcc1ZvkuXGuw2BlbXTUKV1STcuXf8YxEOfOXkqp1gkhXS64FMHq0ry zbcbh2F9z+sglf89gkqK51GP0rvqShHQ+o2qPSFAes8l0vUkIde4/kyX8hPSARorKWkN n9Prhe0gZSjxc8vjugbS2WiP9m07qf/UYxPOJSyCyPDHJS/0QYtaTUhO9O55n0OYmnRF H7UC2jNamMwf7O7WZEaua0vbhcKTQ0R3gHQPQOF0R9KAHMc9SwlBvOjs+LHAnTz7tdpC ndFA== X-Forwarded-Encrypted: i=1; AJvYcCUcApgLmDEe9RWyvnKva9d/lsE1/CJbt+ics7Vl1Tw8zsap8VLbcoJL6eqmluFtCaOfgHkBIBGHTP9PKeQ=@vger.kernel.org X-Gm-Message-State: AOJu0Ywh0Q5a6ON7xLpRvarQXyIKia4dULotDBQxV31hM3rUF+fbOiu+ +biHX7jvQ2/OGNMmKkoUz0a4Y9c1nCXJ9NJKRiT3+g3wQoi3N6yRfxiwo/tJ4vI= X-Gm-Gg: ASbGnct9B7sO3IyudBUnQH6WZOF9hv269yfVfjC8GU1IbelNLel8TzhqHfvFIMhPN3D eFtveGFHhxZporC43EhCokzHN8ROypn2+C/D74K8aXlSbYcgZf0+wfaGj1/UMvZ7LCRwjaqAQuA wkpkB7/x78hfqB9V3kVwEHCoELT1p7Cfe287Q/w4gezlLlr+ScUqLmBlC1roX7uHaxb0ZmQ5xen r4zP1vh8YacbUjbC8a5cBYe+sc/kkrMrsm8jm1AMSVCy5Wr0o+WstwbcSdQ8oYTXQtY5gpSvkQm nCTlnpcfXMm+C9mdQU2oh2IlIWUH9LG24CgEKxmRCrJFGrXpAJY= X-Google-Smtp-Source: AGHT+IGrGpnN8/tEv6ndwbb/jlIR6Kig9UXaFiAlwtupFJWaEj/+/pWLTfpATpASNAxUxjR0OdE0lA== X-Received: by 2002:a05:6512:3d8f:b0:54b:f10:fe46 with SMTP id 2adb3069b0e04-54d6e633c8cmr1668429e87.25.1745102175072; Sat, 19 Apr 2025 15:36:15 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:14 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:01 +0200 Subject: [PATCH v6 14/31] ARM: entry: Drop trace argument from usr_entry macro Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-14-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The trace argument select whether to look into tracing of the hardirqs for the exceptions from userspace, but also selects whether to call further down to establish context for RCU. Split off a second macro that is called on everything except the FIQ since this is the only outlier. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-armv.S | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 93a37437a9520118eff411f009e8f6bd729412fc..c71110126fc105fc6ac2d6cb0f5= f399b4c8b1548 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -357,7 +357,7 @@ ENDPROC(__fiq_abt) #error "sizeof(struct pt_regs) must be a multiple of 8" #endif =20 - .macro usr_entry, trace=3D1, uaccess=3D1 + .macro usr_entry, uaccess=3D1 UNWIND(.fnstart ) UNWIND(.cantunwind ) @ don't unwind the user space sub sp, sp, #PT_REGS_SIZE @@ -401,13 +401,14 @@ ENDPROC(__fiq_abt) @ Clear FP to mark the first stack frame @ zero_fp + .endm =20 - .if \trace + /* Called after usr_entry for everything except FIQ */ + .macro usr_entry_enter #ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_off #endif asm_irqentry_enter_from_user_mode save =3D 0 - .endif .endm =20 .macro kuser_cmpxchg_check @@ -429,6 +430,7 @@ ENDPROC(__fiq_abt) .align 5 __dabt_usr: usr_entry uaccess=3D0 + usr_entry_enter kuser_cmpxchg_check mov r2, sp dabt_helper @@ -439,6 +441,7 @@ ENDPROC(__dabt_usr) .align 5 __irq_usr: usr_entry + usr_entry_enter kuser_cmpxchg_check irq_handler from_user=3D1 get_thread_info tsk @@ -452,6 +455,7 @@ ENDPROC(__irq_usr) .align 5 __und_usr: usr_entry uaccess=3D0 + usr_entry_enter =20 @ IRQs must be enabled before attempting to read the instruction from @ user space since that could cause a page/translation fault if the @@ -476,6 +480,7 @@ ENDPROC(__und_usr) .align 5 __pabt_usr: usr_entry + usr_entry_enter mov r2, sp @ regs pabt_helper UNWIND(.fnend ) @@ -495,7 +500,7 @@ ENDPROC(ret_from_exception) =20 .align 5 __fiq_usr: - usr_entry trace=3D0 + usr_entry kuser_cmpxchg_check mov r0, sp @ struct pt_regs *regs bl handle_fiq_as_nmi --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 89F0A1F2BB5 for ; Sat, 19 Apr 2025 22:36:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102180; cv=none; b=p43EoWHbhVhLhknMJHPYSNg4QRfa6XDkpcm/XE+2wjOrbT/lSei8XLUySf0OfT52kJRsF8BG0BjWYB9ECKIX5sJhx1EkHxwM2XdLdwj8aNXBYD/M3eZkPFCjvXbKeq7fi30kST5oJDMyceLQgRjwuGBaWKy2qoh1d36j4fOBBQ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102180; c=relaxed/simple; bh=FyZXezqL6vkR8+BWgQalAs22Lv7NiD2jVZxUqBmL5t4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=a9eFetGH5/JU5QJqr28woQYilqubD9Rz/YWimECZjUEqD5L6g0OmxM7lJ+iyWd4zI61Gao3EzgcL7WmxskXCZjer/cCM/4bgh+OuS0H5fsrsR7OysKwroiZcVUgq0REsbuJuODSbugQdOyhBFZO9B818QS7MaQId4VzpDlobEMY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=XHHamdI9; arc=none smtp.client-ip=209.85.208.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="XHHamdI9" Received: by mail-lj1-f182.google.com with SMTP id 38308e7fff4ca-30bee278c2aso41053861fa.0 for ; Sat, 19 Apr 2025 15:36:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102176; x=1745706976; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=axbUMXtD4QAuEbBzGSN5WvaY4ne+9NQW3YHW/FPa3uk=; b=XHHamdI9rIDEHJv1YfOrElbLIngwmHm+DVcQAGGdUI9/kENOLutuoYHodaqdu3c908 YxgZLoGT0jnKkEMIK5vU453gZlZX7mCfrTVf/gyLzU2SU/bp7VPtzR7OJK9QF8cCxYQa 2gaMlGI5V8IYNGG3eouAr+E1F1qq2hxTTeaziJpRHDpPLC48uQdtuOvhF7zoY6dDKkv/ m1eLSgg7laacgwhKx6Rkr2xZVSsl7cXtIRSvCvavII46yhIi5TI4hWApPjYfoCvaZieu dQTxTy2FwheYcPNHrq+4WsTP+NC+nU+aWI4X7zf9W5ip6D2y7Nl4l06SEplxsC1chfyV RJ6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102176; x=1745706976; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=axbUMXtD4QAuEbBzGSN5WvaY4ne+9NQW3YHW/FPa3uk=; b=Gqe2RNmNH7BnIpBhRK2ZlPONOd7y7edwdKbNQraYnYBn1cbX95YnbeXLidPBuTolsz m295ql8TUn4c5X7lM3dB4q1YO5MLzvl3SyXpHdas2+arJbSEE7AZqRxVswmzJry5Wq+q wORkM2M9++F9Xy2lLabxHKOboTvh/gzCMdk8/A5nbO6H0oGtmPYU1eEY+R3zJ7xl4MWQ UXrGngteSjiNmId9Bg4CpuEDpslxP+PZK3PFh2bAL8mybBWCdgOOq4gR3lU5leJfTHLJ ao+TWs+jDDgQAAAGPreAVJruVi75aZx8S1zQzZHhHh5e79yh9BSnuRAZid55+CfWnwHn UmEg== X-Forwarded-Encrypted: i=1; AJvYcCXq2cCUAYYvM1cvsstTCDuso9glXrpzylV3MYzqVDt/+OQO5j/CHtpHrW85QQi7IzAwqb3/YsytM6EvwIk=@vger.kernel.org X-Gm-Message-State: AOJu0Yy43ef9YalNw6RLd7uikDVRK2bNlewM78oWSTRJNkU3MEwzla9r +yFxssHY33dYbxBVjNg7f0bxZyfc/V5wFn8TPfcfOVFGj2GctYL4Kp/R237nvJU= X-Gm-Gg: ASbGncsKfq4HuxCaTm/zTmxcWrdqJCKteoe8d329iE7SnruxTzshPzYFIiI81rwB6J2 aDxvvqv6QksCIbAl+VKnlqqnfhDV4k50yCPaK/rks8QlRDWdUDpLsB25y923L01WGqxrXSo4xqd lBHcNfkuX7m+sPz6n0sdrlwR2EnE+TL3dQ1pyxP2/O+nJRxfke3AAzkVu5q+H0E4nBp6vxTf5rH AvUMVmDNc61g8HKt0HMr7SJrzlpP4SQMoouh2crsmluFrxTFSLe9C0Q7VhYNR6q6ZylKfKg2jD0 OJZQjw8eC0V4Wc4U2mzE8xKNoSsAnKgm0wnoxAJDeIBSIS75Bpc= X-Google-Smtp-Source: AGHT+IG/IKcgsDHej1eYc5hp+IWsKO7tK5TWYYLushLhkgbkqkm1Az+iUjNzyiAjE2ntG62MjJUEuA== X-Received: by 2002:ac2:5683:0:b0:549:981a:1eeb with SMTP id 2adb3069b0e04-54d6dbbdbd0mr2520131e87.5.1745102176568; Sat, 19 Apr 2025 15:36:16 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:15 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:02 +0200 Subject: [PATCH v6 15/31] ARM: entry: Separate call path for syscall SWI entry Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-15-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The syscalls (SWIs, software interrupts) are deviating from how any other interrupts are handled as they enable the IRQs again while processing the syscall, while "hard" IRQs disable all interrupts until they are handled. Break out syscall_enter_from_user_mode() into its own function and call it instead of irqentry_enter_from_user_mode(). As we are moving toward generic entry, we use the signature from the generic function. As the generic function requires the syscall number to be determined, we move the call down below the code that figures out the syscall number, the only practical effect should be that interrupts are re-enabled a few instructions later. As we move the trace_hardirqs_on/off() calls into C, we can just get rid of the helper macro usr_entry_enter again and call asm_irqentry_enter_from_user_mode directly. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/entry.h | 1 + arch/arm/kernel/entry-armv.S | 16 ++++------------ arch/arm/kernel/entry-common.S | 18 +++++++++++++----- arch/arm/kernel/entry.c | 14 ++++++++++++++ 4 files changed, 32 insertions(+), 17 deletions(-) diff --git a/arch/arm/include/asm/entry.h b/arch/arm/include/asm/entry.h index e26f369375ca3cf762f92fb499657a666b223ca2..e259b074caef75c7f777b181996= 23f07bebee5b4 100644 --- a/arch/arm/include/asm/entry.h +++ b/arch/arm/include/asm/entry.h @@ -8,6 +8,7 @@ struct pt_regs; * These are copies of generic entry headers so we can transition * to generic entry once they are semantically equivalent. */ +long syscall_enter_from_user_mode(struct pt_regs *regs, long); void irqentry_enter_from_user_mode(struct pt_regs *regs); void irqentry_exit_to_user_mode(struct pt_regs *regs); =20 diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index c71110126fc105fc6ac2d6cb0f5f399b4c8b1548..6edf362ab1e1035dafebf6fb7c5= 5db71462c1eae 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -403,14 +403,6 @@ ENDPROC(__fiq_abt) zero_fp .endm =20 - /* Called after usr_entry for everything except FIQ */ - .macro usr_entry_enter -#ifdef CONFIG_TRACE_IRQFLAGS - bl trace_hardirqs_off -#endif - asm_irqentry_enter_from_user_mode save =3D 0 - .endm - .macro kuser_cmpxchg_check #if !defined(CONFIG_CPU_32v6K) && defined(CONFIG_KUSER_HELPERS) #ifndef CONFIG_MMU @@ -430,7 +422,7 @@ ENDPROC(__fiq_abt) .align 5 __dabt_usr: usr_entry uaccess=3D0 - usr_entry_enter + asm_irqentry_enter_from_user_mode save =3D 0 kuser_cmpxchg_check mov r2, sp dabt_helper @@ -441,7 +433,7 @@ ENDPROC(__dabt_usr) .align 5 __irq_usr: usr_entry - usr_entry_enter + asm_irqentry_enter_from_user_mode save =3D 0 kuser_cmpxchg_check irq_handler from_user=3D1 get_thread_info tsk @@ -455,7 +447,7 @@ ENDPROC(__irq_usr) .align 5 __und_usr: usr_entry uaccess=3D0 - usr_entry_enter + asm_irqentry_enter_from_user_mode save =3D 0 =20 @ IRQs must be enabled before attempting to read the instruction from @ user space since that could cause a page/translation fault if the @@ -480,7 +472,7 @@ ENDPROC(__und_usr) .align 5 __pabt_usr: usr_entry - usr_entry_enter + asm_irqentry_enter_from_user_mode save =3D 0 mov r2, sp @ regs pabt_helper UNWIND(.fnend ) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index ff1dd3169346f3770cad6b7e218f5d74ffc646fe..14b2495cae3c2f95b0dfecd849b= 4e16ec143dbe9 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -109,8 +109,6 @@ ENTRY(ret_to_user_from_irq) movs r1, r1, lsl #16 bne slow_work_pending no_work_pending: - asm_trace_hardirqs_on save =3D 0 - asm_irqentry_exit_to_user_mode save =3D 0 =20 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK @@ -189,9 +187,6 @@ ENTRY(vector_swi) reload_current r10, ip zero_fp alignment_trap r10, ip, cr_alignment - asm_trace_hardirqs_on save=3D0 - enable_irq_notrace - asm_irqentry_enter_from_user_mode save =3D 0 =20 /* * Get the system call number. @@ -256,6 +251,19 @@ ENTRY(vector_swi) #else str scno, [tsk, #TI_ABI_SYSCALL] #endif + + /* + * Calling out to C to be careful to save and restore registers. + * This call could modify the syscall number. scno is r7 so we + * do not save and restore r7. + */ + mov r0, sp @ regs + mov r1, scno + push {r4 - r6, r8 - r10, lr} + bl syscall_enter_from_user_mode + pop {r4 - r6, r8 - r10, lr} + mov scno, r0 + mov r1, sp @ put regs into r1 stmdb sp!, {r4, r5} @ push fifth and sixth args mov r0, tbl diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 8b2e8ea66c1376759d6c0c14aad8728895b3ff1e..1973947c7ad753fccd694b3ef33= 4fba1326f58b6 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -1,15 +1,29 @@ // SPDX-License-Identifier: GPL-2.0 #include #include +#include + +long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall) +{ + trace_hardirqs_on(); + local_irq_enable(); + /* This context tracking call has inverse naming */ + user_exit_callable(); + + /* This will optionally be modified later */ + return syscall; +} =20 noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs) { + trace_hardirqs_off(); /* This context tracking call has inverse naming */ user_exit_callable(); } =20 noinstr void irqentry_exit_to_user_mode(struct pt_regs *regs) { + trace_hardirqs_on(); /* This context tracking call has inverse naming */ user_enter_callable(); } --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 04B321F2B85 for ; Sat, 19 Apr 2025 22:36:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102182; cv=none; b=sfExNzHFlyuqtlEgxy4PWd4p7A5Es63pVh/gFHLRE9dmWKD7nvfOrqozswONHm1iJuo+9ie/GXI4AiYDVOy3Mh3uOLgDe6aZUMLeh638/u4Hlx401twxHw/Ff5corhy+LP6oSzjSo3r+uzoIP6DL5VPDxEUBZ8FuU4OXj7MarhI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102182; c=relaxed/simple; bh=zr0CcD5C0UUiD02F3/fRpPP+MUf3gA7MAaEq74iaGUQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ggerBkJG8t9cIo/vi1K3PLdjZkNJ2ZmNArQ9kU6fS8f+B0xCoF6VtvWpEiqG+SmacPk4ELufKj72Ucb7JKE3e115ykPvtF4qfptZLsEE2FDjQZ1kMwZ8gk74BckuPhB+I34I4uROoyxtVnd0x/chouDccQyBVDSfnLJ9Y8J0yvk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=zWFqVH+S; arc=none smtp.client-ip=209.85.167.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="zWFqVH+S" Received: by mail-lf1-f42.google.com with SMTP id 2adb3069b0e04-5499659e669so3151393e87.3 for ; Sat, 19 Apr 2025 15:36:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102178; x=1745706978; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Cx+9sB1KcBfjXfw9YO0MHYbVgVBIoUFxRPysD28QEy4=; b=zWFqVH+Sz4Yqs5PoMEF+ab4SbrV2Okdof+Fj348EuNpNSqr5gW3amuOPqIyX4TekyW oal35Fzqre4OhJA4fOj4KBnPdNZsff2Rcx8+jcUJtJWK1Eq2MUSFJeqxOzogqCmPkNp0 YiSOnOMbHkxIy/CM4sPaClokRrBmotZJrPJieDmPv3WQsZ1LGz1wNZ6LtP8NnADR/vQG k1cfwjvft5+68tqYt5FUzIbpLSKAVAcu5U1PZh/WT/+c/C7QDeTolkjXerB0UwPHvFWg /Mh8LUIzMu3SZs3FnJWe319nS5bD2/ovRsYBcxR2P+ACPQZ6ACsLIvSiO1aE0YefB3oR IUYw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102178; x=1745706978; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Cx+9sB1KcBfjXfw9YO0MHYbVgVBIoUFxRPysD28QEy4=; b=Lxx4RQeZWQyPJtXApPWwe7cKN0/LvzCtvjz1rn7sQIF/Pr4IYpGESJWLooy5isjO7E xEVmFRUFfwbt87P6YTtqszBtVx9BBr9nYcewe6XeDUX5FGv4QFsF3uf5UNJ0s1GlLtVZ 85F/mj35tkLpFCYtY/sdsi6dG4BzZMMDa9Jk1atd5LkOoAieofgsB+tMED+MJR4rTBhT +9XbNVa/FnuIqP/tKFQIhGcMTicXdN7hCiA/bj2PcQzq0+jqvciRrsDI28rQ9QOaI5Jk KtfLtlaBzlho8sggbb6+wPo4VO+60uI1E4h2S/DT+oG7nYuKAb4gOVHE1+2o5qhPhkDu 47CA== X-Forwarded-Encrypted: i=1; AJvYcCUPxDqg8F/EM5IUlncN1POheN70/q7Mu/ZYNiEUWglNmBgR94/oVRNCY+ECiE8CL61bCxqT00a2M8GdgOo=@vger.kernel.org X-Gm-Message-State: AOJu0YxsR4A+auSGemQQey4i8jZnw+82UYjthPfNJPxPDHogizQm+7s1 fgPW6G2zOcTL+swqhpzk1lQGD6TScjw9UDnLogSvwLofxjlPJ9kfpfP0FuaCXxU= X-Gm-Gg: ASbGncu7bZBqHJBonwtAiAxYBLoNh34u+mqIaCooqjEE5WIQOoJo+08KecVN/5RL5Lg N7++rFg65VL4Oo8cpqxNa1eTGXgNEQdxvGoigpCm9sE74ekH4P0hviHlKNv5kIl1egln1FNx1GV jl3TB3h6ajvYtDCoJa0fCLfqylSs8lBybB6kq1JNo6kdJZ4+oi2rNJMz3v1NtfAHSp4PgWjzEuR rrZCe0CyMq2sYH1nX9TbFaOQ66Zvzyu7G7/DZDfr3F7QT4fYO4zrv9n1OzbbC7XYMGb10H+iz/T Dc4sWXJBi6DMAC8lb4w+6yZYMYSfH9gFQI3G/i3V0TQ8kTCFaKM= X-Google-Smtp-Source: AGHT+IEVMKYD0E4jGirYdTdJ4UFmci4roeaF66kGKgMlacyKSm/VZhP9xKOdtongxwYEh++1VrWQXw== X-Received: by 2002:a05:6512:2309:b0:549:8f49:3414 with SMTP id 2adb3069b0e04-54d6e61dcc1mr1908146e87.6.1745102178019; Sat, 19 Apr 2025 15:36:18 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:17 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:03 +0200 Subject: [PATCH v6 16/31] ARM: entry: Drop argument to asm_irqentry macros Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-16-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 asm_irqentry_enter_from_user_mode and asm_irqentry_exit_to_user_mode have a "save" argument that will save and restore registers before the call to the C function. Now all invocations set this argument to 0 so drop the surplus code. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-armv.S | 8 ++++---- arch/arm/kernel/entry-common.S | 2 +- arch/arm/kernel/entry-header.S | 18 ++---------------- 3 files changed, 7 insertions(+), 21 deletions(-) diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 6edf362ab1e1035dafebf6fb7c55db71462c1eae..460aa92c3c1f50de905550acf36= 3c58f509bfe0a 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -422,7 +422,7 @@ ENDPROC(__fiq_abt) .align 5 __dabt_usr: usr_entry uaccess=3D0 - asm_irqentry_enter_from_user_mode save =3D 0 + asm_irqentry_enter_from_user_mode kuser_cmpxchg_check mov r2, sp dabt_helper @@ -433,7 +433,7 @@ ENDPROC(__dabt_usr) .align 5 __irq_usr: usr_entry - asm_irqentry_enter_from_user_mode save =3D 0 + asm_irqentry_enter_from_user_mode kuser_cmpxchg_check irq_handler from_user=3D1 get_thread_info tsk @@ -447,7 +447,7 @@ ENDPROC(__irq_usr) .align 5 __und_usr: usr_entry uaccess=3D0 - asm_irqentry_enter_from_user_mode save =3D 0 + asm_irqentry_enter_from_user_mode =20 @ IRQs must be enabled before attempting to read the instruction from @ user space since that could cause a page/translation fault if the @@ -472,7 +472,7 @@ ENDPROC(__und_usr) .align 5 __pabt_usr: usr_entry - asm_irqentry_enter_from_user_mode save =3D 0 + asm_irqentry_enter_from_user_mode mov r2, sp @ regs pabt_helper UNWIND(.fnend ) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 14b2495cae3c2f95b0dfecd849b4e16ec143dbe9..df564388905ee019cd5553f8b37= e678da59e3222 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -109,7 +109,7 @@ ENTRY(ret_to_user_from_irq) movs r1, r1, lsl #16 bne slow_work_pending no_work_pending: - asm_irqentry_exit_to_user_mode save =3D 0 + asm_irqentry_exit_to_user_mode =20 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase_on_task_stack diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index fb5bb019199b2871e29e306a29bea8fdf47dd7f3..50c0b55adc7421e7be123c9d00f= 94b1ebb93ff9e 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -365,28 +365,14 @@ ALT_UP_B(.L1_\@) * Context tracking and other mode transitions. Used to instrument transit= ions * between user and kernel mode. */ - .macro asm_irqentry_enter_from_user_mode, save =3D 1 - .if \save - stmdb sp!, {r0-r3, ip, lr} + .macro asm_irqentry_enter_from_user_mode mov r0, sp @ regs bl irqentry_enter_from_user_mode - ldmia sp!, {r0-r3, ip, lr} - .else - mov r0, sp @ regs - bl irqentry_enter_from_user_mode - .endif .endm =20 - .macro asm_irqentry_exit_to_user_mode, save =3D 1 - .if \save - stmdb sp!, {r0-r3, ip, lr} + .macro asm_irqentry_exit_to_user_mode mov r0, sp @ regs bl irqentry_exit_to_user_mode - ldmia sp!, {r0-r3, ip, lr} - .else - mov r0, sp @ regs - bl irqentry_exit_to_user_mode - .endif .endm =20 /* --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EE71A1FC7D2 for ; Sat, 19 Apr 2025 22:36:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102182; cv=none; b=XEpJG/R0KknHGCGwm/hepNa0ryTqL8STAdE94s7JJDOduMJIzMcC5zgpK60BbINzITi+sTwJR5ujZ0Y5evoEKPp3QYeyqP5RcymmYSqfmjF7lx4e1YFsl0Z3txRk5KHp6fQV+a/lnKbWT5LSCCDGpYG3MCpQmmUBzCnsG10pMPo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102182; c=relaxed/simple; bh=W4q2zOUElPxjHDV+c348EedF0ypLBZNLFgL+7Zyhgr4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rCnzIanHIYq/lCocnJSSVIuSUf93yS3G+PU5TXL+Wk7dA43MPz4wmi+5wSUTirU1JNZz4E0LP9diHGHT3YfZZaBL0sKQzYuFnw1+ftFbu+wD7FL8Vvh8fPLtTS3vTk1OH8zFyphLlj+FEKxkLo0YDkXjyut01K0GoHjqCF+hK38= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=ClB+SUKW; arc=none smtp.client-ip=209.85.167.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="ClB+SUKW" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-54c090fc7adso3177065e87.2 for ; Sat, 19 Apr 2025 15:36:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102179; x=1745706979; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=R7+Tt2ojtTtBptuYKtkf/giwQP7CrCvyuDJQU12zbcM=; b=ClB+SUKWBXRThuP36cu9efZ1o9lFQ34i2aGYjAx0z6mV11cr/E8GHwGslJXXij93pp RZxplEfKIuttvJx2CSJndpS3tioM9rHDSwvne4q/qNkFLjE3x5XpVOZ7PmlNOKA8KZHk tRFK54gAG/aHPXwG+hUC9Q7VZmk15WkgFiaXr67sTAc+o/GVED/8XhMTiXHTYUyWo8jM JMNBYHNxmBKFqDLrCLCASf9tbheOfBnUncUi7wdKN//OrTBmekHAuhTYqqV9oMLBrlh4 UQxbQq/zvocKgm7ff5cmv9HqPCfuHkxUqbV5bWaZb+JiO9e9jvo9K4MbPdIvQy48jbkm BW+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102179; x=1745706979; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=R7+Tt2ojtTtBptuYKtkf/giwQP7CrCvyuDJQU12zbcM=; b=FOfKW/QvSUralnAHouSfU6htzdCnidp+7KK1V1WrTMbfTrsF7G4SdxUBgnRpyNCo9P WFkKY+w9szSPnBaF7anMaQxulF/6XpHyRnb/gWBn+zEWTlsfkqWCETtQo4mpLJUYLw4B nSGvAZjVHhDTy4sKqAkMR30HtfhxNETgdrPL3l9L0Ul4LdUHMulD4V2nw4KBb0Ag44Nt i5zs1aH9h66+06SnTuJiMlwJOh6cBBIBxnDamXr4PUyow67kQtb/PmM8WAV4EMzcPiCD npG7ogq2/WcRoIXOWEPxWX94TrZOUQX86v6iKK2dDVMBIQZ3zXKLb+SifDIyIjf53SMb raXA== X-Forwarded-Encrypted: i=1; AJvYcCXZiejsoGG6xd5JvecPYElcYej9A2qeLhEsZVTUc1OYvXG2FdDMQwdOjQOg4OF912FHBTvRC83J4Bx2dvw=@vger.kernel.org X-Gm-Message-State: AOJu0YxeYDDoWqZlhv9NbfNbRDOcJg3g/QQIdUtpx9lPoVgqVeKWYY2g fzw1qmi1IpfakBN0UKlWuqLiUQmFs0ypNGczWrKtJ6blBeO+SVNRbTJPkzgx6LRuVilLinDx2fc LOlY= X-Gm-Gg: ASbGnctY9o5Ku71JIwLU9HOCJYW4+V3eO8O6Pcwx9TlADmZp+wWlaVM4Rk6rGZNDdfS cu7fRsFQ44Bw6tnY0Y5yiSwq8hsSQ2zfdXX8zHGhTwcbAO/8nJ0AyCxwK5aNUI7JlcALW1Qf3/J 8uF0180kT/PUqgJCbcjShuvCJCDZnuw0n/5zVufqQrepzuLaQ72s8HwsaUNhk7pFYf6IP9aUxTk jQwDZkP3rMIcTba7N0v1Z73pw9amAmOaI7g7BBdBtnuUZoz3RGcwmBJ58YJzyIarSYYvzbslbeJ YLgzabQPqOxEiIWgFUuHnfZ88rTJhIrlC643TtM3PTrHC+ebJfo= X-Google-Smtp-Source: AGHT+IHrbIlYr0r08V7TlSz7Uj4jFvFElGjucRwZThVCiqe6hs7u3xT14gKAOK2Wl8KarbpfesjTqQ== X-Received: by 2002:a05:6512:3da3:b0:549:74a7:12de with SMTP id 2adb3069b0e04-54d6e6629e9mr2248868e87.48.1745102178995; Sat, 19 Apr 2025 15:36:18 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:18 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:04 +0200 Subject: [PATCH v6 17/31] ARM: entry: Implement syscall_exit_to_user_mode() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-17-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 Mirroring syscall_enter_from_user_mode() we create the sibling call syscall_exit_to_user_mode() and start to move some stuff over from assembly, first the rseq call and the interrupt disablement. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/entry.h | 1 + arch/arm/include/asm/signal.h | 1 - arch/arm/kernel/entry-common.S | 10 ++-------- arch/arm/kernel/entry.c | 8 ++++++++ arch/arm/kernel/signal.c | 7 ------- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/arch/arm/include/asm/entry.h b/arch/arm/include/asm/entry.h index e259b074caef75c7f777b18199623f07bebee5b4..8b8cc9a1eefbd00dd75d4e34457= 6fc184a413768 100644 --- a/arch/arm/include/asm/entry.h +++ b/arch/arm/include/asm/entry.h @@ -9,6 +9,7 @@ struct pt_regs; * to generic entry once they are semantically equivalent. */ long syscall_enter_from_user_mode(struct pt_regs *regs, long); +void syscall_exit_to_user_mode(struct pt_regs *regs); void irqentry_enter_from_user_mode(struct pt_regs *regs); void irqentry_exit_to_user_mode(struct pt_regs *regs); =20 diff --git a/arch/arm/include/asm/signal.h b/arch/arm/include/asm/signal.h index 7acccc96840c8a17744cc3f2894f19d142aba4fd..bb753cd3e29fc54186543c48b2a= ee7b221301a37 100644 --- a/arch/arm/include/asm/signal.h +++ b/arch/arm/include/asm/signal.h @@ -23,7 +23,6 @@ typedef struct { =20 #include =20 -void do_rseq_syscall(struct pt_regs *regs); void do_work_pending(struct pt_regs *regs, unsigned int thread_flags); =20 #endif diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index df564388905ee019cd5553f8b37e678da59e3222..3559e0a9f5e079f1af91392bf00= 0d39f9b45906c 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -65,12 +65,9 @@ ret_fast_syscall: UNWIND(.fnstart ) UNWIND(.cantunwind ) add sp, sp, #(S_R0 + S_OFF) -#if IS_ENABLED(CONFIG_DEBUG_RSEQ) /* do_rseq_syscall needs interrupts enabled. */ mov r0, sp @ 'regs' - bl do_rseq_syscall -#endif - disable_irq_notrace @ disable interrupts + bl syscall_exit_to_user_mode ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing movs r1, r1, lsl #16 beq no_work_pending @@ -97,13 +94,10 @@ ENDPROC(ret_fast_syscall) * do_work_pending() will update this state if necessary. */ ENTRY(ret_to_user) -#if IS_ENABLED(CONFIG_DEBUG_RSEQ) /* do_rseq_syscall needs interrupts enabled. */ enable_irq_notrace @ enable interrupts mov r0, sp @ 'regs' - bl do_rseq_syscall -#endif - disable_irq_notrace @ disable interrupts + bl syscall_exit_to_user_mode ENTRY(ret_to_user_from_irq) ldr r1, [tsk, #TI_FLAGS] movs r1, r1, lsl #16 diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 1973947c7ad753fccd694b3ef334fba1326f58b6..47233804733752aef0f2fec6f54= badeab18e98d0 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -1,7 +1,9 @@ // SPDX-License-Identifier: GPL-2.0 #include +#include #include #include +#include =20 long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall) { @@ -14,6 +16,12 @@ long syscall_enter_from_user_mode(struct pt_regs *regs, = long syscall) return syscall; } =20 +void syscall_exit_to_user_mode(struct pt_regs *regs) +{ + rseq_syscall(regs); + local_irq_disable(); +} + noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs) { trace_hardirqs_off(); diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 7b1a16e86b236575efdc29cda9b751e8e2a3f64e..03b20637a2e1ca6f327223c9132= 915a97a9c4697 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -659,13 +659,6 @@ struct page *get_signal_page(void) return page; } =20 -#ifdef CONFIG_DEBUG_RSEQ -asmlinkage void do_rseq_syscall(struct pt_regs *regs) -{ - rseq_syscall(regs); -} -#endif - /* * Compile-time assertions for siginfo_t offsets. Check NSIG* as well, as * changes likely come with new fields that should be added below. --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f45.google.com (mail-lf1-f45.google.com [209.85.167.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DD4E820010C for ; Sat, 19 Apr 2025 22:36:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102183; cv=none; b=IPj2PM/NfjgSHywcfpktKM9BSTR7vNC/Mpdf8/uq3HdOejwLQkjh6NEfgYCzvFkOmPEKClorM2eW4gkd2HakixbJQrYuux10rtQva4J5Ei8Fj5aOqyE/q3I1ousQGeWP4iwycbfvskpprxsQmjSFTPPU63PDQEjru+oboAA0rqQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102183; c=relaxed/simple; bh=sRj+8Oh0NZkpmwHziZ/jGho7nVCQ82mxLAQ9WXu83Vw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=erpMNBLiDbh/tfRrgwO5RhV6P+hj0FNZ09Dm/f+q0mUtd0AGRFxaVJS3OR5lhbyuEsRXOxe7rDOdfYuD4iwX6xFPtseKcnwqV3r3s0SIAkF2MAat8f/z+/nx0iKrxG1juLchzrSfI7TU7imKDxd0PESsY1bYiiY+KT2EgQvGEVg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=fCvdTJFQ; arc=none smtp.client-ip=209.85.167.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="fCvdTJFQ" Received: by mail-lf1-f45.google.com with SMTP id 2adb3069b0e04-54d3ee30af1so3101746e87.0 for ; Sat, 19 Apr 2025 15:36:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102180; x=1745706980; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=CJ2CAOyyO+hXIbzI5viafcwpFofTGSFRrqZLvi/3aBA=; b=fCvdTJFQDNiSMNharoaVAbCZ5QBFRsBUdn3hYPzqxp4ZdFviSXEUpRBLFTTzNwBKg8 H2HP5uEJ/CoNIhA9w34HMEf2vJIwyBMHRaRGFDDP7rLSHXy7ThWPhpL/5RUSg/xwHNRP FJyxaK4NJVOEyb7XVE16qZllRcvmOZ6zDrkSPFL5CTdWJTZy3caJrH9+1eo9RVcR0eQY CudY3kdRFpbKUiCB11UB7dH0vSYB1pVkVD9DnpnewQfQWA6X8Cn1Sjvv7w2VYuuJCEdO HNqopGDSWhxOAhV7bEQ73OZrbNSU8BkeEN13O6OzrEMJbr70iT26OEv40w7jSbcoJB+S D02g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102180; x=1745706980; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CJ2CAOyyO+hXIbzI5viafcwpFofTGSFRrqZLvi/3aBA=; b=r6kB9FYconWjnfGzJaAuyAQiEMISxePgeNAHU9yLdIReYz+0kJUC0MKuKcOnaZ1Fqy yGXa8GjjuaqkbJADNrPNlRjimUURtK+Aw9Itwt3w9c36zKNjDc3YmROydb8Ljhw/ofDO 62J+/Yc7flqfGL15v3HSeoDz8iNT38bkp8Okz7nMy/GEuzoJPpJl1/ZeRCmNxKMRxwlg VcRhU4ssuv8ro0uHzWtH6xE1CD98BlcQoBiyCjvGdY2AFm43smP5Q+MYo/rbkkDxLfeQ uEX+XHYxStpXqUWtXAcEOSMjPJqdT7FON3hwjHENzZsO254pBILPUDJi0vxPFnSzAZG0 F20g== X-Forwarded-Encrypted: i=1; AJvYcCUJdK57PS8i14rl9fVj0kZ4AIyTMeOWLqVGCV6KPKpexdHOfxzf9WTZqVoxlBmsICUlLfd/Qnw4cVut5vc=@vger.kernel.org X-Gm-Message-State: AOJu0Ywm8zFWqYtuWAYwItVTcT4+iC5h/4SANAFpTyWt/dqvn3VHT/qe e5aueNYhufHmGoYu8tqIKYNhJO3JyZ3SVxx8YSNqF8H6+tyY7MwpnImWvKFchnU= X-Gm-Gg: ASbGncvA/gFg+uaGEExvkehBHATAflA5LD+xPOCIvz0xgtDvEFSb3cAARKQqI9mnKmm VyS7pbR+MAWzr6K+FFMgnZFNEvatX4zo8TR/A3MVk2gjnng5MbY8RGY/c46Y+Of0CzSP6MySBBl ld7SRU0t9zqnKe1KNd4dUqwnqGhJSOL4TsQU0Nob6c1QgKQWj+PHNlAE8YY27SAbpNpZDTKHXUF rP1C34MAF5hQCsJhZm1tNaV5fBOCLzyGy/e5BvcHsf6yfoDaiHMGrR4n22G5GywoKjJ49Bqabmc 6aiIXg3ZJnN7UekoolzEZox+VEhJLfr8VPlKE2xdZzsv2jPu/7k= X-Google-Smtp-Source: AGHT+IFy8jjdgLjfaCOyW2gFGBs7/pfMPh1k6HYrKZA70Zav8DUkJktP7H7VAxHF4ELxWlpTqUqLsg== X-Received: by 2002:a05:6512:12d0:b0:546:2f7a:38c4 with SMTP id 2adb3069b0e04-54d6e62b86amr1840188e87.13.1745102180032; Sat, 19 Apr 2025 15:36:20 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:19 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:05 +0200 Subject: [PATCH v6 18/31] ARM: entry: Drop the superfast ret_fast_syscall Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-18-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 When not using any irqflags tracing, context tracking or rseq debugging, the ARM kernel uses a "superfast" ret_fast_syscall with a very few assembly instructions. With generic entry, such local optimizations are not really possible, we need to call C unconditionally and take the (hopefully small) overhead. With generic entry in C, most of the tracing (etc) calls are replaced by stubs and optimized out by the compiler. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-common.S | 29 +---------------------------- 1 file changed, 1 insertion(+), 28 deletions(-) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 3559e0a9f5e079f1af91392bf000d39f9b45906c..dddbd6ba1eb9fcbc2c0d81f24e1= a9b3231558d7f 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -30,34 +30,8 @@ saved_pc .req lr =20 .section .entry.text,"ax",%progbits .align 5 -#if !(IS_ENABLED(CONFIG_TRACE_IRQFLAGS) || IS_ENABLED(CONFIG_CONTEXT_TRACK= ING_USER) || \ - IS_ENABLED(CONFIG_DEBUG_RSEQ)) /* - * This is the fast syscall return path. We do as little as possible here, - * such as avoiding writing r0 to the stack. We only use this path if we - * have tracing, context tracking and rseq debug disabled - the overheads - * from those features make this path too inefficient. - */ -ret_fast_syscall: - UNWIND(.fnstart ) - UNWIND(.cantunwind ) - disable_irq_notrace @ disable interrupts - ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing - movs r1, r1, lsl #16 - bne fast_work_pending - - restore_user_regs fast =3D 0, offset =3D S_OFF - UNWIND(.fnend ) -ENDPROC(ret_fast_syscall) - - /* Ok, we need to do extra processing, enter the slow path. */ -fast_work_pending: - add sp, sp, #(S_R0 + S_OFF) - /* fall through to work_pending */ -#else -/* - * The "replacement" ret_fast_syscall for when tracing, context tracking, - * or rseq debug is enabled. As we will need to call out to some C functi= ons, + * As we will need to call out to some C functions, * we save r0 first to avoid needing to save registers around each C funct= ion * call. */ @@ -75,7 +49,6 @@ ret_fast_syscall: ENDPROC(ret_fast_syscall) =20 /* Slower path - fall through to work_pending */ -#endif =20 tst r1, #_TIF_SYSCALL_WORK beq slow_work_pending --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 98D961EBA19 for ; Sat, 19 Apr 2025 22:36:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102185; cv=none; b=uYjtPTnGg6lu+MD057ip8fhubn9g0t2w69SR9+90gZilntwZc/oRpB+XRVi/OnTGPkRfQLGs/XE9NFMlwVL3PIFEytVCV3yANF+L8sej17qMCq1O2NU5seBSqgW2F8s0JKjmcb3F4NYH60eqK/GBUCFerlEODFo8X/Ugu3fqOPM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102185; c=relaxed/simple; bh=uzb8ozZAoEt/9ZNtFSIrYvQshl9f5/Sj8FTbEBSaVVA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=b55a5XFv9iK2sB5NE+rEHDpq/QN53tkmEI0fb3aZ8CINMji56z/iFU1X4FtTP7TXJsDC+nBfVdi7JO2YC5LFyaokNPBYYW5jz8qe6U8yN4gB4ir7WwTJ17C049uom0lIMao90s96RgeJjYyVqJSOA9WLoPT6YfdI5i4+LrWHAjA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=LoNXLdrq; arc=none smtp.client-ip=209.85.167.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="LoNXLdrq" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-54b166fa41bso3305388e87.0 for ; Sat, 19 Apr 2025 15:36:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102181; x=1745706981; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=smP6wtuEPxGQlG+yx8YbiPVrmm7vWSzlxcMcUy2wQgU=; b=LoNXLdrqQuj77vfWnVk5rVF4TyY3qUebmSBRzGBMFr+0K0/Tnzb++5O8B1lS6Dawkr A8NuODw7f/PUbiEQmbMV5jT76kYHfV7lOtM+Y00EeDXyCn0eh1bJpAlE/UiNswy1QLgX QKFf+Tly2xGSaEepL+nwu96XREOfgJw50b3yZJHO1LW7OJBLj+3DcY5lrJaxOHQ1FlbZ R5dsnD1i6kC94Yxy1WZLPDdIhzHbyFtP/rH4jGlq3AB5C8tsZmV5fWHYfDJDTX1yW0Dl sTKg6OBl/sKvKWOjQ2Le3c2JDf4PjaLrbgDMYDslj633IKq9qKcEhdX7Z8+kOHXzZHCc pBng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102181; x=1745706981; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=smP6wtuEPxGQlG+yx8YbiPVrmm7vWSzlxcMcUy2wQgU=; b=LHOGYOxBazZwcYDejTpC2uO9HBkFnV1Lv3tJOwV27J3nGzq5HCJAvB1WEOX2NnphiL plPgJD30zSVu4tkz1ET4tfFBxn829KLicIu7gfDzZghgMAsNNUq/wQDhtvAkC7NzqU3l AAoRQ7fUoCWAYUF08rSyqshRPD+t3tk02SEKBjlxpQCBUbhL33Fetbungdyw5DvFCPnV MVWL5IPNV1aD9tZyZyOSFngIFxRgolJuAQ6RuQ6pv+UvTPq4B+JmA9ojh9C6/X+i8HEk roOAtbiKOIxX3vxdFwj99B/EDUOWoFBshAWreI+6SeIxcIxube1ekYwNHOBwqO1l1X9t 9TWg== X-Forwarded-Encrypted: i=1; AJvYcCXCOZ/TlYUF7cmEsVd0k4atAXMKtNHWCrOP/xcxbykqbGj9c/wwjw6IG0YlQ3rYcRbqQsZp/LMzQU7NZqk=@vger.kernel.org X-Gm-Message-State: AOJu0Ywzbml7rh4b8paMJ1MT1nnmvo4xRP3P3d3elnmKs7SLaCU1zn3f n1oY9apAogAtTMMk6yVndppmQIybkMSvrXRuSS1Drsk05AT8l3SeCGpFw/c4VWI= X-Gm-Gg: ASbGncvYVAWHPU8tub4BrjsWttW8KWB8GOYB3f3FzLKhegdUD8ldVIYCOMcYX2H+Y3Z SOO2PJU/UQuIFxy26b2by+Agt5Mq6wc9lkoFxf4m0zeQk1UkDYoFvukuxlqgfE3B9BWIKt+fpdp zRCwtJ4nEN0fRKK/A1K5mXQlWbWoN3UNYL8NzZASYuMuRjPcSZ+PtpLPScL5SIqNjLEI2yGILJe qa57sb7EHzM8fq3e7Sf0rEiiA3ETgdo2Q0oJl5tmdgGhUv+TIR+d7dAXrn2VHc7fKoRQUolXcXh QMV0mJkQwUwU274zcUSJeWY1uUw83+xJn+o9Ly05FBcO2QYVnJI= X-Google-Smtp-Source: AGHT+IEXHVxk/ZPzizZxk/wtdsPQEkeFJ8rWxX8XwR/1XQy0SnPGf2l5NdkpLMSSJywv9IZRutxODg== X-Received: by 2002:a05:6512:1106:b0:549:38d2:f630 with SMTP id 2adb3069b0e04-54d6e62b9damr2006675e87.24.1745102181592; Sat, 19 Apr 2025 15:36:21 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:20 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:06 +0200 Subject: [PATCH v6 19/31] ARM: entry: Remove fast and offset register restore Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-19-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 Now all remaining invocations of restore_user_regs has fast =3D 0 and offset =3D 0 set, so drop these parameters to the macro. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-armv.S | 2 +- arch/arm/kernel/entry-common.S | 2 +- arch/arm/kernel/entry-header.S | 29 +++++++++-------------------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 460aa92c3c1f50de905550acf363c58f509bfe0a..3cd5a80b47758867d1db6c39710= 30370bca1551a 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -497,7 +497,7 @@ __fiq_usr: mov r0, sp @ struct pt_regs *regs bl handle_fiq_as_nmi get_thread_info tsk - restore_user_regs fast =3D 0, offset =3D 0 + restore_user_regs UNWIND(.fnend ) ENDPROC(__fiq_usr) =20 diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index dddbd6ba1eb9fcbc2c0d81f24e1a9b3231558d7f..d27e34d7e97a079d62e7b778cf7= cf97c302e4763 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -81,7 +81,7 @@ no_work_pending: #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase_on_task_stack #endif - restore_user_regs fast =3D 0, offset =3D 0 + restore_user_regs ENDPROC(ret_to_user_from_irq) ENDPROC(ret_to_user) =20 diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 50c0b55adc7421e7be123c9d00f94b1ebb93ff9e..51c7f93c1ded1db56f173c7aaed= 8094ef011ff5a 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -290,7 +290,7 @@ .endm =20 =20 - .macro restore_user_regs, fast =3D 0, offset =3D 0 + .macro restore_user_regs #if defined(CONFIG_CPU_32v6K) && \ (!defined(CONFIG_CPU_V6) || defined(CONFIG_SMP)) #ifdef CONFIG_CPU_V6 @@ -309,8 +309,8 @@ ALT_UP_B(.L1_\@) #ifndef CONFIG_THUMB2_KERNEL @ ARM mode restore mov r2, sp - ldr r1, [r2, #\offset + S_PSR] @ get calling cpsr - ldr lr, [r2, #\offset + S_PC]! @ get pc + ldr r1, [r2, S_PSR] @ get calling cpsr + ldr lr, [r2, S_PC]! @ get pc tst r1, #PSR_I_BIT | 0x0f bne 1f msr spsr_cxsf, r1 @ save in spsr_svc @@ -318,31 +318,24 @@ ALT_UP_B(.L1_\@) @ We must avoid clrex due to Cortex-A15 erratum #830321 strex r1, r2, [r2] @ clear the exclusive monitor #endif - .if \fast - ldmdb r2, {r1 - lr}^ @ get calling r1 - lr - .else ldmdb r2, {r0 - lr}^ @ get calling r0 - lr - .endif mov r0, r0 @ ARMv5T and earlier require a nop @ after ldm {}^ - add sp, sp, #\offset + PT_REGS_SIZE + add sp, sp, #PT_REGS_SIZE movs pc, lr @ return & move spsr_svc into cpsr 1: bug "Returning to usermode but unexpected PSR bits set?", \@ #elif defined(CONFIG_CPU_V7M) @ V7M restore. @ Note that we don't need to do clrex here as clearing the local @ monitor is part of the exception entry and exit sequence. - .if \offset - add sp, #\offset - .endif - v7m_exception_slow_exit ret_r0 =3D \fast + v7m_exception_slow_exit ret_r0 =3D 0 #else @ Thumb mode restore mov r2, sp - load_user_sp_lr r2, r3, \offset + S_SP @ calling sp, lr - ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr - ldr lr, [sp, #\offset + S_PC] @ get pc - add sp, sp, #\offset + S_SP + load_user_sp_lr r2, r3, S_SP @ calling sp, lr + ldr r1, [sp, S_PSR] @ get calling cpsr + ldr lr, [sp, S_PC] @ get pc + add sp, sp, S_SP tst r1, #PSR_I_BIT | 0x0f bne 1f msr spsr_cxsf, r1 @ save in spsr_svc @@ -350,11 +343,7 @@ ALT_UP_B(.L1_\@) @ We must avoid clrex due to Cortex-A15 erratum #830321 strex r1, r2, [sp] @ clear the exclusive monitor =20 - .if \fast - ldmdb sp, {r1 - r12} @ get calling r1 - r12 - .else ldmdb sp, {r0 - r12} @ get calling r0 - r12 - .endif add sp, sp, #PT_REGS_SIZE - S_SP movs pc, lr @ return & move spsr_svc into cpsr 1: bug "Returning to usermode but unexpected PSR bits set?", \@ --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f44.google.com (mail-lf1-f44.google.com [209.85.167.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E8ADF1EBA1E for ; Sat, 19 Apr 2025 22:36:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102186; cv=none; b=DHEiuoikD+8RTTLd/jkERMoMQZkD4QPw4QP4/Hg+APCCAwVjmwElXWgJl3bUaWfZRnMCjMkCELnQXTiPdU2jHAiXrgtBPlCZIJJw+7iamwj1F99dGvOBq+OcMXHP3ZwwHfqV88Qx7q0y0SIKGCyFmQ2akKZfUYeodjgjuEfFL8I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102186; c=relaxed/simple; bh=LbR4osUWoLkFLreske/FjNr3vqn3nXzgNQfKY52KpMs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iuFHFWcQNN6HKaQBsM7JVuYdA52shoHyRmZVg5LxZTAkHXSI9K8IEnlxU2Nf0rKKrYB49N6ESUQmEeXKW7qtmFDxAoEUDgijzBFUWSPT0/xC9P0uNhUvang3E+fnac/UezhCIS6MFtIL100CBT8+bT+QTvIQahK0ECpYpCw3/yw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=ECO8ekzl; arc=none smtp.client-ip=209.85.167.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="ECO8ekzl" Received: by mail-lf1-f44.google.com with SMTP id 2adb3069b0e04-54c090fc7adso3177145e87.2 for ; Sat, 19 Apr 2025 15:36:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102183; x=1745706983; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=QA9fXt6iW3iv41wst4sIpkLmpsfTQfiB6NSTaz4f3Lo=; b=ECO8ekzlnNKSlwrNyf8Spmz0aDcXhzL7YPA9ObrUkgjUFKe+Y+h8cbLIVMptF6G9Rk jtb1sHGZ53eqc32NZ/bRqwKIenFAL5EJXqgaXH62ThS1R+iK8lUg/bhr9M+Rmgol5JdV LyYq2Ky7lJDL9H4/R8yrNsJXFUqZEBcuiAyH/L1NZ+wvGSdLPJ9VdLrOUApYtlul9yu3 nzJKEqZ5lMqdiC2oOZnxsxU15GR7RL/M9LUg9W9DubUrJ9OH3qeAH/H7fIEjIvhT/JfD OGCCF+hbTj+nx8FNGNDWL0GcQgsu+jgOXKSGQGp9aEMR61rvBsos6H3XD9m0/1gwSgl3 AILQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102183; x=1745706983; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QA9fXt6iW3iv41wst4sIpkLmpsfTQfiB6NSTaz4f3Lo=; b=betqpoUem/gdmvTr2B2VqC9q5YHWpt/0eVxq2m7tQyNzeMxhYgStpo12oAoy5bPMrz q46yT78ozhfXhZKPVnI0I9Aqef63mBKqK6wTgQ3jJxVzG7M52S1kKVEN89hapmWnFXjV LE9Pfueos1COTcmE0mUg3XenVtxwDjhuSGWMJsGKYxmq6yh2PeHv9nAigRH6vJGJoWaZ h+xV3b5ozqPQ8NbmCsFSRB9mrWtLH7+/uyZh4zfl/Ql+3pXbDEyuuSxaapgtiuNH9stq 5B3BfNszljFf0LwLwGDc40EF85OZs3FUvhcMBQ/3Y8bVIanQ0StSNxhZ/fs16ILtt/5K GckA== X-Forwarded-Encrypted: i=1; AJvYcCXemtgVLVrjHJXmGKl2ngcSV0P3rXsGqOMf8MTjRkHDZsROvl8rd+A+oec+PP/Gp1TU8+4sbovZXgZDAb4=@vger.kernel.org X-Gm-Message-State: AOJu0YxdqNGEgBzVt5VlDw09tzdTxd5BfrVg+NcY8m18N+tjcwtIIs7j vHDQsZjTYCGzyJNj8lkf2sz8/8qbEcOEpyavOIrder/vNCr3pmXp0SRod2NEZYg= X-Gm-Gg: ASbGncslwTWkXT662osxM/5BKxlMimWCwVjVVqEcaWrRrtpNrlMnX7rOKZ+NHsWiIJZ XRXvvH5tkyjl/jv2X594vevlv2WG5bzNSOp+mqM2JWV0c3tZHWbhzGxxV7N8N8PA4vZPaR+nTew h+fsUMpxUeIqRq62WG0Q99ORdWCN3fgwtuejFIh1zyWRrpebEbh6Qc3xu1hE8haVkBfvMQ6XUHw aYWWRV/nQEHJFjerXNlUrCguXvn2bZO0LqF8zgiGr77KYpWCx+fICaufVahzys+1b4pVtkg8hpF knMoJaybMnfquzuBP3L1UhlUo4wv77zaFL/wZpf6RgqGuE+gyGY= X-Google-Smtp-Source: AGHT+IF2zPQ/WKqF3wNtgpQmZ4+Rq+76q40tDwICNvok0//cFZwaJDMB36r2Jqc7UyoA/kUxnRmHQA== X-Received: by 2002:a05:6512:b0f:b0:54d:65cb:6c28 with SMTP id 2adb3069b0e04-54d6e61a356mr1780325e87.9.1745102183076; Sat, 19 Apr 2025 15:36:23 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:22 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:07 +0200 Subject: [PATCH v6 20/31] ARM: entry: Untangle ret_fast_syscall/to_user Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-20-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The return to userspace is a bit hard to follow. To prepare the ground for further refactorings we rewrite the functions to ret_fast_syscall and ret_to_user are mostly stand-alone symbols. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-common.S | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index d27e34d7e97a079d62e7b778cf7cf97c302e4763..ece9215717143427de7572a18a6= dbe620a9193e9 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -44,20 +44,23 @@ ret_fast_syscall: bl syscall_exit_to_user_mode ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing movs r1, r1, lsl #16 - beq no_work_pending - UNWIND(.fnend ) -ENDPROC(ret_fast_syscall) - - /* Slower path - fall through to work_pending */ + beq 2f =20 tst r1, #_TIF_SYSCALL_WORK - beq slow_work_pending + beq 1f + b ret_to_user =20 -slow_work_pending: - mov r0, sp @ 'regs' +1: mov r0, sp @ 'regs' bl do_work_pending - b no_work_pending + +2: asm_irqentry_exit_to_user_mode + +#ifdef CONFIG_GCC_PLUGIN_STACKLEAK + bl stackleak_erase_on_task_stack +#endif + restore_user_regs + UNWIND(.fnend ) ENDPROC(ret_fast_syscall) =20 /* @@ -74,7 +77,9 @@ ENTRY(ret_to_user) ENTRY(ret_to_user_from_irq) ldr r1, [tsk, #TI_FLAGS] movs r1, r1, lsl #16 - bne slow_work_pending + beq no_work_pending + mov r0, sp @ 'regs' + bl do_work_pending no_work_pending: asm_irqentry_exit_to_user_mode =20 --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 888AA202F97 for ; Sat, 19 Apr 2025 22:36:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102188; cv=none; b=Htn+GgIPRejnLS3N4DvgTf6IEQJ2vRW7zKjhRl9LJ6KIm7SjVmzmSMrrYrXTmNvjYSTyXZ2kvLT7kjIBcWb+8ShVLTMhsqRWryFigLSYvr0HtMWODn6gMjCjUal3eYLlvyAu1oy2ZOteUgPFIxEukPALmtR1cAH3I2Vc6fNgkec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102188; c=relaxed/simple; bh=sHcHdOV0FMAZVdwgRzOwpbk/x68rbhSqA4QMNvokHj0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hxt3mJOgXkCC3bsinW87Pva6pfrpu5/sXcAChahIpaHmMj6YpiormdGPH+DPrbGgj3Q85RJA9ZdPxY4mAdFMlGaUQXEuQ5SRR7/pL9h3G91YxZSP1gPrPnk/3ciy+x7UED2bxr2nxv8R+zk7DkE8ycbbCf4Yn8d7n5AG36sQvWE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=ytUYqlTz; arc=none smtp.client-ip=209.85.167.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="ytUYqlTz" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-54998f865b8so2880045e87.3 for ; Sat, 19 Apr 2025 15:36:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102185; x=1745706985; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Tq3qR1Ach5OqeKvTWWzJNPs8Dto2cBMzy0K+AAmOlZ8=; b=ytUYqlTzQGnHO9pgweSHsnj5DV9UfQfoe6ZYXJ07Edwd/YKtd1a3zw9y3YYBQQZPbO kizfc/Vg3KRphHjpPOS8wHzwquynOEZ4dIZUYXJPtiJMESGTBT5G9+J9y+Xjv86Lww1A 5e7atDD0lTf0b5A4FWPgJm9J4Gv1Z8y3tj5taykGly0nJ5P8i9k/kF/9O+Vo9fa4RUCU 3LHgF6y4IBTGmtMOS7knFyGh8359giXpnvXSg5efO3bE+cAx3jxE4fPI/bMIgKkNx+8m czpFP+bMZE7IX/q46TNoSgUBmr013LQrKDrIk5MvrfpSkIoZ++NH+D7qYEpQDuT8Yt4G 3wEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102185; x=1745706985; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Tq3qR1Ach5OqeKvTWWzJNPs8Dto2cBMzy0K+AAmOlZ8=; b=pGbXkml69F0kdITP0AHqz43DYKDnvwrhN9J72yr75R8IfiO1wB4ZvfIfn1ZZUD9RjG fvyioYgEK6HtQJwgq61ZVRYxkIRb19QtFOqOIsIIB9dwhyCkTPeuL/2+iNKbuua4++Id ZzYxLVXYJYlH/NlUGw0rXuvNmxP3ixtiPxpcRCJotZMRRVqOWTN373vAkbUiU4ZqIZf0 RxXRjAkpWDEBv+pi7Ts356c5WJkBf7f0yLy/iANd01GeteYw3XPVQTfeTePGiXastdU/ nPscLPBarSLRm5Z65nKx00JrtHGna0BNCgdg/mV+OwI/eDRu1rLJzQD6FTF1N7hzcS2Y 352g== X-Forwarded-Encrypted: i=1; AJvYcCVf0cuO/Ccnyg3GNHASSJr392pmbzYpqx9zncH7fAwkYUi0fGFxRTSOaSDNbWlfULl0X84zzTe5JxW9Pfo=@vger.kernel.org X-Gm-Message-State: AOJu0YwgYqRWjaityXWnZ2LlAQNyrhMsa0CbhIlebzG8m48/SVDNqLDJ wlREzRbnCpnO1cpHuusQns/rt0Ts+VAdZwBB2QE1G45mYAJUWj0kLjA2WYQj7iQ= X-Gm-Gg: ASbGncvaE8r8KHi69TUy/OFV4dOuGzfj4FzA7T9/oY2pBtwdGbdMqqyKDnNHSaKx+1+ 43rpG468Ca1fD49gDtUpGgNMJSSAo20ykAr0LNioNxK6ROMjHqHIXcpdEmKjXnytV/qX2blEaJ4 iimoW9wGHJxuvlav/19dY9Rfp0Z1ojY1Xhvt6kCFZbu4WrzC/018wF9uXkpuw+NshyWxb920XmT PD9l5DvUPqQGQNvN4rhfFo4F7Ad9+Dd0/6dzkPAWfZiFaGHLdoETac6Sl8ibHtZI/K0giy1k+g1 BeI7XNdPU3FZdElVz66bbCnv4A92E4tBZjyiUFMOZ4NBItAQvHI= X-Google-Smtp-Source: AGHT+IFNvDhheUhAKpDcu0lfhPrHRPwqRw7FFmLwPqgAooC3jEkoxPnI3ZkuWls+okhqWh9k8jmbkA== X-Received: by 2002:a05:6512:1309:b0:545:5d:a5ea with SMTP id 2adb3069b0e04-54d6e619700mr2291214e87.3.1745102184594; Sat, 19 Apr 2025 15:36:24 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:23 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:08 +0200 Subject: [PATCH v6 21/31] ARM: entry: Do not double-call exit functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-21-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 This is a semantic change to ret_fast_syscall: if there is no work pending the function used to jump to ret_to_user, instead we proceed to return from the syscall. If we jump to ret_to_user, IRQs are enabled and we call syscall_exit_to_user_mode a second time; at this point a this just means a second call to rseq_syscall(), but it seems wrong and we want syscall_exit_to_user_mode to be called exactly once. Apparently the ARM kernel has under some circumstances called rseq_syscall() twice on the exit to userspace without side effects. ret_to_user also checks for pending work a second time under ret_to_user_from_irq, but this isn't even needed any more on the fast return path: this was needed because the syscall invocation enabled interrupts when doing syscall tracing, and all tracing invocation has been moved over to C in earlier patches. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-common.S | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index ece9215717143427de7572a18a6dbe620a9193e9..33bc9e7c5b32f62474724f1d47f= 97af24dba53bf 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -49,7 +49,7 @@ ret_fast_syscall: tst r1, #_TIF_SYSCALL_WORK beq 1f =20 - b ret_to_user + b 2f =20 1: mov r0, sp @ 'regs' bl do_work_pending --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f52.google.com (mail-lf1-f52.google.com [209.85.167.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9451E203713 for ; Sat, 19 Apr 2025 22:36:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102189; cv=none; b=t8YZ3rtqJbERzIndLHjn2zz17WvXMdFG2prhDwYD7M0fEbUvjKn/JHnZp/W160U9sh+wo8NLvP6FXWMaHGIwCW25tbGDCeKcTy8tgKEil3vBPMzBsYL5OWj+89hT8gY4kTfuxp0iAW/MZXY7KWPd3DcdY0JefMcODdoVSPca2i8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102189; c=relaxed/simple; bh=wdz1T+zii2RG/EgefjsFSrGL9mmJN1Zi/51bwRmH298=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gtTjM1pRqh4cFan607jYvd/I093EtgSYAap+HeFO++IovgR7QcbC7sI4VhpWVF4e2X84bAcER6q3SORNFmBY6g7faP14QFK5TT/dAH+k4LhpRy9NP7J8FsCHndBgx69rD6b8lXXtUnrL8wqOVhpLA5MyOverrpvIiPoc7bn11jI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=KZ32uVf/; arc=none smtp.client-ip=209.85.167.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="KZ32uVf/" Received: by mail-lf1-f52.google.com with SMTP id 2adb3069b0e04-54ac9b3ddf6so2762038e87.1 for ; Sat, 19 Apr 2025 15:36:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102185; x=1745706985; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=MD/Nu2Av3rMkoCf1kcmDdMh+qfX7Gu3u+XPV0sJ8QcQ=; b=KZ32uVf/dwvcODhoIqunlh6gmG/WgWTfWsbtZ/V0LXROu/ZUGenQbetdswR46pfJZ+ LY2gOYJxJQQsYZv1WSKZUQ1dsq/2MKKK5/Vca6BsafIja9IayBT0aLfkulzDwFmyNLjW E4v1AlAPRpHq/hIyYOagf8ydKjyBGZJ1iOOdY+6IV6j6qnQpKAOUV/sXyf2qaHDnKdE6 UvD1sEiCFERaDK37XMEhZhVZMIXnWVUI3YEwljWTLSh77mZNykQQmxU0dD7Cqopt2FQU DZVYHg0h8NTH9HK0qTN+rzWnmZ+9ylKrdlbJLXZvBDLVC1iMiGWCCUMg2ukaxPGJTgVj sN1Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102185; x=1745706985; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MD/Nu2Av3rMkoCf1kcmDdMh+qfX7Gu3u+XPV0sJ8QcQ=; b=PuNxSnh/tCLWYPDttWUAKqM7P++TEgSIgBPMHxLX4BfJBIyrx0zKxdg4E/EfdViWzJ RkkcaRBhJKA71lIqIaV/2pAGKj8uEs63vceR3bt93SCgG3xVGIwBeOXGVhbYYLiyctKO 5jtL/Q8pQh85QSZ3oSt+P0rxMi05YQR6hL+FetwZYZn4B70MPyr94/ptUku8gzsLdNu0 8gF9Hboxov42dgC6cXHKia7LXZSh6LQvLLMQW8IXKUSYzTVJIn2l4Ijyroz6pVwVlS0s sb9dY+JU7ILFSi+HQjpZugu7aE7GbnZY+3YzcLZyOik4ekVpy/d4seHxxog5vJurx2Lm ZF4w== X-Forwarded-Encrypted: i=1; AJvYcCV1vnsOHWW5m9s7x0YffZZ2KRUS+xKELQAzrO/E3bWKClDtIoYvk06WWXrxPNEjkH8FCB7zHRw1nAUMawg=@vger.kernel.org X-Gm-Message-State: AOJu0YzLv1e6UEcp3kuSg37hlKKqUI+gy8I+uo0fc6erRhpFPtAGWUSu ybU+tYRAjwLSZYpO2pctoMTpfx1VfAo/dJdiMgvYzqy9QBIGYuuXX9uDnyHwcSM= X-Gm-Gg: ASbGnct4vsM1NXmrQfObTBsJ13KYUenno36L9rIi6ehrifCHSx3QYgHu/qlCd2G9yDR nbyEZ+iR40ySlweoWOSf2c9ivTXgZsnZY5b7DHmOxGcHYxuaKSsX1OVgrkc5NTNx55wIoySL3tu qbIGyqBk95d7oGL9XlYE8zIPywt7Y3vDK/VYmwFyazitEdfvBuV70sjnWeMwBREXsR9eP/C3rb7 aa1JeY+DTQtzArcOlIfPhHquoSl4QC/IzQxc0BWDUcBOSK7EQK1h7gyzZHmWudcyoxU2+v2ZQwg Y7/wzlz65SKR7vBvEZrn+qy/nkwsVQHG7Im7dOQPshwhB07cBGc= X-Google-Smtp-Source: AGHT+IFOJZ5Y+jGQDL3SAl66onZDVj5qKLEaZqn2DNtHJeZeBNqZY7fqcX6ZDhbd7UrY2F5Kq+Yprw== X-Received: by 2002:a05:6512:2393:b0:549:4d7d:b61b with SMTP id 2adb3069b0e04-54d6e66272emr2510712e87.35.1745102185559; Sat, 19 Apr 2025 15:36:25 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:25 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:09 +0200 Subject: [PATCH v6 22/31] ARM: entry: Move work processing to C Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-22-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 At the end of a syscall software interrupt and every time we exit an interrupt handler we check if there is work to do, i.e. if the current thread (userspace or kernel daemon) has set the _TIF_SYSCALL_WORK flag. Move this processing over to the C entry code. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-common.S | 14 +------------- arch/arm/kernel/entry.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 33bc9e7c5b32f62474724f1d47f97af24dba53bf..5385574c4339714f3d8b5ab6894= f27466b89f932 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -42,19 +42,7 @@ ret_fast_syscall: /* do_rseq_syscall needs interrupts enabled. */ mov r0, sp @ 'regs' bl syscall_exit_to_user_mode - ldr r1, [tsk, #TI_FLAGS] @ re-check for syscall tracing - movs r1, r1, lsl #16 - beq 2f - - tst r1, #_TIF_SYSCALL_WORK - beq 1f - - b 2f - -1: mov r0, sp @ 'regs' - bl do_work_pending - -2: asm_irqentry_exit_to_user_mode + asm_irqentry_exit_to_user_mode =20 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase_on_task_stack diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 47233804733752aef0f2fec6f54badeab18e98d0..0e3960844b94b14325eb00ce7dd= 791b36c43ac3c 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -1,10 +1,16 @@ // SPDX-License-Identifier: GPL-2.0 #include +#include #include #include #include #include =20 +static inline bool has_syscall_work(unsigned long flags) +{ + return unlikely(flags & _TIF_SYSCALL_WORK); +} + long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall) { trace_hardirqs_on(); @@ -18,8 +24,12 @@ long syscall_enter_from_user_mode(struct pt_regs *regs, = long syscall) =20 void syscall_exit_to_user_mode(struct pt_regs *regs) { + unsigned long flags =3D read_thread_flags(); + rseq_syscall(regs); local_irq_disable(); + if (has_syscall_work(flags)) + do_work_pending(regs, flags); } =20 noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs) --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DE8D120409E for ; Sat, 19 Apr 2025 22:36:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102190; cv=none; b=U7iJcZ8XDo2Iea8PQ0NRAhfWFAG5cxd36hhifZRAPvvSDOwbC/c/Wc+qZKgJ1Wpy/W4CxjzthrxZlF04CNSzBRKrgewYcGuaVdp0Y/1Zy4+4oKfNEI/mR7Wog04C8gX1Gul5diVZCiZ2/HWfSwrtbSdefLJE3sairMwOUygbNPc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102190; c=relaxed/simple; bh=os8NK0jSRHi6Z6k0L+lYRMJWNvlvBp3nqKvGGgzvPqY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EILq9H+zmidWOU/J1TtSPI8BPylcTK5W3TMzmfRd6tcSD65yd8p2vSCgHTutV1D4Jqqam6dtlbYRe+SWZMbgetGLvwwzcDxRf3JLDL0AihjfuIlc9zAbto1lkt0V2mbR+A4Ub4nv60ZbhTT2Ts8jknMJPMamLU71w4MnSORmdh4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=CnAVcuZh; arc=none smtp.client-ip=209.85.167.43 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="CnAVcuZh" Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-5499d2134e8so3211605e87.0 for ; Sat, 19 Apr 2025 15:36:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102187; x=1745706987; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=CTVDaSvJ4L704RA6vZ0/T+s/rQlTI98VbS11Ma+Uwx0=; b=CnAVcuZhNCPAToQ5h66Ul8Dbi778wexkH3Eh8CwsjGxiqVmxtwtq7iH9prHr9G+3lK kwfQjb9C1KyEQr/sHX7GHnwwc2ikPDLZCh7pNboVIakhge99dl5lvpArcUObVYPU0aQV JKazUmh81IOyvA+6qs/Evm9zgLwCo9igKWAhAsSMBr4ha0lV7XmNYE0rgt5akZUYjo/8 2MoLlGgj33F1rECqK16nOWxV3p+LucLY436VopicYiWd8mqi08iRh0myLvMBIMbAYX4a Xng+TUkfwuqWcW8H3k8pslzCwRFYcDvMLR59MQiHsLZtPD36SEvUuggzFp6YomwN6QRO MOwA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102187; x=1745706987; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CTVDaSvJ4L704RA6vZ0/T+s/rQlTI98VbS11Ma+Uwx0=; b=O3e5n+Rr9hFaUvRMhut+JgDj99UbA0XQc9CFeVtmmLLZTVpVBk6I9h8gPSsbANQC7g vFnrcHSa/rpMKR4poNeG9zAvzaSTsF8KydKq4cLEm2oSSEiVuxM7kEKE9jOsloeeGkWc 8aNImwbWsx5KKUrUfy9Ip9akKDFf+sC3FOol1GiGOyE6Uy1F61bZ7lG78ivs3S2GF304 79Fd09hp9uFGiuUsvNdbrL95iosTepTLP49FM70yiJg5H8Wglnt5h/pN/Fad0VPuWXlW LNNeci+CpO8RCMtQwEyc39DsZKpkFROKhYm45tFemFr+1snvwkNnGfWJBFEgrJSW8+Sz uUiQ== X-Forwarded-Encrypted: i=1; AJvYcCXpdR2K4mSy4YcMg+3YuhFh7FK3EsJTjEJgqqrl9GVciPfdaUjTJguKXIJGnqzMY348wu2Djmqg/C0BhYk=@vger.kernel.org X-Gm-Message-State: AOJu0YxQXVNhMVn4/ZPGZoleC/jNym3NQQoa5OVBJkC0hinCB8Oj1UGd EyY3mBjHJ1b0JpaNv7zBa8Am7j1Q1+mrOEaWobvv8dwNmKjV0ja6un8PdIpyvBg= X-Gm-Gg: ASbGncuPYWJKBb+SMvYFXDi6hmr67HM818TDtbVgwKNI5cUrRL5OscQkr1jjIgix/6b 5pfVSSd3nAPQ47v0ZXOmxDkIgyTs0a+NwH+I9uySjT3Vknb91EH+kOKLBa/g5wTdN6J8zCNoCPC fh6ejGtYEvAdWKD/bHsabT++RlQqdtKfEl9VDH3I0C3/xawnY4y9SqMOjVprTQbwlirUZbmN4On xBd0EgzOmSt7WWvCJg8e/vrgFNANM8vtQfq0whY+nkvB+Td+/uGk76IH0aRMpHzWOE4egHLGJE5 V4nKVs6zWVENQJ9nOVnARNcTbPh6VNCh9NeCX5SbRUh27JbvJwY= X-Google-Smtp-Source: AGHT+IFSClu7d5x/EKBK2U9rNLPTV0CRIKMtMGD/M+3v4fEe5EoA6+CF5GbxPDsD14QroLyqyRmiZg== X-Received: by 2002:a05:6512:3d0e:b0:549:5989:bb89 with SMTP id 2adb3069b0e04-54d6e65911dmr1973786e87.35.1745102187044; Sat, 19 Apr 2025 15:36:27 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:26 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:10 +0200 Subject: [PATCH v6 23/31] ARM: entry: Stop exiting syscalls like IRQs Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-23-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The syscalls are issued as software interrupts, and to this point they were sharing code with the other exception handlers, but this does not work with generic entry. Make syscall_exit_to_user_mode do what irqentry_exit_to_user_mode does at it's tail, and drop the invocations of irqentry_exit_to_user_mode from the syscall path so that these are now exception-exclusive. Split ret_to_user and ret_to_user_from_irq into two distinct execution paths. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-common.S | 14 ++++++++++++-- arch/arm/kernel/entry.c | 4 ++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 5385574c4339714f3d8b5ab6894f27466b89f932..e2ac6d3216b6828d948d60c424f= f95ccdad12331 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -42,7 +42,6 @@ ret_fast_syscall: /* do_rseq_syscall needs interrupts enabled. */ mov r0, sp @ 'regs' bl syscall_exit_to_user_mode - asm_irqentry_exit_to_user_mode =20 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase_on_task_stack @@ -62,6 +61,18 @@ ENTRY(ret_to_user) enable_irq_notrace @ enable interrupts mov r0, sp @ 'regs' bl syscall_exit_to_user_mode + ldr r1, [tsk, #TI_FLAGS] + movs r1, r1, lsl #16 + beq 1f + mov r0, sp @ 'regs' + bl do_work_pending +1: +#ifdef CONFIG_GCC_PLUGIN_STACKLEAK + bl stackleak_erase_on_task_stack +#endif + restore_user_regs +ENDPROC(ret_to_user) + ENTRY(ret_to_user_from_irq) ldr r1, [tsk, #TI_FLAGS] movs r1, r1, lsl #16 @@ -76,7 +87,6 @@ no_work_pending: #endif restore_user_regs ENDPROC(ret_to_user_from_irq) -ENDPROC(ret_to_user) =20 /* * This is how we return from a fork. diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 0e3960844b94b14325eb00ce7dd791b36c43ac3c..88a7a699306ab61153d57333c26= 266b9161f5466 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -30,6 +30,10 @@ void syscall_exit_to_user_mode(struct pt_regs *regs) local_irq_disable(); if (has_syscall_work(flags)) do_work_pending(regs, flags); + + trace_hardirqs_on(); + /* This context tracking call has inverse naming */ + user_enter_callable(); } =20 noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs) --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lj1-f180.google.com (mail-lj1-f180.google.com [209.85.208.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 05D9B2045A0 for ; Sat, 19 Apr 2025 22:36:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102191; cv=none; b=erh5AATQvIOw62wGbTl0aaC6y3R5aOPDFlmyln7BJZn6wpeA9+8MuRWy697zRqdHVCuycA9WgMrQazwELhFklfTi8YnuNN2XwBjchUU76JCEmhci3lcJ4ZQAtKobXIJM30Okm7Idp/4ykAvrrRfQfiLfC3Maw93oOGBwnbm72gk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102191; c=relaxed/simple; bh=PJv3fcmmCLyBKcEzeIRm+ZmuyJOawNybbGFw81URgAc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=blo7Z9mZsavhHT6jwMCoL7FStCz8FTqouIbcJrdfkEazQWF9FtfKHW0gJPV0/LE1a/Oq1WX2cl36Yvx2JaTZgrbNyigzaFg0C+ZIrYvdn96fborRVy7Yg+YtRIaa2J5bvtf/i9s6q/gSvuWc1X6ya2OZCWDgap6kcV8z4Gx1SWM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=uLRiDCjY; arc=none smtp.client-ip=209.85.208.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="uLRiDCjY" Received: by mail-lj1-f180.google.com with SMTP id 38308e7fff4ca-30db1bd3bebso29317781fa.2 for ; Sat, 19 Apr 2025 15:36:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102188; x=1745706988; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=o0QkVYjXA/9OCp1QGsNJRd0EN1x8yIqxmjYApguAD+c=; b=uLRiDCjYSxufZ/6T5BxPs7cQjNhSZJ+eC9dET0Y6qJuv+2T33qWikcGykLx3QSVXPi SbRPf+LfbEzyhh6XgpPXB7zV6k6809PmsY7Eo3mWBmwnl0FPzlJNpe/16L/7PGHcSgM7 drXK4fd5gXVr4Ipo666KofsN30v+PJtkWHYqmWi7CMhPOA1/bBMX2PNhue8iR3RaKsdf XcfUutBeR6q7Q1o9+ygd0668e3UfztnZFYmrCWbH5YEZ7M1MjWhBFmHPGyV/pUIagzxa UC9Vl4H6JBS+cIx9651Q6Np5QOapjUgU5XIBr7cLmAQwqP3mQ6rt5nR1NZkCgiCc/8cU mQ7g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102188; x=1745706988; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=o0QkVYjXA/9OCp1QGsNJRd0EN1x8yIqxmjYApguAD+c=; b=klp0bnkEBHxJ04zWSM6l/tD7uninaAz9DLC3Kz0qwGJQWdBr+9OmbTEf9zRB5VVJkA SSzNXPWuIA5wLjpH3EVCrznpzS17yQwIvtYcWE3NHRrTHox0YdoFMo4zO/jk5XWhuCBQ /ktTJhc0wyol+mxn+SuNKfKbZRi2hOvQwcFbd83OlTzCL+HcJ1Vc8GoEgi2HX8ed/VIR frUyByW33GFPSZaC1GNl/CjbO8Mn+qbID8J00kbUhZmDuDwbzbcoJou28WwysS9tYiIv JI2XnJVL1yGCTvWMl8JE2sN5iKjETZRGsA4Nu3Inipu/DlSDfTCqr2antW04mxxFhUEs mUPQ== X-Forwarded-Encrypted: i=1; AJvYcCUye8Rp30ZtnvXrENa6I943A+PEKqRUjwNFCbUhlzuCvrWQp+JorrqMih1ea+suqhfWeqqc0wqvXaLsIBs=@vger.kernel.org X-Gm-Message-State: AOJu0YwHUDwFFcoJYfcImkaAGvpbd7Fxvp7WVOTQ7QrDQWpGssBWQdsp m/XJdoKMtAHtKvrtZbyw8FiczVE8fijoFBIetOoLl+14o+Xt72LGU0zoi55hMMs= X-Gm-Gg: ASbGncsfljqixZuGbrXd0jttJk9nHEdmTxJK6SCb3tVnyj9aVHMx1s+vneNxOJwetga ySDy9WcYoddUhkb9wLwDkGuU6dVsLdlZIvlv5FFuxCTeMN52h4tmhyOruCm91Xen6kGmB0R61P+ FVal9bW8PkI5HdlWlHMaEAGfecSLNQ6cNsDCqx60iaY7Ocf2p0DE1yhw9mMjZP4GAVv2SDKDhzr GZMrK762i95b459TsWM5kZYA1MXz1/sxdwTZAM+/uIu54Sv7lLziDY+Q+YO88gluiqNIHnGjgSQ sWk4qV6jJQd/ud0miyWspNE0JB+HwLsJIuCzyVx3uit0eyArGcE= X-Google-Smtp-Source: AGHT+IHDavBZ93agXbUvQF/6hQ58d4kFKhgOO+0wouRyvNbR41VTEJgISr5/oKDvWNecLDObQqdXtg== X-Received: by 2002:a05:6512:1318:b0:545:2b24:c714 with SMTP id 2adb3069b0e04-54d6e62c9c2mr2159440e87.18.1745102188074; Sat, 19 Apr 2025 15:36:28 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:27 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:11 +0200 Subject: [PATCH v6 24/31] ARM: entry: Complete syscall and IRQ transition to C Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-24-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 This moves over the last few lines of assembly to C. The subtle change is that in return to userspace from syscall (SWI) or interrupt, we need to call do_work_pending() as soon as the thread flags are !=3D 0, just checking for work with _TIF_SYSCALL_WORK is not enough (the machine will freeze if we do that). This is because do_work_pending() does not just handle work: it handles _TIF_NEED_RESCHED, _TIF_SIGPENDING, _TIF_NOTIFY_SIGNAL and _TIF_UPROBE as well. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-common.S | 13 +------------ arch/arm/kernel/entry.c | 19 +++++++++++++------ arch/arm/kernel/signal.c | 3 +-- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index e2ac6d3216b6828d948d60c424ff95ccdad12331..6b0f86786a7d9e656ecbe8c741f= 2edbcbafd2915 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -61,12 +61,7 @@ ENTRY(ret_to_user) enable_irq_notrace @ enable interrupts mov r0, sp @ 'regs' bl syscall_exit_to_user_mode - ldr r1, [tsk, #TI_FLAGS] - movs r1, r1, lsl #16 - beq 1f - mov r0, sp @ 'regs' - bl do_work_pending -1: + #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase_on_task_stack #endif @@ -74,12 +69,6 @@ ENTRY(ret_to_user) ENDPROC(ret_to_user) =20 ENTRY(ret_to_user_from_irq) - ldr r1, [tsk, #TI_FLAGS] - movs r1, r1, lsl #16 - beq no_work_pending - mov r0, sp @ 'regs' - bl do_work_pending -no_work_pending: asm_irqentry_exit_to_user_mode =20 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 88a7a699306ab61153d57333c26266b9161f5466..d7fdb9df33312dd2a914b59512b= 701748f33b597 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -6,11 +6,6 @@ #include #include =20 -static inline bool has_syscall_work(unsigned long flags) -{ - return unlikely(flags & _TIF_SYSCALL_WORK); -} - long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall) { trace_hardirqs_on(); @@ -28,7 +23,11 @@ void syscall_exit_to_user_mode(struct pt_regs *regs) =20 rseq_syscall(regs); local_irq_disable(); - if (has_syscall_work(flags)) + /* + * It really matters that we check for flags !=3D 0 and not + * just for pending work here! + */ + if (flags) do_work_pending(regs, flags); =20 trace_hardirqs_on(); @@ -45,6 +44,14 @@ noinstr void irqentry_enter_from_user_mode(struct pt_reg= s *regs) =20 noinstr void irqentry_exit_to_user_mode(struct pt_regs *regs) { + unsigned long flags =3D read_thread_flags(); + + /* + * It really matters that we check for flags !=3D 0 and not + * just for pending work here! + */ + if (flags) + do_work_pending(regs, flags); trace_hardirqs_on(); /* This context tracking call has inverse naming */ user_enter_callable(); diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 03b20637a2e1ca6f327223c9132915a97a9c4697..a39ee14ec5b70b3738ecef53770= 9326ef1e8217c 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -598,8 +598,7 @@ static void arch_do_signal_or_restart(struct pt_regs *r= egs) return; } =20 -asmlinkage void -do_work_pending(struct pt_regs *regs, unsigned int thread_flags) +void do_work_pending(struct pt_regs *regs, unsigned int thread_flags) { /* * The assembly code enters us with IRQs off, but it hasn't --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f47.google.com (mail-lf1-f47.google.com [209.85.167.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E58CF1EDA0B for ; Sat, 19 Apr 2025 22:36:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102192; cv=none; b=dsEqXFOoFkzK2JvVMzubC8P+iWDxgVDqOxH0+VOS0nuXwX0D1Xp/TwCHl5EEyOVldZrsm4a+n9lWllfszoH5zXLvs77tXXkMnUjOoQfgIpqvWTSKsogZ5rRG/zjjVx+sOXrwbyG38jzNx2Y96cGCijlWa0EJV2eWuk5H2bUTzSM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102192; c=relaxed/simple; bh=F7VvDgUlgfGOSB+9rshUd3mbttPd084qdopa/4Grg/E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=WfbaV6mUE669k/kceTEVpxFKu2pClxhX2ndDoJRXTQ8IPoZ17623EPabqnI8pw+KRYbETcn9iGa0rZBXnhLoNun92d3Lk3OEkpDGNUBLf4Q3oFytYn62qOPuToxJFnTeysj68W3fLtcfg4j0iWEaYhAJYR7EV1djNnttn/gaSYM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=pLO9RplD; arc=none smtp.client-ip=209.85.167.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="pLO9RplD" Received: by mail-lf1-f47.google.com with SMTP id 2adb3069b0e04-54c090fc7adso3177224e87.2 for ; Sat, 19 Apr 2025 15:36:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102189; x=1745706989; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=qw0V66m60nCqUZ6I3CWtDCcAEKaevGAZ9HVr27fyCOs=; b=pLO9RplDb31kh7PoBdc3jip4s63wga1B51vzrwhdQvh2kOKE4dd9y2KFdffwMC2Ehg XmAtQIAuS+96CjUpV77bKOJpXC519p6dJnpcPWTVoRpXJaOJR2ZHtSken8g+13wPfMiL i0C/s9BCXKKiLbiGYPkH84P7OqEY5KvrKTZpAk/sY5aD36rTJgxKM3CdpZApRiwLtd0a Fc86Lvo7CB+2uxS055iRDIEbLiQ2ANYSVrGW+YcPtiiPd0H4Ta0o+LAVR0vLtyn1VlV9 +jwME1h7Tc7ncib6wWUnlmYmjqIq6eP1xO0F6FlWiqOH2WPMqO9pg/H3rGWQd5nhA4A0 mxYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102189; x=1745706989; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qw0V66m60nCqUZ6I3CWtDCcAEKaevGAZ9HVr27fyCOs=; b=q6E70NnDdpbsnosgbPGafRGn7Txwjm1K0vaEvzLAhdH6lwwS4JUSF1F9DLZKXWonei l66D08VvjFv+VGVaS5okwhvGjKLWMNNLXU9uSwpQfhHA4KOdyuBJ+BEB1Nwh9x/eOTrl H/fHI38pPmqTJVhmGC1P0UOhduL/13skNUR3dEO5+gtwv2eDxwH0Je3Aag1FbwFAHJwE wzZNa/xQX4rZoJXZJqIC3q63rzgkZFFY3v/mtjcHM5RKJTrxeTmgWkFqMfGB4PicdmnV Y54lAjDnG5dGwrgRke5xDiwrAypdKqLJveNiO/+rAijguh2QQ/OQNyi0COo6YvJghX3h jpJg== X-Forwarded-Encrypted: i=1; AJvYcCUc+RsO6q7KtDOyXA1kO2MQctQxRFzvnMKlNzmS3IZ2Mqr6gEP1i7ojTgzmVf77ls33xlyRzNKI1L8Hkfo=@vger.kernel.org X-Gm-Message-State: AOJu0Ywhle7YmdAsYN08LlrFDYkzBJWHmk2uj8wYt1hXdYvmZlI2xQb4 TZeALMU4jSg0uyM0762j8Zi9JA8cYJzuxSPMo2gpeGT0dvKh/ig3cWu9a40Ye/w= X-Gm-Gg: ASbGncsRnriXMG9RcQo/rdrUBY6eHcVDPqVjKx4to/IRDrS67oJQi3a77OY6IvO9Kae klqH4kMGfucnboXKVwBBnDJ5+ZYse7LVc4idG8h49+9RLW+Ko6NyH+6nWLJL1YobtGk2Uix7nvx dYKKtv0mY8a0MpvWM2wSPioZFsX3HPfIILYeitPRwHbesNd3pk6KVNXGokVfNRcgmcqTAt7DO1E PBD2YZJjRaX0OfFfU0GS7Qja3s+NpjkDxkhuboRutnYbhQEOrUtEA3BJm+iLqBrBBvFaEdMo1iS Ec5l3vwtyE+1NdH9gY2wF6+PxdqW/szSmAKt3S5ffAkeU/OiMv0= X-Google-Smtp-Source: AGHT+IF0LG448Co8asu2b12O+qf9qV9IKjw3budk1sW5xJ+8nJP8Lbabi/R9ROBF67ZAdL1nIqOrww== X-Received: by 2002:a05:6512:1598:b0:545:1d96:d6f7 with SMTP id 2adb3069b0e04-54d6e63528cmr2119221e87.32.1745102188993; Sat, 19 Apr 2025 15:36:28 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:28 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:12 +0200 Subject: [PATCH v6 25/31] ARM: entry: Create irqentry calls from kernel mode Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-25-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 This adds a few calls to C when exceptions enter/exit from the kernel itself, so these can be used for generic entry. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/entry.h | 2 ++ arch/arm/kernel/entry-armv.S | 3 +++ arch/arm/kernel/entry-header.S | 5 +++++ arch/arm/kernel/entry.c | 8 ++++++++ 4 files changed, 18 insertions(+) diff --git a/arch/arm/include/asm/entry.h b/arch/arm/include/asm/entry.h index 8b8cc9a1eefbd00dd75d4e344576fc184a413768..a78bc5054b093120e903f08369f= b8b1a9feb7f81 100644 --- a/arch/arm/include/asm/entry.h +++ b/arch/arm/include/asm/entry.h @@ -12,5 +12,7 @@ long syscall_enter_from_user_mode(struct pt_regs *regs, l= ong); void syscall_exit_to_user_mode(struct pt_regs *regs); void irqentry_enter_from_user_mode(struct pt_regs *regs); void irqentry_exit_to_user_mode(struct pt_regs *regs); +void irqentry_enter_from_kernel_mode(struct pt_regs *regs); +void irqentry_exit_to_kernel_mode(struct pt_regs *regs); =20 #endif /* __ASM_ENTRY_H__ */ diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 3cd5a80b47758867d1db6c3971030370bca1551a..f64c4cc8beda6bcd469e6ff1a1f= 337d52dbbaf9c 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -205,6 +205,9 @@ ENDPROC(__und_invalid) get_thread_info tsk uaccess_entry tsk, r0, r1, r2, \uaccess =20 + mov r0, sp @ 'regs' + bl irqentry_enter_from_kernel_mode + .if \trace #ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_off diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 51c7f93c1ded1db56f173c7aaed8094ef011ff5a..49a9c5cf6fd5fbb917f2ada6c0d= 6cc400b7d3fb3 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -210,6 +210,7 @@ .else @ IRQs off again before pulling preserved data off the stack disable_irq_notrace + #ifdef CONFIG_TRACE_IRQFLAGS tst \rpsr, #PSR_I_BIT bleq trace_hardirqs_on @@ -217,6 +218,10 @@ blne trace_hardirqs_off #endif .endif + + mov r0, sp @ 'regs' + bl irqentry_exit_to_kernel_mode + uaccess_exit tsk, r0, r1 =20 #ifndef CONFIG_THUMB2_KERNEL diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index d7fdb9df33312dd2a914b59512b701748f33b597..674b5adcec0001b7d075d6936bf= b4e318cb7ce74 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -56,3 +56,11 @@ noinstr void irqentry_exit_to_user_mode(struct pt_regs *= regs) /* This context tracking call has inverse naming */ user_enter_callable(); } + +noinstr void irqentry_enter_from_kernel_mode(struct pt_regs *regs) +{ +} + +noinstr void irqentry_exit_to_kernel_mode(struct pt_regs *regs) +{ +} --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 70865204855 for ; Sat, 19 Apr 2025 22:36:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102194; cv=none; b=fhOUI5z9fooso0j0Fp+ZULOBuyY4AjYMsxRD40I2mKhkKOoeC5cZ1mX+VRpcZF7oYINUiwm72xG/Lb65F/I/t7CAmJcZ5wmkxAcy4b3lReTDW8naxxa5/DOWhF95wqxNPNEM8owIL7AiAAqkOqY4jt/uKV+IdE/XtfXyAZt+oDE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102194; c=relaxed/simple; bh=N8RNWlP8Dv7mMzwffncyDVJMLt8wxm1aFqm7vuWENBI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JcbKH9A3SOzrL09nAgosKfD+b81EGsDqTYRfLlkLqMyvyfPkVqCaM7rQxtOhWHX2z7pq6GQ5Czi9UfmIKjB5e+ZJiNJTX5Q2Jk5/QVXGx0B8gk8VUSVGqZeBQEpztLajkry8iCj5wFqiJQmWCp+QZVr9gbmwbDn9juvWb3uOJvQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=R764aesP; arc=none smtp.client-ip=209.85.167.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="R764aesP" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-54d65cb6e8aso3503857e87.1 for ; Sat, 19 Apr 2025 15:36:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102190; x=1745706990; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=FAvsOPeP+oswKyJJsbXrokIjvFxvOZNdow0lpkJuB2U=; b=R764aesPnromGN39qjAQ1HB4wb/UQIyENmAn/8dqtkgxINYKsmPgA/pAgPBHS3lP6m 1mTk/d2ULPez9fJaJHK8hQ/f66lwq+mYeHxq7/jMN1/l7PDT7gB1Ak+36CCSKnRG0LZg oPcBo7swVyXJrFuxZ3ml/5VN3RAVo8nem9l8ujiVfplCPS8M8RwM31MXrLunRwrx9TD4 F8RC+hWO575EYpSOdbGtzAx8VRfSmFePUUkbyAPz7bat77aveH7+u+Tmd+TXbKqQQDGp rYzCo/ea5mud6uZdYn7QvXAyrJOcLcdj2z8Gd7HW70UPH9RzYKCYiGd/4gT0LGMBRLmU 8yCg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102190; x=1745706990; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FAvsOPeP+oswKyJJsbXrokIjvFxvOZNdow0lpkJuB2U=; b=eUSc8nsBj6mOOyvlhvR2B1juw3MBCiQeSY5nuiAuzK/gIeMReByW0JPQ1BQT2YV+s5 FETkSX7CctAtis3P9IHKxI3soMK0SfyytzzNcGBsggrkehUt2EmB5Nev6ENK4JY53Kcm rBC8++5W6hmGF9PYz9M/a1CCFUjq7zg8iopPw6URseilko7bkxnxzd/xQKntx0/qxf5q ZZmz1GilfwRSSoZPw56GrB42+ubW+KZ/fatZOpn5xFDQ5n19+L7rA3giE3J6/uiIep8R zGllur4hApWR5osEiazgUxA3Bb7Kp9mUs/tVlFZ+20wd6iTip89ET1is1Jjsv6hhAaol k+gA== X-Forwarded-Encrypted: i=1; AJvYcCXFvqHB9TmyjvhzWOltzKeE/1juqlFHJuAs1UuqQQgtKBF5Y6EbjqmXxsDLlDdhzafbDw19oBfNm1qjZcY=@vger.kernel.org X-Gm-Message-State: AOJu0YyaMjOzJPgrdCu5d9Yc4D0Fs5j1p+GDJNlJPdx/R68CeeE4Vwm3 wOhO9NWOo3xIfRN5iTpDF/F9OlH+v9Lh/MdciIUg7zitUDCXwMbJe+SpvnJKU4E= X-Gm-Gg: ASbGncsJG7B9AvFK83MhJ821dMoa7YHi3ek+MxR1OLjUi6jrxBWzEM6tkEnKwgp4oHZ NytWjOGAK9bzGf5WPbtFdXYHc/ZVXbW+2Pi+Aur16p5y85PKhXogSkschKZIFnjPhevLBNiGPUr tv0CMioYhunVyzrBZoe5gii35XpY4ZGl7kNKS4T0enNRjgXxGMmIP4iObfzehoco0nViIOquOnN hXBrd30VvJqCz2yIh0+/GHZHnmbYdXvUsfu6+0P2wb6bRw9FqCe9hmx4nHJqFzwBK4JJJnGfTOW OeWlCNomse0jLFdNhV3hEuuxEoPu5VqYMeVY01GpUEGlcX7/83uok3HUtgeNpA== X-Google-Smtp-Source: AGHT+IH/THCTqweTbW4N/TTTzB4n2Pk1gT1TCe7h8Q6RxxoyRxUigVdyth6ikiAYh3mwUJu0bcl/Uw== X-Received: by 2002:a05:6512:234f:b0:546:2f4c:7f4f with SMTP id 2adb3069b0e04-54d6e633de6mr1960703e87.28.1745102190459; Sat, 19 Apr 2025 15:36:30 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:29 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:13 +0200 Subject: [PATCH v6 26/31] ARM: entry: Move in-kernel hardirq tracing to C Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-26-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 Move the code tracing hardirqs on/off into the C callbacks for irqentry_enter_from_kernel_mode() and irqentry_exit_to_kernel_mode(). The semantic difference occurred is that we alsways check the PSR_I_BIT to determine if (hard) interrupts were enabled or not. The assembly has a tweak to avoid this if we are exiting an IRQ since it is obvious that IRQs must have been enabled to get there, but for simplicity we just check it for all exceptions. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-armv.S | 13 ++++--------- arch/arm/kernel/entry-header.S | 19 ++----------------- arch/arm/kernel/entry.c | 5 +++++ 3 files changed, 11 insertions(+), 26 deletions(-) diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index f64c4cc8beda6bcd469e6ff1a1f337d52dbbaf9c..2a789c8834b93475c32dcb6ba58= 54e24ddd8d6e9 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -158,7 +158,7 @@ ENDPROC(__und_invalid) #define SPFIX(code...) #endif =20 - .macro svc_entry, stack_hole=3D0, trace=3D1, uaccess=3D1, overflow_check= =3D1 + .macro svc_entry, stack_hole=3D0 uaccess=3D1, overflow_check=3D1 UNWIND(.fnstart ) sub sp, sp, #(SVC_REGS_SIZE + \stack_hole) THUMB( add sp, r1 ) @ get SP in a GPR without @@ -208,11 +208,6 @@ ENDPROC(__und_invalid) mov r0, sp @ 'regs' bl irqentry_enter_from_kernel_mode =20 - .if \trace -#ifdef CONFIG_TRACE_IRQFLAGS - bl trace_hardirqs_off -#endif - .endif .endm =20 .align 5 @@ -239,7 +234,7 @@ __irq_svc: blne svc_preempt #endif =20 - svc_exit r5, irq =3D 1 @ return from exception + svc_exit r5 @ return from exception UNWIND(.fnend ) ENDPROC(__irq_svc) =20 @@ -303,7 +298,7 @@ ENDPROC(__pabt_svc) =20 .align 5 __fiq_svc: - svc_entry trace=3D0 + svc_entry mov r0, sp @ struct pt_regs *regs bl handle_fiq_as_nmi svc_exit_via_fiq @@ -321,7 +316,7 @@ ENDPROC(__fiq_svc) @ .align 5 __fiq_abt: - svc_entry trace=3D0 + svc_entry =20 ARM( msr cpsr_c, #ABT_MODE | PSR_I_BIT | PSR_F_BIT ) THUMB( mov r0, #ABT_MODE | PSR_I_BIT | PSR_F_BIT ) diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index 49a9c5cf6fd5fbb917f2ada6c0d6cc400b7d3fb3..cfaf14d71378ba14bbb2a42cd36= d48a23838eee1 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -199,26 +199,11 @@ .endm =20 =20 - .macro svc_exit, rpsr, irq =3D 0 - .if \irq !=3D 0 - @ IRQs already off -#ifdef CONFIG_TRACE_IRQFLAGS - @ The parent context IRQs must have been enabled to get here in - @ the first place, so there's no point checking the PSR I bit. - bl trace_hardirqs_on -#endif - .else + .macro svc_exit, rpsr + @ IRQs off again before pulling preserved data off the stack disable_irq_notrace =20 -#ifdef CONFIG_TRACE_IRQFLAGS - tst \rpsr, #PSR_I_BIT - bleq trace_hardirqs_on - tst \rpsr, #PSR_I_BIT - blne trace_hardirqs_off -#endif - .endif - mov r0, sp @ 'regs' bl irqentry_exit_to_kernel_mode =20 diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 674b5adcec0001b7d075d6936bfb4e318cb7ce74..1e1284cc4caed6e602ce36e812d= 535e6fe324f34 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -59,8 +59,13 @@ noinstr void irqentry_exit_to_user_mode(struct pt_regs *= regs) =20 noinstr void irqentry_enter_from_kernel_mode(struct pt_regs *regs) { + trace_hardirqs_off(); } =20 noinstr void irqentry_exit_to_kernel_mode(struct pt_regs *regs) { + if (interrupts_enabled(regs)) + trace_hardirqs_on(); + else + trace_hardirqs_off(); } --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D40B3204C2C for ; Sat, 19 Apr 2025 22:36:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102195; cv=none; b=IzFnn4ohCtHwB7VRkJrPShqqkmxG6tGPBgbjhpA8134S2LTm9WbsYKzxU6fIYJVDXWkRU2XE+WCjJg66JFmhQKGphQI9tc/CsdULOKj5On4ENqD6GbB5D1sTrn/b/OwAOY30pTg5KDEZ/RFAQODRm6j5Lq22itSIAxAorugIaO8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102195; c=relaxed/simple; bh=5X6iwV5/5MBsSlre5eP18+z3VeNcP4Fs0AK70ziyo5U=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=PAu2TPjGCxWT5HWi1F+CXJF5yBp11nD5dlLRZ5sD4FlAYWTH2pXdK8DkftRvWItDE1ydOjW1CV+yQbI69zQwq4bvdXXdpbosVoC+CPV/gQsjJXh+NBawoMkPLAgY7G3VoF2LR3/mY1aoZDbyohTKqubd8PyzdrGUYGdpDZV3ztg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=AgOCASoZ; arc=none smtp.client-ip=209.85.167.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="AgOCASoZ" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-54af20849adso2805649e87.1 for ; Sat, 19 Apr 2025 15:36:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102192; x=1745706992; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=gfgswIG46fDfailpV8Wq3k2rCv5IayqJioTZZoftrUM=; b=AgOCASoZoB8lRh9qNJ1hNf3CxwBkHBWxlW0AxwpTq8fbflKQqHSq/gwbi/eIarvowE UeQbhESpjDGuytma/n6S29ZndAyz9wUVKnwUh5mwpBjqR552xzWuXxHD58uObrUSYTK5 V3SteQ0hzmoIq7GOF2KfsFFLVHJrJxNL/zOx9Zr3l76/z0hTQJSj98awltq9WzTVzzXv XbXHZQlrEC7wEMJOioBPHFXuxmo7NQbGsBENIz1H1BklS/uLaBxfQh78zgVC6Hz7Rzq9 IVDQz+KRJezxwjiipiRep3PC73XPD3AFEA0731M736FJ0FB9g0g4lJ5qFj//v0cYzhOR 5GNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102192; x=1745706992; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=gfgswIG46fDfailpV8Wq3k2rCv5IayqJioTZZoftrUM=; b=NWShSnLYQwRdz5Ba63LAg+QE0cXFWJRzJjSlFoTJBlsZUPZZIGldyiv1UC1Irr7Yff A/ZwnWdeY5pNUz6lZ5OaYYDytJoNJTnARvfk68kSSfSeOT0esxGqfIs2POF+odP8Ecah +5xt++QNt/uK4Pt8xq+vamomN4lIBnZYLkGZ8xhC4IyZ47wGvVF0cSQQX5nuYZW8eZE5 U6czuesBYEj+vDS2ZcqjDVNRzwFATK6mbyDzmEGnUY0jOUeg18BjucdIKDwxpWSoioXs UCjzQba0Q/f3CvI2Io7IqW2zzBs2lX66TCiptFzXDLWaNuwZHv5FVew7KgOTzztEnoso toBA== X-Forwarded-Encrypted: i=1; AJvYcCWZbkK+G0PKrPooKz13fL15dTnNLvrUWjkLpCwRvrTqYxIauG913PsBJQ91WhHdPgJTb4mWCumlXiIdMzc=@vger.kernel.org X-Gm-Message-State: AOJu0Ywhc+n7Qi++g4H4gSnkO6Nc0R/CtOv5wAFe3u1N2kESD/CEJBmB 8KqdjLuNDGNG429mAz2AlEZbZa9F5jjFA/Ejp6IyFEW+MOaiHcnab3q1ugsw/xI= X-Gm-Gg: ASbGncuNHQkkgJGQWe/Mvi/TcHlA+Fc5OlB0OTtahLC+LMtlw14MrOQNRyw95v0Inh4 ta63g9qRL4lnQpklBnGVFnYZjfHFuUk9T957L3oigckTTFadLDPh6tRT6ZWD13AxpiOVsdwgngy acxWLFJulX1EOqOLTyA8wfli9VyRhoKXvTVNYaxUnw6Cufz97nxybqQfRobacI1LWZ1LA/fY9BE xVBEVOqpEojeSciHZm+6UWa/S0ZPwizM9le/EeTgXkeokTfyZLDD3cDxEw7PZDWBPEHl1KJcdqT 1Lm4hx50noBpLKReVusUSY5aL3/A9W15Z30nsnDxu9HeRZtAh1k= X-Google-Smtp-Source: AGHT+IFfnhm1zNJreqEht0x8JKUibYOmGfzmfZxw7zoZa+K3UUB1bVa8BYsj+GgIiEpufBRw+Qi6pw== X-Received: by 2002:a05:6512:a95:b0:54a:fe25:43d1 with SMTP id 2adb3069b0e04-54d6dbc431dmr1799555e87.10.1745102191927; Sat, 19 Apr 2025 15:36:31 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:30 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:14 +0200 Subject: [PATCH v6 27/31] ARM: irq: Add irqstack helper Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-27-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 Add a helper to dispatch IRQ execution to the IRQ stack: call_on_irq_stack() so we can explicitly issue handle_irq() on the IRQ stack from a C program. Cc: Ard Biesheuvel Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/irq.c | 6 ++++++ arch/arm/kernel/irq.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index e1993e28a9ecfd80b55b2677253ac582467e6c14..f99d6b24d8ff56f901e4a817c61= a1e57b7e532cc 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -43,6 +43,7 @@ #include #include =20 +#include "irq.h" #include "reboot.h" =20 unsigned long irq_err_count; @@ -71,6 +72,11 @@ static void __init init_irq_stacks(void) } } =20 +void call_on_irq_stack(void (*fn)(void *), void *arg) +{ + call_with_stack(fn, arg, __this_cpu_read(irq_stack_ptr)); +} + #ifdef CONFIG_SOFTIRQ_ON_OWN_STACK static void ____do_softirq(void *arg) { diff --git a/arch/arm/kernel/irq.h b/arch/arm/kernel/irq.h new file mode 100644 index 0000000000000000000000000000000000000000..80dd5bfe6403d68fc62fab30666= d5645748d329f --- /dev/null +++ b/arch/arm/kernel/irq.h @@ -0,0 +1,2 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +void call_on_irq_stack(void (*fn)(void *), void *arg); --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f51.google.com (mail-lf1-f51.google.com [209.85.167.51]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 816352054F1 for ; Sat, 19 Apr 2025 22:36:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102198; cv=none; b=StpNma5AXg6R+FUBbF9nMLYH/oF0zRkLGAJMrNLNO3krRyo5FoIS7xWYuQuA+B4hKK1Yi5ph7ghL4aUgAwRKTMaQz8jEEYoDIfLhGBeEegnH93AKAPKACOswsntB5ofkxWQfZ7gPwiy3zxfwW3+3w2FmM7tiC8PBIxUZcqgIOD8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102198; c=relaxed/simple; bh=7F4Z+ZqpmoQaDzYjnaHRaqknSXhnb0Ujgo2eMdeOI6o=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oqzyy0Cnsit3/YCh41fFeHr6Ff8GW/3GEaDtHgIYlOZx19Uo7pa1GIRW+Phg2F7fhuYkyfNNmLnWyIuD5M6tU0xFjcop99De+iHmVWPJgZbQdYjpSr2rQJvXQAg9kjoHH7/OLcbd5bSdNm7S2Uj9JuoxLfqkBCkYnXWcvjWVFSE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=livJQ3SA; arc=none smtp.client-ip=209.85.167.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="livJQ3SA" Received: by mail-lf1-f51.google.com with SMTP id 2adb3069b0e04-549b159c84cso3516350e87.3 for ; Sat, 19 Apr 2025 15:36:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102194; x=1745706994; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=B1dTydbxT/he5ujfcuBYp7kBjJRf9omu0Yboc8IpkVs=; b=livJQ3SAmuNlC9J0XYFSREoUI2mUo5vLzxrxtKLxyq+u1gBsplMApQi0LmsnKdgg/A xTcoc0CjTItsBTvSYgzgnAs1MxueSuhTmIiok7jeOV/6Cx2/1Zyw8q1Hq83pditI8Pge Oyuu2hWD5gXMM7VSMgYn1GhhNSPC9qm3b/2Anek+BLaBB9UdSA5STp6eb4nW2CcmXA9Z /b9KQb8E9zDBfkSzdFep856igu+04J3nbQBCXmb27Nu2rsKiXbqNkc20Vd2cm+EIbWl3 4pkRYPwfDlzUKZfysLAMIVR1oMRP7JPXtRe7H0lUUAq3MgxG7SZpqE4A0FhzyrxkJdGC B+Ow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102194; x=1745706994; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=B1dTydbxT/he5ujfcuBYp7kBjJRf9omu0Yboc8IpkVs=; b=O6CeHXYv2IaNsOc1DZMCoZCuVc7dPbOkLz8QTOU9SZdv0lYboxDCImKF3QLBVgel76 qFxlBJIsXN2DeGaUW4LGNi16qMiQwKv6SiWwBGH6xWkqWMbdgSIQ6cXZXfYWQ8dE90VL i7F+cucs0ShKZB4O4rIao61+UW5MkJtLPO/yDqdciUvRXiOYlpooWtPvJuVzn0+JTijH 5Gr6Xtr1iTK3D2th3qBCfqnGz5xs4isDTqzIGxmu2IepbNJj6gcqSCO0TzhFc4Msq5bv ZSR+va9K22B/i2nAyK7xnx99TRw1RCaVe6ObtAT2A0gdmoZyotXYwV3R7+1GpftcINWL RtOg== X-Forwarded-Encrypted: i=1; AJvYcCX4pmweSweGG+BO/scrlNev5BBmhHmxDPak1G5y6iOVdIY8xHaXtULPnt8sn0v2latS8cvACqMSC/dA2p0=@vger.kernel.org X-Gm-Message-State: AOJu0YwV2bGCpf7VmlRjjZ0W1TkutNwngQ6L4DWewRGcZjRzocVFktQ4 wtvh+kBHeQ1c7gWaXLOV0GxXMRokyZZxrL3l2NaLP2YZl4IQWm+L0cMU0sQJFx4= X-Gm-Gg: ASbGncvxR60DbJ5O94zljbqo4zq9tWxzcZ3FOjo2R5bZPF/nOwxNI9g6g+kmzV/irV9 yyNAQKiHOp/jUAYm3UZP1SLNhMCr1nviXsufnYXdcCuXyGFfAMFnuSYjWpNu7oCBuFxvT+sKpX7 Yg+4z1JDJxKpcqu4f9XMm5Mn31wLHvXsJ3ZrsdnMu/RJjiDg3fvYegJhPi3wQ1VYi6G4lj3rUo4 tjKuKmt9/hZVYTuHof1g4hYnUnmE9zjHMkqJJg5ljVMx++NoKFO+0BjASLHpQIar8mB8+qU4HK+ 4EMTqOJbrdvuVe45jRE89W5oCGdJY/Po6RGE1OC7BswwFphU5f0= X-Google-Smtp-Source: AGHT+IHjcZfTEwtYFlp69ImOlDHKyjEOrCWPjQa7Nm5Oo1fXmeYoQdLPgSPhHK9Lj4DC4KZk0NkdFw== X-Received: by 2002:a05:6512:1088:b0:549:4e88:2e6a with SMTP id 2adb3069b0e04-54d6e61d9a7mr1885468e87.6.1745102193457; Sat, 19 Apr 2025 15:36:33 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:32 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:15 +0200 Subject: [PATCH v6 28/31] ARM: entry: Convert to generic entry Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-28-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 This rewrites ARM to use the generic entry. All of the irqentry_* callbacks are collapsed and made to call into the generic entry code that handle the interrupts storing regs context before entry and restoring it after. The syscall_enter_from_user_mode(), syscall_exit_to_user_mode(), do_work_pending() constructs are replaced with generic code. The syscall invocation now enables syscall tracing "work" using the generic callbacks and no extra actions are needed to enable/disable syscall tracing. The old context tracking with user_exit_callable() user_enter_callable() is no longer used. Only CSKY and Xtensa use this deprecated mechanism now. handle_fiq_as_nmi() is retired as the generic entry provides the same functionality in irqentry_nmi_enter() and irqentry_nmi_exit(). Like with the ARM64 proposed patch for generic entry, it is necessary to create a small call "arm_exit_to_user_mode()" that is used for things such as ret_from_fork, i.e. when we create a completely new execution context with a botched return from interrupt. The elaborate checking and switching to IRQ stack in the irq_handler macro was reimplemented in C for this exercise: this was easiest and there was already code making use of the IRQ stack from C for soft interrupts. I have dropped the context tracking (i.e. calling irqentry_enter() and looking for trace conditions) on dabt/pabt i.e. do_DataAbort and do_PrefetchAbort code paths. These are addressed in a separate patch for development/review reasons. I added stubs for PTRACE_SYSEMU and PTRACE_SYSEMU_SINGLESTEP returning -EIO like the UM arch does, since those syscalls are required by generic entry. If someone wants to implement them, the placeholders are there. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/Kconfig | 1 + arch/arm/include/asm/entry-common.h | 66 ++++++++++++++++++++++++++ arch/arm/include/asm/entry.h | 13 ++--- arch/arm/include/asm/ptrace.h | 3 -- arch/arm/include/asm/signal.h | 2 - arch/arm/include/asm/syscall.h | 7 ++- arch/arm/include/asm/thread_info.h | 17 +------ arch/arm/include/asm/traps.h | 1 - arch/arm/include/uapi/asm/ptrace.h | 2 + arch/arm/kernel/entry-armv.S | 50 ++++--------------- arch/arm/kernel/entry-common.S | 34 +++---------- arch/arm/kernel/entry-header.S | 18 ------- arch/arm/kernel/entry.c | 94 ++++++++++++++++++---------------= --- arch/arm/kernel/process.c | 5 +- arch/arm/kernel/ptrace.c | 95 ++-------------------------------= ---- arch/arm/kernel/signal.c | 31 +----------- arch/arm/kernel/syscall.c | 30 ++++-------- arch/arm/kernel/traps.c | 25 ---------- 18 files changed, 161 insertions(+), 333 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 25ed6f1a7c7ae54cae3102c66257de598f04db3c..5a1b1304b354c55e67d37066f8d= 40e035a612327 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -69,6 +69,7 @@ config ARM select GENERIC_CPU_AUTOPROBE select GENERIC_CPU_DEVICES select GENERIC_EARLY_IOREMAP + select GENERIC_ENTRY select GENERIC_IDLE_POLL_SETUP select GENERIC_IRQ_MULTI_HANDLER select GENERIC_IRQ_PROBE diff --git a/arch/arm/include/asm/entry-common.h b/arch/arm/include/asm/ent= ry-common.h new file mode 100644 index 0000000000000000000000000000000000000000..7b1f108512db0001a65911af0df= 4f48197d99e75 --- /dev/null +++ b/arch/arm/include/asm/entry-common.h @@ -0,0 +1,66 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#ifndef _ASM_ARM_ENTRY_COMMON_H +#define _ASM_ARM_ENTRY_COMMON_H + +#include + +#include + +enum ptrace_syscall_dir { + PTRACE_SYSCALL_ENTER =3D 0, + PTRACE_SYSCALL_EXIT, +}; + +static inline unsigned long +arch_prepare_report_syscall_entry(struct pt_regs *regs) +{ + unsigned long ip; + + /* + * IP is used to denote syscall entry/exit: + * IP =3D 0 -> entry + */ + ip =3D regs->ARM_ip; + regs->ARM_ip =3D PTRACE_SYSCALL_ENTER; + + return ip; +} +#define arch_prepare_report_syscall_entry arch_prepare_report_syscall_entry + +static inline void +arch_post_report_syscall_entry(struct pt_regs *regs, + unsigned long saved_reg, long ret) +{ + regs->ARM_ip =3D saved_reg; +} +#define arch_post_report_syscall_entry arch_post_report_syscall_entry + + +static inline unsigned long +arch_prepare_report_syscall_exit(struct pt_regs *regs, + unsigned long work) +{ + unsigned long ip; + + /* + * IP is used to denote syscall entry/exit: + * IP =3D 1 -> exit + */ + ip =3D regs->ARM_ip; + regs->ARM_ip =3D PTRACE_SYSCALL_EXIT; + + return ip; +} +#define arch_prepare_report_syscall_exit arch_prepare_report_syscall_exit + +static inline void +arch_post_report_syscall_exit(struct pt_regs *regs, + unsigned long saved_reg, + unsigned long work) +{ + regs->ARM_ip =3D saved_reg; +} +#define arch_post_report_syscall_exit arch_post_report_syscall_exit + +#endif /* _ASM_ARM_ENTRY_COMMON_H */ diff --git a/arch/arm/include/asm/entry.h b/arch/arm/include/asm/entry.h index a78bc5054b093120e903f08369fb8b1a9feb7f81..df2dd14ab51a586b83b6da6bbf9= bd99858c1ddf4 100644 --- a/arch/arm/include/asm/entry.h +++ b/arch/arm/include/asm/entry.h @@ -4,15 +4,8 @@ =20 struct pt_regs; =20 -/* - * These are copies of generic entry headers so we can transition - * to generic entry once they are semantically equivalent. - */ -long syscall_enter_from_user_mode(struct pt_regs *regs, long); -void syscall_exit_to_user_mode(struct pt_regs *regs); -void irqentry_enter_from_user_mode(struct pt_regs *regs); -void irqentry_exit_to_user_mode(struct pt_regs *regs); -void irqentry_enter_from_kernel_mode(struct pt_regs *regs); -void irqentry_exit_to_kernel_mode(struct pt_regs *regs); +void arm_irq_handler(struct pt_regs *regs, int mode); +void arm_fiq_handler(struct pt_regs *regs); +void arm_exit_to_user_mode(struct pt_regs *regs); =20 #endif /* __ASM_ENTRY_H__ */ diff --git a/arch/arm/include/asm/ptrace.h b/arch/arm/include/asm/ptrace.h index a01c66f0ad907882af2a383e53de8aca68c551e5..8a7de4020cbc016f743dcf515b9= fa83b9bd3e3f0 100644 --- a/arch/arm/include/asm/ptrace.h +++ b/arch/arm/include/asm/ptrace.h @@ -200,8 +200,5 @@ static inline unsigned long it_advance(unsigned long cp= sr) return cpsr; } =20 -int syscall_trace_enter(struct pt_regs *regs); -void syscall_trace_exit(struct pt_regs *regs); - #endif /* __ASSEMBLY__ */ #endif diff --git a/arch/arm/include/asm/signal.h b/arch/arm/include/asm/signal.h index bb753cd3e29fc54186543c48b2aee7b221301a37..45885383646c9f166b0d7ee8008= 0b78776b515e7 100644 --- a/arch/arm/include/asm/signal.h +++ b/arch/arm/include/asm/signal.h @@ -23,6 +23,4 @@ typedef struct { =20 #include =20 -void do_work_pending(struct pt_regs *regs, unsigned int thread_flags); - #endif diff --git a/arch/arm/include/asm/syscall.h b/arch/arm/include/asm/syscall.h index b94fd7ce17f82f0baf06b74800245112e1f13002..a6c8f0e799bb8bf3833161dec70= fc7a1aaa513f6 100644 --- a/arch/arm/include/asm/syscall.h +++ b/arch/arm/include/asm/syscall.h @@ -19,7 +19,12 @@ =20 extern const unsigned long sys_call_table[]; =20 -int invoke_syscall(void *table, struct pt_regs *regs, int scno); +void invoke_syscall(void *table, struct pt_regs *regs, int scno); + +static inline bool arch_syscall_is_vdso_sigreturn(struct pt_regs *regs) +{ + return false; +} =20 static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thre= ad_info.h index d8a45c5a10496aaf806bfeaa0353d5e8985bd6f5..84e58a9cdab63ad264c2cd2bad6= 4239d1912cbe7 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h @@ -74,6 +74,7 @@ struct thread_info { #ifdef CONFIG_ARM_THUMBEE unsigned long thumbee_state; /* ThumbEE Handler Base register */ #endif + unsigned long syscall_work; /* SYSCALL_WORK_ flags */ }; =20 #define INIT_THREAD_INFO(tsk) \ @@ -149,30 +150,14 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, #define TIF_USING_IWMMXT 17 #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 19 -#define TIF_SYSCALL_TRACE 20 /* syscall trace active */ -#define TIF_SYSCALL_AUDIT 21 /* syscall auditing active */ -#define TIF_SYSCALL_TRACEPOINT 22 /* syscall tracepoint instrumentation */ -#define TIF_SECCOMP 23 /* seccomp syscall filtering active */ - =20 #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) #define _TIF_UPROBE (1 << TIF_UPROBE) -#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) -#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) -#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT) -#define _TIF_SECCOMP (1 << TIF_SECCOMP) #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL) #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) =20 -/* Checks for any syscall work in entry-common.S */ -#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \ - _TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP) - -/* - * Change these and you break ASM code in entry-common.S - */ #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ _TIF_NOTIFY_SIGNAL) diff --git a/arch/arm/include/asm/traps.h b/arch/arm/include/asm/traps.h index b888912c2450e0e8eec8139166c7292f283545c7..f8695104c72f2f450092839c7c5= 0920e540e594b 100644 --- a/arch/arm/include/asm/traps.h +++ b/arch/arm/include/asm/traps.h @@ -38,7 +38,6 @@ extern void *vectors_page; =20 asmlinkage void dump_backtrace_stm(u32 *stack, u32 instruction, const char= *loglvl); asmlinkage void do_undefinstr(struct pt_regs *regs); -asmlinkage void handle_fiq_as_nmi(struct pt_regs *regs); asmlinkage void bad_mode(struct pt_regs *regs, int reason); int arm_syscall(int no, struct pt_regs *regs); asmlinkage void baddataabort(int code, unsigned long instr, struct pt_regs= *regs); diff --git a/arch/arm/include/uapi/asm/ptrace.h b/arch/arm/include/uapi/asm= /ptrace.h index 8896c23ccba78ed7e10c7d1b9955124314496dc6..336a5beb282f360e875703045ee= 833974bbd68b2 100644 --- a/arch/arm/include/uapi/asm/ptrace.h +++ b/arch/arm/include/uapi/asm/ptrace.h @@ -33,6 +33,8 @@ #define PTRACE_GETHBPREGS 29 #define PTRACE_SETHBPREGS 30 #define PTRACE_GETFDPIC 31 +#define PTRACE_SYSEMU 32 +#define PTRACE_SYSEMU_SINGLESTEP 33 =20 #define PTRACE_GETFDPIC_EXEC 0 #define PTRACE_GETFDPIC_INTERP 1 diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 2a789c8834b93475c32dcb6ba5854e24ddd8d6e9..498a22f5fa8a6516d1eab584f05= 23c3d6c6e4926 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -36,35 +36,6 @@ #define RELOC_TEXT_NONE #endif =20 -/* - * Interrupt handling. - */ - .macro irq_handler, from_user:req - mov r1, sp - ldr_this_cpu r2, irq_stack_ptr, r2, r3 - .if \from_user =3D=3D 0 - @ - @ If we took the interrupt while running in the kernel, we may already - @ be using the IRQ stack, so revert to the original value in that case. - @ - subs r3, r2, r1 @ SP above bottom of IRQ stack? - rsbscs r3, r3, #THREAD_SIZE @ ... and below the top? -#ifdef CONFIG_VMAP_STACK - ldr_va r3, high_memory, cc @ End of the linear region - cmpcc r3, r1 @ Stack pointer was below it? -#endif - bcc 0f @ If not, switch to the IRQ stack - mov r0, r1 - bl generic_handle_arch_irq - b 1f -0: - .endif - - mov_l r0, generic_handle_arch_irq - bl call_with_stack -1: - .endm - .macro pabt_helper @ PABORT handler takes pt_regs in r2, fault address in r4 and psr in r5 #ifdef MULTI_PABORT @@ -205,9 +176,6 @@ ENDPROC(__und_invalid) get_thread_info tsk uaccess_entry tsk, r0, r1, r2, \uaccess =20 - mov r0, sp @ 'regs' - bl irqentry_enter_from_kernel_mode - .endm =20 .align 5 @@ -223,7 +191,9 @@ ENDPROC(__dabt_svc) .align 5 __irq_svc: svc_entry - irq_handler from_user=3D0 + mov r0, sp @ regs + mov r1, #0 @ from kernel mode + bl arm_irq_handler =20 #ifdef CONFIG_PREEMPTION ldr r8, [tsk, #TI_PREEMPT] @ get preempt count @@ -300,7 +270,7 @@ ENDPROC(__pabt_svc) __fiq_svc: svc_entry mov r0, sp @ struct pt_regs *regs - bl handle_fiq_as_nmi + bl arm_fiq_handler svc_exit_via_fiq UNWIND(.fnend ) ENDPROC(__fiq_svc) @@ -329,7 +299,7 @@ __fiq_abt: stmfd sp!, {r1 - r2} =20 add r0, sp, #8 @ struct pt_regs *regs - bl handle_fiq_as_nmi + bl arm_fiq_handler =20 ldmfd sp!, {r1 - r2} ARM( msr cpsr_c, #ABT_MODE | PSR_I_BIT | PSR_F_BIT ) @@ -420,7 +390,6 @@ ENDPROC(__fiq_abt) .align 5 __dabt_usr: usr_entry uaccess=3D0 - asm_irqentry_enter_from_user_mode kuser_cmpxchg_check mov r2, sp dabt_helper @@ -431,9 +400,10 @@ ENDPROC(__dabt_usr) .align 5 __irq_usr: usr_entry - asm_irqentry_enter_from_user_mode kuser_cmpxchg_check - irq_handler from_user=3D1 + mov r0, sp @ regs + mov r1, #1 @ from user mode + bl arm_irq_handler get_thread_info tsk mov why, #0 b ret_to_user_from_irq @@ -445,7 +415,6 @@ ENDPROC(__irq_usr) .align 5 __und_usr: usr_entry uaccess=3D0 - asm_irqentry_enter_from_user_mode =20 @ IRQs must be enabled before attempting to read the instruction from @ user space since that could cause a page/translation fault if the @@ -470,7 +439,6 @@ ENDPROC(__und_usr) .align 5 __pabt_usr: usr_entry - asm_irqentry_enter_from_user_mode mov r2, sp @ regs pabt_helper UNWIND(.fnend ) @@ -493,7 +461,7 @@ __fiq_usr: usr_entry kuser_cmpxchg_check mov r0, sp @ struct pt_regs *regs - bl handle_fiq_as_nmi + bl arm_fiq_handler get_thread_info tsk restore_user_regs UNWIND(.fnend ) diff --git a/arch/arm/kernel/entry-common.S b/arch/arm/kernel/entry-common.S index 6b0f86786a7d9e656ecbe8c741f2edbcbafd2915..a5a0e757ab23d151485092a078a= f98966e039869 100644 --- a/arch/arm/kernel/entry-common.S +++ b/arch/arm/kernel/entry-common.S @@ -39,10 +39,6 @@ ret_fast_syscall: UNWIND(.fnstart ) UNWIND(.cantunwind ) add sp, sp, #(S_R0 + S_OFF) - /* do_rseq_syscall needs interrupts enabled. */ - mov r0, sp @ 'regs' - bl syscall_exit_to_user_mode - #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase_on_task_stack #endif @@ -60,7 +56,7 @@ ENTRY(ret_to_user) /* do_rseq_syscall needs interrupts enabled. */ enable_irq_notrace @ enable interrupts mov r0, sp @ 'regs' - bl syscall_exit_to_user_mode + bl arm_exit_to_user_mode =20 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase_on_task_stack @@ -69,8 +65,6 @@ ENTRY(ret_to_user) ENDPROC(ret_to_user) =20 ENTRY(ret_to_user_from_irq) - asm_irqentry_exit_to_user_mode - #ifdef CONFIG_GCC_PLUGIN_STACKLEAK bl stackleak_erase_on_task_stack #endif @@ -92,9 +86,10 @@ SYM_TYPED_FUNC_START(ret_from_fork_asm) mov r2, r5 mov r3, r4 bl ret_from_fork - mov r0, #0 -1: get_thread_info tsk - b ret_to_user +#ifdef CONFIG_GCC_PLUGIN_STACKLEAK + bl stackleak_erase_on_task_stack +#endif + restore_user_regs SYM_FUNC_END(ret_from_fork_asm) =20 /*=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D @@ -210,29 +205,12 @@ ENTRY(vector_swi) #else str scno, [tsk, #TI_ABI_SYSCALL] #endif - - /* - * Calling out to C to be careful to save and restore registers. - * This call could modify the syscall number. scno is r7 so we - * do not save and restore r7. - */ - mov r0, sp @ regs - mov r1, scno - push {r4 - r6, r8 - r10, lr} - bl syscall_enter_from_user_mode - pop {r4 - r6, r8 - r10, lr} - mov scno, r0 - mov r1, sp @ put regs into r1 stmdb sp!, {r4, r5} @ push fifth and sixth args mov r0, tbl mov r2, scno @ syscall number from r7 bl invoke_syscall - cmp r0, #0 - beq ret_fast_syscall - /* This path taken when tracing */ - add sp, sp, #(S_R0 + S_OFF) - b ret_to_user + b ret_fast_syscall =20 #if defined(CONFIG_OABI_COMPAT) || !defined(CONFIG_AEABI) /* diff --git a/arch/arm/kernel/entry-header.S b/arch/arm/kernel/entry-header.S index cfaf14d71378ba14bbb2a42cd36d48a23838eee1..abd927f1cc3a4d813cc48bc0461= 91f49f3c0e533 100644 --- a/arch/arm/kernel/entry-header.S +++ b/arch/arm/kernel/entry-header.S @@ -203,10 +203,6 @@ =20 @ IRQs off again before pulling preserved data off the stack disable_irq_notrace - - mov r0, sp @ 'regs' - bl irqentry_exit_to_kernel_mode - uaccess_exit tsk, r0, r1 =20 #ifndef CONFIG_THUMB2_KERNEL @@ -340,20 +336,6 @@ ALT_UP_B(.L1_\@) #endif /* !CONFIG_THUMB2_KERNEL */ .endm =20 -/* - * Context tracking and other mode transitions. Used to instrument transit= ions - * between user and kernel mode. -*/ - .macro asm_irqentry_enter_from_user_mode - mov r0, sp @ regs - bl irqentry_enter_from_user_mode - .endm - - .macro asm_irqentry_exit_to_user_mode - mov r0, sp @ regs - bl irqentry_exit_to_user_mode - .endm - /* * These are the registers used in the syscall handler, and allow us to * have in theory up to 7 arguments to a function - r0 to r6. diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 1e1284cc4caed6e602ce36e812d535e6fe324f34..08b8680233e5aae6e477f9bf15d= 7f06d7fd3e5af 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -1,71 +1,71 @@ // SPDX-License-Identifier: GPL-2.0 #include -#include -#include #include +#include +#include +#include #include +#include #include +#include =20 -long syscall_enter_from_user_mode(struct pt_regs *regs, long syscall) -{ - trace_hardirqs_on(); - local_irq_enable(); - /* This context tracking call has inverse naming */ - user_exit_callable(); - - /* This will optionally be modified later */ - return syscall; -} +#include "irq.h" =20 -void syscall_exit_to_user_mode(struct pt_regs *regs) +static void noinstr handle_arm_irq(void *data) { - unsigned long flags =3D read_thread_flags(); + struct pt_regs *regs =3D data; + struct pt_regs *old_regs; =20 - rseq_syscall(regs); - local_irq_disable(); - /* - * It really matters that we check for flags !=3D 0 and not - * just for pending work here! - */ - if (flags) - do_work_pending(regs, flags); + irq_enter_rcu(); + old_regs =3D set_irq_regs(regs); =20 - trace_hardirqs_on(); - /* This context tracking call has inverse naming */ - user_enter_callable(); -} + handle_arch_irq(regs); =20 -noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs) -{ - trace_hardirqs_off(); - /* This context tracking call has inverse naming */ - user_exit_callable(); + set_irq_regs(old_regs); + irq_exit_rcu(); } =20 -noinstr void irqentry_exit_to_user_mode(struct pt_regs *regs) +noinstr void arm_irq_handler(struct pt_regs *regs, int mode) { - unsigned long flags =3D read_thread_flags(); + irqentry_state_t state =3D irqentry_enter(regs); =20 /* - * It really matters that we check for flags !=3D 0 and not - * just for pending work here! + * If we are executing in usermode, or kernel process context + * (on the thread stack) then switch to the IRQ stack. Else we + * are already on the IRQ stack (or the overflow stack) and we + * can just proceed to handle the IRQ. */ - if (flags) - do_work_pending(regs, flags); - trace_hardirqs_on(); - /* This context tracking call has inverse naming */ - user_enter_callable(); + if (mode =3D=3D 1) + call_on_irq_stack(handle_arm_irq, regs); + else if (on_thread_stack()) + call_on_irq_stack(handle_arm_irq, regs); + else + handle_arm_irq(regs); + + irqentry_exit(regs, state); } =20 -noinstr void irqentry_enter_from_kernel_mode(struct pt_regs *regs) +/* + * Handle FIQ similarly to NMI on x86 systems. + * + * The runtime environment for NMIs is extremely restrictive + * (NMIs can pre-empt critical sections meaning almost all locking is + * forbidden) meaning this default FIQ handling must only be used in + * circumstances where non-maskability improves robustness, such as + * watchdog or debug logic. + * + * This handler is not appropriate for general purpose use in drivers + * platform code and can be overrideen using set_fiq_handler. + */ +noinstr void arm_fiq_handler(struct pt_regs *regs) { - trace_hardirqs_off(); + irqentry_state_t state =3D irqentry_nmi_enter(regs); + + irqentry_nmi_exit(regs, state); } =20 -noinstr void irqentry_exit_to_kernel_mode(struct pt_regs *regs) +asmlinkage void arm_exit_to_user_mode(struct pt_regs *regs) { - if (interrupts_enabled(regs)) - trace_hardirqs_on(); - else - trace_hardirqs_off(); + local_irq_disable(); + irqentry_exit_to_user_mode(regs); } diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 81c1c3f988344185917cf4e53d0d8ee47ae912f4..a59ad5fdaaf51f653c352884bbd= d10d1211b2669 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c @@ -25,6 +25,7 @@ #include #include #include +#include =20 #include #include @@ -248,8 +249,8 @@ __visible void ret_from_fork(struct task_struct *prev, = struct pt_regs *regs, * execve() syscall. */ } - - /* syscall_exit_to_user_mode(regs); here once we switch to generic entry = */ + local_irq_enable(); + syscall_exit_to_user_mode(regs); } =20 int copy_thread(struct task_struct *p, const struct kernel_clone_args *arg= s) diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c index ac7b98ae47249b4a00fc1cb871bb2d309bfd8c88..d1e5a78c616b0e71f9466c201b7= 4e06ce0d7a08f 100644 --- a/arch/arm/kernel/ptrace.c +++ b/arch/arm/kernel/ptrace.c @@ -27,9 +27,6 @@ #include #include =20 -#define CREATE_TRACE_POINTS -#include - #define REG_PC 15 #define REG_PSR 16 /* @@ -737,6 +734,11 @@ long arch_ptrace(struct task_struct *child, long reque= st, ret =3D ptrace_write_user(child, addr, data); break; =20 + case PTRACE_SYSEMU: + case PTRACE_SYSEMU_SINGLESTEP: + ret =3D -EIO; + break; + case PTRACE_GETREGS: ret =3D copy_regset_to_user(child, &user_arm_view, REGSET_GPR, @@ -821,90 +823,3 @@ long arch_ptrace(struct task_struct *child, long reque= st, =20 return ret; } - -enum ptrace_syscall_dir { - PTRACE_SYSCALL_ENTER =3D 0, - PTRACE_SYSCALL_EXIT, -}; - -static void report_syscall_enter(struct pt_regs *regs) -{ - unsigned long ip; - - /* - * IP is used to denote syscall entry/exit: - * IP =3D 0 -> entry - */ - ip =3D regs->ARM_ip; - regs->ARM_ip =3D PTRACE_SYSCALL_ENTER; - - if (ptrace_report_syscall_entry(regs)) - current_thread_info()->abi_syscall =3D -1; - - regs->ARM_ip =3D ip; -} - -static void report_syscall_exit(struct pt_regs *regs) -{ - unsigned long ip; - - /* - * IP is used to denote syscall entry/exit: - * IP =3D 1 -> exit - */ - ip =3D regs->ARM_ip; - regs->ARM_ip =3D PTRACE_SYSCALL_EXIT; - - ptrace_report_syscall_exit(regs, 0); - - regs->ARM_ip =3D ip; -} - -asmlinkage int syscall_trace_enter(struct pt_regs *regs) -{ - int scno; - - if (test_thread_flag(TIF_SYSCALL_TRACE)) - report_syscall_enter(regs); - - /* Do seccomp after ptrace; syscall may have changed. */ -#ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER - if (secure_computing() =3D=3D -1) - return -1; -#else - /* XXX: remove this once OABI gets fixed */ - secure_computing_strict(syscall_get_nr(current, regs)); -#endif - - /* Tracer or seccomp may have changed syscall. */ - scno =3D syscall_get_nr(current, regs); - - if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) - trace_sys_enter(regs, scno); - - audit_syscall_entry(scno, regs->ARM_r0, regs->ARM_r1, regs->ARM_r2, - regs->ARM_r3); - - return scno; -} - -void syscall_trace_exit(struct pt_regs *regs) -{ - /* - * Audit the syscall before anything else, as a debugger may - * come in and change the current registers. - */ - audit_syscall_exit(regs); - - /* - * Note that we haven't updated the ->syscall field for the - * current thread. This isn't a problem because it will have - * been set on syscall entry and there hasn't been an opportunity - * for a PTRACE_SET_SYSCALL since then. - */ - if (test_thread_flag(TIF_SYSCALL_TRACEPOINT)) - trace_sys_exit(regs, regs_return_value(regs)); - - if (test_thread_flag(TIF_SYSCALL_TRACE)) - report_syscall_exit(regs); -} diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index a39ee14ec5b70b3738ecef537709326ef1e8217c..35d2bb3cd2b442dac1645480372= 62e065fbfe12a 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -4,6 +4,7 @@ * * Copyright (C) 1995-2009 Russell King */ +#include #include #include #include @@ -535,7 +536,7 @@ static void handle_signal(struct ksignal *ksig, struct = pt_regs *regs) * the kernel can handle, and then we build all the user-level signal hand= ling * stack-frames in one go after that. */ -static void arch_do_signal_or_restart(struct pt_regs *regs) +void arch_do_signal_or_restart(struct pt_regs *regs) { unsigned int retval =3D 0, continue_addr =3D 0, restart_addr =3D 0; bool syscall =3D (syscall_get_nr(current, regs) !=3D -1); @@ -598,34 +599,6 @@ static void arch_do_signal_or_restart(struct pt_regs *= regs) return; } =20 -void do_work_pending(struct pt_regs *regs, unsigned int thread_flags) -{ - /* - * The assembly code enters us with IRQs off, but it hasn't - * informed the tracing code of that for efficiency reasons. - * Update the trace code with the current status. - */ - trace_hardirqs_off(); - do { - if (likely(thread_flags & _TIF_NEED_RESCHED)) { - schedule(); - } else { - if (unlikely(!user_mode(regs))) - return; - local_irq_enable(); - if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) { - arch_do_signal_or_restart(regs); - } else if (thread_flags & _TIF_UPROBE) { - uprobe_notify_resume(regs); - } else { - resume_user_mode_work(regs); - } - } - local_irq_disable(); - thread_flags =3D read_thread_flags(); - } while (thread_flags & _TIF_WORK_MASK); -} - struct page *get_signal_page(void) { unsigned long ptr; diff --git a/arch/arm/kernel/syscall.c b/arch/arm/kernel/syscall.c index 6f518ec3870fb36a64d1b671b20f96d63a52bf78..ed3ab51283c06c1398ece2ad3ee= 1fae16cd03ee8 100644 --- a/arch/arm/kernel/syscall.c +++ b/arch/arm/kernel/syscall.c @@ -1,25 +1,21 @@ // SPDX-License-Identifier: GPL-2.0 =20 +#include #include #include =20 -static inline bool has_syscall_work(unsigned long flags) -{ - return unlikely(flags & _TIF_SYSCALL_WORK); -} - int invoke_syscall_asm(void *table, struct pt_regs *regs, int scno); __ADDRESSABLE(invoke_syscall_asm); =20 -__visible int invoke_syscall(void *table, struct pt_regs *regs, int scno) +__visible void invoke_syscall(void *table, struct pt_regs *regs, int scno) { - unsigned long flags =3D read_thread_flags(); int ret; =20 - if (has_syscall_work(flags)) { - scno =3D syscall_trace_enter(regs); - if (scno =3D=3D -1) - goto trace_exit_nosave; + scno =3D syscall_enter_from_user_mode(regs, scno); + /* When tracing syscall -1 means "skip syscall" */ + if (scno < 0) { + ret =3D 0; + goto exit_save; } =20 if (scno < NR_syscalls) { @@ -35,13 +31,7 @@ __visible int invoke_syscall(void *table, struct pt_regs= *regs, int scno) ret =3D sys_ni_syscall(); =20 exit_save: - /* Save return value from syscall */ - regs->ARM_r0 =3D ret; - if (!has_syscall_work(flags)) - return 0; - -trace_exit_nosave: - local_irq_enable(); - syscall_trace_exit(regs); - return 1; + syscall_set_return_value(current, regs, 0, ret); + + syscall_exit_to_user_mode(regs); } diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 2e673ebf44abe5e7224acbe4f672bb74730a7f6c..526c6307a80c8dd54941363e72f= bb329386c2906 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -495,31 +495,6 @@ asmlinkage void do_undefinstr(struct pt_regs *regs) } NOKPROBE_SYMBOL(do_undefinstr) =20 -/* - * Handle FIQ similarly to NMI on x86 systems. - * - * The runtime environment for NMIs is extremely restrictive - * (NMIs can pre-empt critical sections meaning almost all locking is - * forbidden) meaning this default FIQ handling must only be used in - * circumstances where non-maskability improves robustness, such as - * watchdog or debug logic. - * - * This handler is not appropriate for general purpose use in drivers - * platform code and can be overrideen using set_fiq_handler. - */ -asmlinkage void __exception_irq_entry handle_fiq_as_nmi(struct pt_regs *re= gs) -{ - struct pt_regs *old_regs =3D set_irq_regs(regs); - - nmi_enter(); - - /* nop. FIQ handlers for special arch/arm features can be added here. */ - - nmi_exit(); - - set_irq_regs(old_regs); -} - /* * bad_mode handles the impossible case in the vectors. If you see one of * these, then it's extremely serious, and could mean you have buggy hardw= are. --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f53.google.com (mail-lf1-f53.google.com [209.85.167.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5391F205ADA for ; Sat, 19 Apr 2025 22:36:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102198; cv=none; b=X1hbVPX3PtgbMS2zK/H/r53YsMnSer9wMSx+qZt76d37+YuU1OkckwPVhiWx+ORhhHTQBagNQf6cxoLoCfWhk2bmZlqw9MnQ+LLmA88Bafy4W18O1ooW0Vodri18RI1JP8NFgEx/hhCgmOg0up7oPU3hzCUpiqGvbSbnWOs4dyM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102198; c=relaxed/simple; bh=CzfCDEt9+I9JJGzQxTK0gYuGEqBtYaoR8Ot9ml0a5C8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QX00IKKOB7Pre/caLCxqiSc7Jszb/y1zAWOpe2ekptOSZaD2B/sMGmtCTfG0BhqRhBWpx1VNTSYqm11cZCJxQJh/OMdUGnwuak7RCa05v7kLxf2dQPdS4TQF2JmgGO2CQcZCWHmdYxgmSNcHdzpdUvt8Ksv1R7xoqXrEb1u+3Mo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=qbGNjj5G; arc=none smtp.client-ip=209.85.167.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="qbGNjj5G" Received: by mail-lf1-f53.google.com with SMTP id 2adb3069b0e04-5493b5bc6e8so4051353e87.2 for ; Sat, 19 Apr 2025 15:36:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102194; x=1745706994; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=i1nHLhPzci00uDFYrIjAPuXCUFMrFbVsdBm05lwc/W4=; b=qbGNjj5GHXEXtZBaMRW76MVb+qabZ9p++sN9ESgE6yo3nb8b2V4ZlJu45BY+g7C4Z3 DMlclURQw1qFXPGxYDkFmtN/2gy+5BF1tENiY8o6jjgf60ZubQBCqT2sb1X6zbzi+Zvw +QEUFBUwtEzGTvcHL6nyArUC2PkQ9Ip8b9pNr0vLTtjtWgLpFYUVsL2Ro6Th0XBo3Bow ia9hqvZ3zhge+Juh4MSbQpcBjtio3a/YuaGD8WwxPmMOp0KJWEOcOXSDMIkib/n+C9tN ttlt6zaIktuLrWJejJgl9xSQ1Kg6A/gup4ikuLsYxy3ywO1Twfy0Yud7w+spw8OXjpXC ggdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102194; x=1745706994; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=i1nHLhPzci00uDFYrIjAPuXCUFMrFbVsdBm05lwc/W4=; b=l/qIHIrhPjEL+SoGSBlISnZRstFQtOfF4OJPpA9hywFduVEC8tOQSVbfL0MTmi2d9c 8/e8GbKF8FvHL6r+oM4DIECEbaEBtueNu3P4vRrq+wobKQdkwgMUihbkpsA+BzjZiaVE 6R3teHX66wNzCrwUNQrhGtjpP+cvAGZ9Pgx4Pwn3WaIALQ2+/XygMEB0igY8WqwyhlHj B093o+iWSKWQROKMfDCEh6v/uUTbkNhzXU2FQ17SGP7rxOKWnw1Q+Bb4ywPQ1IEPmJP+ vZNZv5shu3yiTwokCR5U7wRmF0Gh8NJVTXDA18/vOT7y6sVV0BkSFp5+TV7Sd/stCVQO s40Q== X-Forwarded-Encrypted: i=1; AJvYcCX3CgNqXvkl2dB58p1gbZiiHcsNKenz4CtIxB6/Y3dhvrfvaZGoR+h8KpJckl0X3SqtccoFWuf2+rt1xLo=@vger.kernel.org X-Gm-Message-State: AOJu0YxBwVAybCivkVHlhjPBXdzFtejH+oONtcwtY2xuX91Kt/+s9qGo DTpHloMrnmTsiSrwuI+mVhiCgJrI3t311X1zgAoyGA/9Z65LjIxjZtnK1IGhfJk= X-Gm-Gg: ASbGncuSeRn7V3tWQuhTreo93pfgtneM+SLhMXH3mpbVvQw3oak/B3kThqWQHJh+E55 2QFgQawLr5NnBEdqbJZe3mxOuFM5KvsqT69ugpTJPK/NLv9B/6RLapYqEXQoHrQCutDmSnGbfN4 ArXYxd40zzhsbWO9li7fpdhrUt4PgBKKI1VkOkIjgsIU6L2EulP9xCyFLq/n+bEZYCodC+6MJ+r qZhuXaFnUuJc9spIeZiX1YlY1ypc6GiGvGbkQusiVtNx2l7iUHsJHeyGuIdk9xIB2uSo68tyPuB MOxQ5F7dksG3PeMo7tCA7sC8gGMZ0SU1t81ql/XihI8fZIAzs0E= X-Google-Smtp-Source: AGHT+IE6l5qP5DGTLy4Ptn2H1Xz57Z4Q2oJKbYb+kGrNvk2+Du1tz16uHmlRf14y0ssnW/7d8csuFA== X-Received: by 2002:a05:6512:138b:b0:545:bf4:4bd4 with SMTP id 2adb3069b0e04-54d6e61ba39mr1774812e87.7.1745102194351; Sat, 19 Apr 2025 15:36:34 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:34 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:16 +0200 Subject: [PATCH v6 29/31] ARM: entry: Handle dabt, pabt, and und as interrupts Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-29-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 While it isn't entirely intuitive, it appears that any kind of exception such as data or prefetch abort ("page faults") need to be handled as some kind of "interrupts" when using generic entry. At least this is what other platforms are doing. The same goes for undefined instruction handling, i.e. floating point emulation in the kernel (und-exceptions). This is necessary for the context checking to pass: without this patch, a whole slew of warnings start to trigger from syscall_exit_to_user_mode_prepare() CT_WARN_ON(ct_state() !=3D CT_STATE_KERNEL), i.e. syscalls seems to exit from user mode to user mode (not good), because the page faults screws up the context tracker. This patch restores the order. If this seems like the previous patch introduces a regression that is then fixed in this patch, it can simply be squashed into the former: having this rewrite separately surely makes development and review easier. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/entry.h | 3 +++ arch/arm/include/asm/traps.h | 2 +- arch/arm/kernel/entry-armv.S | 7 +++---- arch/arm/kernel/entry.c | 31 +++++++++++++++++++++++++++++++ arch/arm/kernel/traps.c | 2 +- arch/arm/mm/abort-ev4.S | 2 +- arch/arm/mm/abort-ev4t.S | 2 +- arch/arm/mm/abort-ev5t.S | 4 ++-- arch/arm/mm/abort-ev5tj.S | 6 +++--- arch/arm/mm/abort-ev6.S | 2 +- arch/arm/mm/abort-ev7.S | 2 +- arch/arm/mm/abort-lv4t.S | 36 ++++++++++++++++++------------------ arch/arm/mm/abort-macro.S | 2 +- arch/arm/mm/abort-nommu.S | 2 +- arch/arm/mm/fault.c | 4 ++-- arch/arm/mm/fault.h | 8 ++++---- arch/arm/mm/pabort-legacy.S | 2 +- arch/arm/mm/pabort-v6.S | 2 +- arch/arm/mm/pabort-v7.S | 2 +- 19 files changed, 77 insertions(+), 44 deletions(-) diff --git a/arch/arm/include/asm/entry.h b/arch/arm/include/asm/entry.h index df2dd14ab51a586b83b6da6bbf9bd99858c1ddf4..de722084d5309194e02cb87db64= ec32b9e6cd627 100644 --- a/arch/arm/include/asm/entry.h +++ b/arch/arm/include/asm/entry.h @@ -4,6 +4,9 @@ =20 struct pt_regs; =20 +void arm_und_handler(struct pt_regs *regs); +void arm_dabt_handler(unsigned long addr, unsigned int fsr, struct pt_regs= *regs); +void arm_pabt_handler(unsigned long addr, unsigned int ifsr, struct pt_reg= s *regs); void arm_irq_handler(struct pt_regs *regs, int mode); void arm_fiq_handler(struct pt_regs *regs); void arm_exit_to_user_mode(struct pt_regs *regs); diff --git a/arch/arm/include/asm/traps.h b/arch/arm/include/asm/traps.h index f8695104c72f2f450092839c7c50920e540e594b..0ca98271e10a210225c1714f5b2= 4668cebab2def 100644 --- a/arch/arm/include/asm/traps.h +++ b/arch/arm/include/asm/traps.h @@ -37,7 +37,7 @@ extern void ptrace_break(struct pt_regs *regs); extern void *vectors_page; =20 asmlinkage void dump_backtrace_stm(u32 *stack, u32 instruction, const char= *loglvl); -asmlinkage void do_undefinstr(struct pt_regs *regs); +void do_undefinstr(struct pt_regs *regs); asmlinkage void bad_mode(struct pt_regs *regs, int reason); int arm_syscall(int no, struct pt_regs *regs); asmlinkage void baddataabort(int code, unsigned long instr, struct pt_regs= *regs); diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 498a22f5fa8a6516d1eab584f0523c3d6c6e4926..ae2f952beea7611f0abc7bd299f= c944335a21219 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -230,7 +230,7 @@ __und_fault: ldr r2, [r0, #S_PC] sub r2, r2, r1 str r2, [r0, #S_PC] - b do_undefinstr + b arm_und_handler ENDPROC(__und_fault) =20 .align 5 @@ -449,9 +449,8 @@ __pabt_usr: ENTRY(ret_from_exception) UNWIND(.fnstart ) UNWIND(.cantunwind ) - get_thread_info tsk - mov why, #0 - b ret_to_user + disable_irq_notrace + b ret_to_user_from_irq UNWIND(.fnend ) ENDPROC(__pabt_usr) ENDPROC(ret_from_exception) diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 08b8680233e5aae6e477f9bf15d7f06d7fd3e5af..01e4339ccdb4951e04a89fb91ad= 7c6e1991e09af 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -8,8 +8,39 @@ #include #include #include +#include =20 #include "irq.h" +#include "../mm/fault.h" + +noinstr asmlinkage void arm_und_handler(struct pt_regs *regs) +{ + irqentry_state_t state =3D irqentry_enter(regs); + + do_undefinstr(regs); + + irqentry_exit(regs, state); +} + +noinstr asmlinkage void arm_dabt_handler(unsigned long addr, unsigned int = fsr, + struct pt_regs *regs) +{ + irqentry_state_t state =3D irqentry_enter(regs); + + do_DataAbort(addr, fsr, regs); + + irqentry_exit(regs, state); +} + +noinstr asmlinkage void arm_pabt_handler(unsigned long addr, unsigned int = ifsr, + struct pt_regs *regs) +{ + irqentry_state_t state =3D irqentry_enter(regs); + + do_PrefetchAbort(addr, ifsr, regs); + + irqentry_exit(regs, state); +} =20 static void noinstr handle_arm_irq(void *data) { diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 526c6307a80c8dd54941363e72fbb329386c2906..934708b9eb6f4d615000c0d667d= 1c7cfcd0d2820 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -442,7 +442,7 @@ int call_undef_hook(struct pt_regs *regs, unsigned int = instr) return fn ? fn(regs, instr) : 1; } =20 -asmlinkage void do_undefinstr(struct pt_regs *regs) +noinstr void do_undefinstr(struct pt_regs *regs) { unsigned int instr; void __user *pc; diff --git a/arch/arm/mm/abort-ev4.S b/arch/arm/mm/abort-ev4.S index a10bcb89594dd38ce31ca30bf97d68cf421afc42..68d8ae2f4e9c0955c9f08112b4f= f1887867d550a 100644 --- a/arch/arm/mm/abort-ev4.S +++ b/arch/arm/mm/abort-ev4.S @@ -24,4 +24,4 @@ ENTRY(v4_early_abort) bic r1, r1, #1 << 11 | 1 << 10 @ clear bits 11 and 10 of FSR tst r3, #1 << 20 @ L =3D 1 -> write? orreq r1, r1, #1 << 11 @ yes. - b do_DataAbort + b arm_dabt_handler diff --git a/arch/arm/mm/abort-ev4t.S b/arch/arm/mm/abort-ev4t.S index 14743a2f6997fcae0eeb55f53dec07b7b2ec227c..76c6cfa79e2a32e34b6f35a15c7= 1c1af407956f3 100644 --- a/arch/arm/mm/abort-ev4t.S +++ b/arch/arm/mm/abort-ev4t.S @@ -25,4 +25,4 @@ ENTRY(v4t_early_abort) bic r1, r1, #1 << 11 | 1 << 10 @ clear bits 11 and 10 of FSR tst r3, #1 << 20 @ check write orreq r1, r1, #1 << 11 - b do_DataAbort + b arm_dabt_handler diff --git a/arch/arm/mm/abort-ev5t.S b/arch/arm/mm/abort-ev5t.S index 98c523118820798668bf04d065ad86ea05fb6d2c..fda1e54debc44b380fb3f3af95c= 1f198a9cc008a 100644 --- a/arch/arm/mm/abort-ev5t.S +++ b/arch/arm/mm/abort-ev5t.S @@ -25,7 +25,7 @@ ENTRY(v5t_early_abort) uaccess_disable ip @ disable user access bic r1, r1, #1 << 11 @ clear bits 11 of FSR teq_ldrd tmp=3Dip, insn=3Dr3 @ insn was LDRD? - beq do_DataAbort @ yes + beq arm_dabt_handler @ yes tst r3, #1 << 20 @ check write orreq r1, r1, #1 << 11 - b do_DataAbort + b arm_dabt_handler diff --git a/arch/arm/mm/abort-ev5tj.S b/arch/arm/mm/abort-ev5tj.S index fec72f4fbaf508597d826e58d0dc084ee6e58dd0..a786a7d69e6ae23aa1125ccd41d= eaaaa743601e1 100644 --- a/arch/arm/mm/abort-ev5tj.S +++ b/arch/arm/mm/abort-ev5tj.S @@ -22,12 +22,12 @@ ENTRY(v5tj_early_abort) mrc p15, 0, r0, c6, c0, 0 @ get FAR bic r1, r1, #1 << 11 | 1 << 10 @ clear bits 11 and 10 of FSR tst r5, #PSR_J_BIT @ Java? - bne do_DataAbort + bne arm_dabt_handler do_thumb_abort fsr=3Dr1, pc=3Dr4, psr=3Dr5, tmp=3Dr3 ldreq r3, [r4] @ read aborted ARM instruction uaccess_disable ip @ disable userspace access teq_ldrd tmp=3Dip, insn=3Dr3 @ insn was LDRD? - beq do_DataAbort @ yes + beq arm_dabt_handler @ yes tst r3, #1 << 20 @ L =3D 0 -> write orreq r1, r1, #1 << 11 @ yes. - b do_DataAbort + b arm_dabt_handler diff --git a/arch/arm/mm/abort-ev6.S b/arch/arm/mm/abort-ev6.S index 836dc1299243415faaac1a93dce35ac46ae1a7da..2366236053eb86484cb179ff572= f06db6559426b 100644 --- a/arch/arm/mm/abort-ev6.S +++ b/arch/arm/mm/abort-ev6.S @@ -42,4 +42,4 @@ ENTRY(v6_early_abort) orreq r1, r1, #1 << 11 @ yes. #endif 1: uaccess_disable ip @ disable userspace access - b do_DataAbort + b arm_dabt_handler diff --git a/arch/arm/mm/abort-ev7.S b/arch/arm/mm/abort-ev7.S index 53fb41c24774db985eddc370904aa7666527f538..72b6eba101555651d7afd749fd5= d7715a2964372 100644 --- a/arch/arm/mm/abort-ev7.S +++ b/arch/arm/mm/abort-ev7.S @@ -18,5 +18,5 @@ ENTRY(v7_early_abort) mrc p15, 0, r1, c5, c0, 0 @ get FSR mrc p15, 0, r0, c6, c0, 0 @ get FAR uaccess_disable ip @ disable userspace access - b do_DataAbort + b arm_dabt_handler ENDPROC(v7_early_abort) diff --git a/arch/arm/mm/abort-lv4t.S b/arch/arm/mm/abort-lv4t.S index fbd60a120f6684c56c63cea10b00200765473f1d..3fef9c1479c17bb07652e43e0b8= b0683e00c4b2f 100644 --- a/arch/arm/mm/abort-lv4t.S +++ b/arch/arm/mm/abort-lv4t.S @@ -46,8 +46,8 @@ ENTRY(v4t_late_abort) /* 9 */ b .data_arm_ldmstm @ ldm*b rn, /* a */ b .data_unknown /* b */ b .data_unknown -/* c */ b do_DataAbort @ ldc rd, [rn], #m @ Same as ldr rd, [rn], #m -/* d */ b do_DataAbort @ ldc rd, [rn, #m] +/* c */ b arm_dabt_handler @ ldc rd, [rn], #m @ Same as ldr rd, [rn], #m +/* d */ b arm_dabt_handler @ ldc rd, [rn, #m] /* e */ b .data_unknown /* f */ b .data_unknown =20 @@ -60,7 +60,7 @@ ENTRY(v4t_late_abort) =20 .data_arm_ldmstm: tst r8, #1 << 21 @ check writeback bit - beq do_DataAbort @ no writeback -> no fixup + beq arm_dabt_handler @ no writeback -> no fixup str r9, [sp, #-4]! mov r7, #0x11 orr r7, r7, #0x1100 @@ -81,11 +81,11 @@ ENTRY(v4t_late_abort) addeq r7, r7, r6, lsl #2 @ Undo decrement str r7, [r2, r9, lsr #14] @ Put register 'Rn' ldr r9, [sp], #4 - b do_DataAbort + b arm_dabt_handler =20 .data_arm_lateldrhpre: tst r8, #1 << 21 @ Check writeback bit - beq do_DataAbort @ No writeback -> no fixup + beq arm_dabt_handler @ No writeback -> no fixup .data_arm_lateldrhpost: str r9, [sp, #-4]! and r9, r8, #0x00f @ get Rm / low nibble of immediate value @@ -101,14 +101,14 @@ ENTRY(v4t_late_abort) addeq r7, r7, r6 @ Undo decrement str r7, [r2, r9, lsr #14] @ Put register 'Rn' ldr r9, [sp], #4 - b do_DataAbort + b arm_dabt_handler =20 .data_arm_lateldrpreconst: tst r8, #1 << 21 @ check writeback bit - beq do_DataAbort @ no writeback -> no fixup + beq arm_dabt_handler @ no writeback -> no fixup .data_arm_lateldrpostconst: movs r6, r8, lsl #20 @ Get offset - beq do_DataAbort @ zero -> no fixup + beq arm_dabt_handler @ zero -> no fixup str r9, [sp, #-4]! and r9, r8, #15 << 16 @ Extract 'n' from instruction ldr r7, [r2, r9, lsr #14] @ Get register 'Rn' @@ -117,11 +117,11 @@ ENTRY(v4t_late_abort) addeq r7, r7, r6, lsr #20 @ Undo decrement str r7, [r2, r9, lsr #14] @ Put register 'Rn' ldr r9, [sp], #4 - b do_DataAbort + b arm_dabt_handler =20 .data_arm_lateldrprereg: tst r8, #1 << 21 @ check writeback bit - beq do_DataAbort @ no writeback -> no fixup + beq arm_dabt_handler @ no writeback -> no fixup .data_arm_lateldrpostreg: and r7, r8, #15 @ Extract 'm' from instruction ldr r6, [r2, r7, lsl #2] @ Get register 'Rm' @@ -180,10 +180,10 @@ ENTRY(v4t_late_abort) /* 3 */ b .data_unknown /* 4 */ b .data_unknown /* 5 */ b .data_thumb_reg -/* 6 */ b do_DataAbort -/* 7 */ b do_DataAbort -/* 8 */ b do_DataAbort -/* 9 */ b do_DataAbort +/* 6 */ b arm_dabt_handler +/* 7 */ b arm_dabt_handler +/* 8 */ b arm_dabt_handler +/* 9 */ b arm_dabt_handler /* A */ b .data_unknown /* B */ b .data_thumb_pushpop /* C */ b .data_thumb_ldmstm @@ -193,10 +193,10 @@ ENTRY(v4t_late_abort) =20 .data_thumb_reg: tst r8, #1 << 9 - beq do_DataAbort + beq arm_dabt_handler tst r8, #1 << 10 @ If 'S' (signed) bit is set movne r1, #0 @ it must be a load instr - b do_DataAbort + b arm_dabt_handler =20 .data_thumb_pushpop: tst r8, #1 << 10 @@ -217,7 +217,7 @@ ENTRY(v4t_late_abort) subne r7, r7, r6, lsl #2 @ decrement SP if POP str r7, [r2, #13 << 2] ldr r9, [sp], #4 - b do_DataAbort + b arm_dabt_handler =20 .data_thumb_ldmstm: str r9, [sp, #-4]! @@ -234,4 +234,4 @@ ENTRY(v4t_late_abort) sub r7, r7, r6, lsl #2 @ always decrement str r7, [r2, r9, lsr #6] ldr r9, [sp], #4 - b do_DataAbort + b arm_dabt_handler diff --git a/arch/arm/mm/abort-macro.S b/arch/arm/mm/abort-macro.S index bacf53fd0b70c6307e74ef8601d8dcc7db292700..30bb5e2135862902951b5077b0b= 860fd12ed8c28 100644 --- a/arch/arm/mm/abort-macro.S +++ b/arch/arm/mm/abort-macro.S @@ -20,7 +20,7 @@ orreq \tmp, \tmp, #1 << 11 @ Set L-bit if yes tst \tmp, #1 << 11 @ L =3D 0 -> write orreq \fsr, \fsr, #1 << 11 @ yes. - b do_DataAbort + b arm_dabt_handler not_thumb: .endm =20 diff --git a/arch/arm/mm/abort-nommu.S b/arch/arm/mm/abort-nommu.S index 6e2366a263219b379f4fdb43cc8e5413fb36e52a..573a09529ac7794f8004680ab35= 0750de7c8e15d 100644 --- a/arch/arm/mm/abort-nommu.S +++ b/arch/arm/mm/abort-nommu.S @@ -17,5 +17,5 @@ ENTRY(nommu_early_abort) mov r0, #0 @ clear r0, r1 (no FSR/FAR) mov r1, #0 - b do_DataAbort + b arm_dabt_handler ENDPROC(nommu_early_abort) diff --git a/arch/arm/mm/fault.c b/arch/arm/mm/fault.c index ab01b51de5590bff6c2acaf446d01c589a5f7987..78afb701b34a17d8d841762944e= b5f8af6843dc4 100644 --- a/arch/arm/mm/fault.c +++ b/arch/arm/mm/fault.c @@ -588,7 +588,7 @@ hook_fault_code(int nr, int (*fn)(unsigned long, unsign= ed int, struct pt_regs *) /* * Dispatch a data abort to the relevant handler. */ -asmlinkage void +void do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs) { const struct fsr_info *inf =3D fsr_info + fsr_fs(fsr); @@ -618,7 +618,7 @@ hook_ifault_code(int nr, int (*fn)(unsigned long, unsig= ned int, struct pt_regs * ifsr_info[nr].name =3D name; } =20 -asmlinkage void +void do_PrefetchAbort(unsigned long addr, unsigned int ifsr, struct pt_regs *re= gs) { const struct fsr_info *inf =3D ifsr_info + fsr_fs(ifsr); diff --git a/arch/arm/mm/fault.h b/arch/arm/mm/fault.h index e8f8c190254442a015a6cbc179602589cfddb0ea..36a7e7138c310a8311458207d2b= 694cb44c63b93 100644 --- a/arch/arm/mm/fault.h +++ b/arch/arm/mm/fault.h @@ -37,9 +37,9 @@ static inline int fsr_fs(unsigned int fsr) =20 void do_bad_area(unsigned long addr, unsigned int fsr, struct pt_regs *reg= s); void early_abt_enable(void); -asmlinkage void do_DataAbort(unsigned long addr, unsigned int fsr, - struct pt_regs *regs); -asmlinkage void do_PrefetchAbort(unsigned long addr, unsigned int ifsr, - struct pt_regs *regs); +void do_DataAbort(unsigned long addr, unsigned int fsr, + struct pt_regs *regs); +void do_PrefetchAbort(unsigned long addr, unsigned int ifsr, + struct pt_regs *regs); =20 #endif /* __ARCH_ARM_FAULT_H */ diff --git a/arch/arm/mm/pabort-legacy.S b/arch/arm/mm/pabort-legacy.S index b2ffce4201062e3ec2045364ddc454cf706bab8d..26c62e568638d37133661f4f5b8= dec430593f8eb 100644 --- a/arch/arm/mm/pabort-legacy.S +++ b/arch/arm/mm/pabort-legacy.S @@ -18,5 +18,5 @@ ENTRY(legacy_pabort) mov r0, r4 mov r1, #5 - b do_PrefetchAbort + b arm_pabt_handler ENDPROC(legacy_pabort) diff --git a/arch/arm/mm/pabort-v6.S b/arch/arm/mm/pabort-v6.S index 8686265dc9418b29381942bfd87a937a3234d46e..25abd11a35253bf464fe9fd7fc1= 4fd11bc564dcd 100644 --- a/arch/arm/mm/pabort-v6.S +++ b/arch/arm/mm/pabort-v6.S @@ -18,5 +18,5 @@ ENTRY(v6_pabort) mov r0, r4 mrc p15, 0, r1, c5, c0, 1 @ get IFSR - b do_PrefetchAbort + b arm_pabt_handler ENDPROC(v6_pabort) diff --git a/arch/arm/mm/pabort-v7.S b/arch/arm/mm/pabort-v7.S index 9c70b1a21dc9204f24524df9905fbc077a82f2dc..e05c7d44d307adeba6759213374= b2aa328c693da 100644 --- a/arch/arm/mm/pabort-v7.S +++ b/arch/arm/mm/pabort-v7.S @@ -18,5 +18,5 @@ ENTRY(v7_pabort) mrc p15, 0, r0, c6, c0, 2 @ get IFAR mrc p15, 0, r1, c5, c0, 1 @ get IFSR - b do_PrefetchAbort + b arm_pabt_handler ENDPROC(v7_pabort) --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f49.google.com (mail-lf1-f49.google.com [209.85.167.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E500620766E for ; Sat, 19 Apr 2025 22:36:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102199; cv=none; b=b6H71m1HkpFEY/1HnPyjMPpdxrdqGxVdqcaUI7A8oHVsj3r1NFBIWYedZPMyG75RYL9d0Cvf2GdKZ72axhjMUYRiL8BoDVTuTwoAswl6AT/ogU8wEcxxrH3wTL7l8ZrF9vAepUmDhoe37wFZwUKmYEteZ7RqttOcDMR1eGgaBQw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102199; c=relaxed/simple; bh=BOvtfPt6xNH869woUtCJZ45j9F0mCh3hK8QARZXY+ds=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Sy7WTV5R51ttrIC3X+wmJgs5mXR3XhTgdlKpG8BRxYJF6uRahPAZYHhDl9DHSW/5w+bMoI+yHdvXwFhXl0IO2YpCvpE8tm9gs7jtxw/fd3OKyq2vqMTVyokRrYTwPrDc4AUHAsz3ZMH/5Q6Nu/HNgCC9rTN9C+Fry//4DJFp1YU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=I4NDnZDQ; arc=none smtp.client-ip=209.85.167.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="I4NDnZDQ" Received: by mail-lf1-f49.google.com with SMTP id 2adb3069b0e04-549b159c84cso3516374e87.3 for ; Sat, 19 Apr 2025 15:36:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102196; x=1745706996; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=f8D88jB/ZLUR+u5sD/SlqiLgwtYZ6RyfN75LGR2wihE=; b=I4NDnZDQLnDRX7jBU6jo+J3GuuTtFSoDVZZIP1EH5kldmjFmgWqdiRCyl2lg5gglO8 2Zh00A12sXccZDeI9ucSnvmfYpfSan4N4SStgclZNyoUt+RQgQFu0mN5krGah8MA2q49 opCX2iqAM5XSqrYGayMF1qTzIKqdCkWA7spVW+isa6qIhGIZO1Zwzc+waSTRHNKHEJiG ezihROTKHdhiK5XSzk0iU+XhdNTipAzHladFLTyfylpCepaNcFkrh1mQgrDijpozwKha obnJWpSBm9fTGsbbItxxO0VwRo1XYnvNmqusb1TYoTjSTd7uPlK+UfAUjoXNbmkbqAF6 605A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102196; x=1745706996; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=f8D88jB/ZLUR+u5sD/SlqiLgwtYZ6RyfN75LGR2wihE=; b=nVIYBGjiwbo5EypD90uApHnnyvL9hH7oVk3Fkc4jVP/bw+XNJkIx84Wy4KfwS6AmjZ BrehxJa/9nE2+CyZ4g/gVqDme637WYpbxDFyJNXmx8u31PYoGSQJbAYLqhGeKO85oJf/ 65DYeQCjQe+FCtK+YKH2HzXtIDxC5o2FH15T84pB6dyKnk+wBjWzrvVXEbr24qDMRTIl Y3ZlvvwNRjFyR8SetEskyZ6Z4dHjVSeZqZj3yuGLSzQVrp8EE31xRlgY93D18lvdo+df d4S5BpMxLplvym3LjEkPwlvBaHu804CxgTTqG23nv18ZnIKh3w/mVaQ8srqEmdhTIwBE lhuQ== X-Forwarded-Encrypted: i=1; AJvYcCXF9jyoIELfQxLGOA0sFbRBJeYDas25VSxADhPeqdvMOrgwrGcohhYbKtcfIBImzbnGO9ddtWEh6KmRMds=@vger.kernel.org X-Gm-Message-State: AOJu0YxoYLBYLIHftDt1Z+sPa+ExRT5ZcWpwtuEFtRQeF3+93RSvv3p4 hqufyWiSsLuEZ8XkOdpKSF1Myq5MnZFOYFlA4s0wXJRA7tmfkaQ0LUhkWJDYMao= X-Gm-Gg: ASbGnctEuICegSG4kyJ+ObMv/C1yyLgK645eBgyP117VqAfD81VXG/piyp+SzSv00DW E9qzkpOHnuag9krJra9QIM5E58SPfzqQyOspVql+ZtAIi6u0d68XMQe2w+6ZHyCXiB18OKXIEr5 xkVjYgCLwV/SJmB3Ak6ptktHbwu9kZbRTMswMyPqcltlflJBY3+fzF5+ZJ1u9QRwUNosm/wjpSB F/mybHizNoq47N2yB6BmvgA+wKZGQEZsUFI5XHJ08r6SMxUGm2j/WLsX+IB29EkK6C2CfuIN3hk XwlrslTt1esaA7O5k7Lib63r9WyjFXamq8LlwayOu092ULYJLdk= X-Google-Smtp-Source: AGHT+IHBK8ZZfAXfhtWw4iocc/9sst0szqHvSr6OfamFmJ2B5DuDtCYQs8hP/2Z2Lqta1P1S3o2oQw== X-Received: by 2002:a05:6512:124c:b0:54d:6574:faf1 with SMTP id 2adb3069b0e04-54d6e62be76mr2063101e87.16.1745102195926; Sat, 19 Apr 2025 15:36:35 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:34 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:17 +0200 Subject: [PATCH v6 30/31] ARM: entry: Block IRQs in early IRQ context Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-30-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 When dabt, pabt or und exceptions occur on ARM, ordinary interrupts (IRQs) can still happen. This isn't nice for the kernels context tracker, which expect (when using generic entry at least) that any nested IRQs happens between irqentry_enter() and irqentry_exit(), else it thinks something is fishy. This change blocks interrupts in the pabt, dabt, und and abt exception paths (all of them really) by unconditionally setting PSR_I_BIT in the early exception handler, until after context has been established with irqentry_enter() and before it is exited with irqentry_exit(). Inside the context-tracked exception handler we enable IRQs again, and once we leave it we disable them while exiting the exception. The local_irq_disable() in bad_mode() can be dropped since we are now disabling IRQs in the early assembly exception handler for all exceptions. This seems like not perfect: it seems an interrupt could still occur right before CPSR is set, or right after the userspace registers are restored in ret_from_exception. I would like to know if there is some way to set up these exceptions to inherently block IRQs when handled, until we explicitly allow them between irqentry_enter() and irqentry_exit() or if this is simply the best we can do on ARM for these exceptions to make the context tracker happy. Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/kernel/entry-armv.S | 6 +----- arch/arm/kernel/entry.c | 18 ++++++++++++++++++ arch/arm/kernel/traps.c | 1 - 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index ae2f952beea7611f0abc7bd299fc944335a21219..3dae35b0bb3f440ecaf157a4568= 7bf4690fb8f88 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -416,11 +416,6 @@ ENDPROC(__irq_usr) __und_usr: usr_entry uaccess=3D0 =20 - @ IRQs must be enabled before attempting to read the instruction from - @ user space since that could cause a page/translation fault if the - @ page table was modified by another CPU. - enable_irq - tst r5, #PSR_T_BIT @ Thumb mode? mov r1, #2 @ set insn size to 2 for Thumb bne 0f @ handle as Thumb undef exception @@ -847,6 +842,7 @@ vector_\name: @ mrs r0, cpsr eor r0, r0, #(\mode ^ SVC_MODE | PSR_ISETSTATE) + orr r0, r0, #PSR_I_BIT msr spsr_cxsf, r0 =20 @ diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 01e4339ccdb4951e04a89fb91ad7c6e1991e09af..3881670e0987ee40be6fff32f41= 2edcf4f3ec80a 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -17,8 +17,18 @@ noinstr asmlinkage void arm_und_handler(struct pt_regs *= regs) { irqentry_state_t state =3D irqentry_enter(regs); =20 + /* + * IRQs must be enabled before attempting to read the instruction from + * user space since that could cause a page/translation fault if the + * page table was modified by another CPU. + */ + + local_irq_enable(); + do_undefinstr(regs); =20 + local_irq_disable(); + irqentry_exit(regs, state); } =20 @@ -27,8 +37,12 @@ noinstr asmlinkage void arm_dabt_handler(unsigned long a= ddr, unsigned int fsr, { irqentry_state_t state =3D irqentry_enter(regs); =20 + local_irq_enable(); + do_DataAbort(addr, fsr, regs); =20 + local_irq_disable(); + irqentry_exit(regs, state); } =20 @@ -37,8 +51,12 @@ noinstr asmlinkage void arm_pabt_handler(unsigned long a= ddr, unsigned int ifsr, { irqentry_state_t state =3D irqentry_enter(regs); =20 + local_irq_enable(); + do_PrefetchAbort(addr, ifsr, regs); =20 + local_irq_disable(); + irqentry_exit(regs, state); } =20 diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c index 934708b9eb6f4d615000c0d667d1c7cfcd0d2820..7d557339490e3e6056ad772690f= 340f127f51c51 100644 --- a/arch/arm/kernel/traps.c +++ b/arch/arm/kernel/traps.c @@ -508,7 +508,6 @@ asmlinkage void bad_mode(struct pt_regs *regs, int reas= on) pr_crit("Bad mode in %s handler detected\n", handler[reason]); =20 die("Oops - bad mode", regs, 0); - local_irq_disable(); panic("bad mode"); } =20 --=20 2.49.0 From nobody Fri Dec 19 06:31:30 2025 Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E118B1EE00F for ; Sat, 19 Apr 2025 22:36:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102200; cv=none; b=C47zyY/gb2jrrEhyBV2pVGoEW3dG6k4ZlxTm4vn77g3Vxs5ypdbkUTcdYhSC2Dy70qjJgKPE5uh/jbTiF3JJf3nawTyRPc3KQ91uSd8ppXFpJmcokvNeOXmaK50eAUtiquM63zdv3+HG7fv8o3XTmjeVjRK3WDWb2RyYiKGmcdk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1745102200; c=relaxed/simple; bh=wGNSmSQ5zw3gyNhGvR46HcmOlVbNO9SbE3D0l6D6Lc0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=N03DnVhmrxdnYWRSyVjVQddIXpITJnbSyTLK3jk8leO1lavaYlFIWuWr+gsKpn0ngzUF/11jG0iZszCyBXxmyBh8qNe3RA//HSfJmigOXyTMIo1VtnrxEAqfeeppJ4ZkpujEdJ4GdHejnN+6aUq/2AkVQPdpOZiaLzas0tXKaqk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=QmYOwT5b; arc=none smtp.client-ip=209.85.167.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="QmYOwT5b" Received: by mail-lf1-f46.google.com with SMTP id 2adb3069b0e04-549b116321aso3285680e87.3 for ; Sat, 19 Apr 2025 15:36:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1745102197; x=1745706997; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=aKbKBVNuxHHKFMXQV5jdXdd9fdcW7JzXWBFz1LBqwDs=; b=QmYOwT5bKjnPFENPk96H1Q+1xT6L90R8tCLsQnyxfUkIPXskI7afu9IWPwsRvCGQTM hOeW9gjSKGD8oQ5j8ii7c7oMT/JcyT8pQ6Rhu1RwpQjDIKyMGEFyIhWJ4HOMaHFuhiZM 8TTf704p9EWEHlQnMQFtfRBUPc50ZpQJ9hWLsdfrUvUBeXVOWjXGnKvjyfjR4mKGKABZ xfsal7DCewV+hDxqmiQo/kIRa7n527HmqYNUztEOquq+8e0NKQZBbBypVWldJ6WXHBCO 2OlxSIYgoajr8ztbBI/LC4a0LvhKQ3osIgntloxLTfZbJTf1UrPtrW4Q8w1CY86Qd1WS DvKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745102197; x=1745706997; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aKbKBVNuxHHKFMXQV5jdXdd9fdcW7JzXWBFz1LBqwDs=; b=SeR+i96e2/FDe05ZmjD0iAJO0o/hwOAvXwWJL5wiCRXIDEb9HNn5AUETA+yZf5x8XV nqCuAr7uyWYoWRatIOoKOprPMPeEOdbeTX4EwAZ/8uEzjsst0eoYKpdyZp0TguPsXLvy 1fCaPao6E+LBjpUwpjfV/prGBctmQgGP1F+VAZKhw/hl7pR1jLnLjQVhfYyOSU3I4Sko pkwHQi7CPngERQ7CPPXC0OdyK81YXAy5X+U6qWc85N+nSD8GgNbe6o7om3z6N5YxcV4V W9nFvNqUR6bdcYvh5f2mTPvED6XqqRH6Y7nAx5PWeg3BVajvhQPGycOukChacxTOmOaw cAYg== X-Forwarded-Encrypted: i=1; AJvYcCUf30dHNFmVTWoEOxQYpEUxhJl/sd3GCXdBPS5h0L6a6dNLFU0/i69/tQiRNUVXFbTvbh46Ur3ip73CfYM=@vger.kernel.org X-Gm-Message-State: AOJu0YxEsxBNn10U6MroGFy4lBmR9L6T35S9/UHa4mtase7XQCShKbjk VjI5NVbv/NDngIdq5D2H9pxVVNmzp+vffaqQ8Yc8l0BU/IAYfPJbs980MSjtI4A= X-Gm-Gg: ASbGnctuGU1B3VNioQRG/fF65gPlf5TxgrE7dAzL5Qp9pI5N4zZ7ScVWQGbXkdltQyR 6+uVY/2AT8KuyZ7855deaxinA0q+SVGbfdofGVwsDOxqKfjA7o22TNV6MsGJAj0erhaCT0lAW53 OVxJZZWTX9mKr0Kn9y/dRumHdFXfwqrWYmIWxYGBhVsRf0oRVtCwZuCcneK5dqEv7+Nk0DLrYne 4VvuFCGlUyl/7e08cmn0OF/vBQ4IPvYi3msc2XiKssio174ecsajyEf4jfCDNauxc3wWNX5dIKW NOdBpczv92+WEGMSY3g2EJYhAlEpzzCcnpb1aBnojUvFBpOSzGk= X-Google-Smtp-Source: AGHT+IGEswbN+axVcFAc6ETBdVjgjfsIKWDzjM2+TEM0R4FVCzATThuev3a/7i06beqEJHQx3Z2hMw== X-Received: by 2002:a05:6512:a82:b0:549:8809:ee32 with SMTP id 2adb3069b0e04-54d6e62cbfcmr2154163e87.22.1745102196896; Sat, 19 Apr 2025 15:36:36 -0700 (PDT) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54d6e540daesm535322e87.79.2025.04.19.15.36.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 19 Apr 2025 15:36:36 -0700 (PDT) From: Linus Walleij Date: Sun, 20 Apr 2025 00:36:18 +0200 Subject: [PATCH v6 31/31] ARM: entry: Reimplement local restart in C Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250420-arm-generic-entry-v6-31-95f1fcdfeeb2@linaro.org> References: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> In-Reply-To: <20250420-arm-generic-entry-v6-0-95f1fcdfeeb2@linaro.org> To: Dmitry Vyukov , Oleg Nesterov , Russell King , Kees Cook , Andy Lutomirski , Will Drewry , Frederic Weisbecker , "Paul E. McKenney" , Jinjie Ruan , Arnd Bergmann , Ard Biesheuvel , Al Viro Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Linus Walleij , Thomas Gleixner X-Mailer: b4 0.14.2 The former local restart hack to restart syscalls inside the kernel if we get restart signals while processing a system call was deleted when converting the architecture to generic entry. This makes strace tests fail so the hack is necessary. Now, after the conversion to generic entry, restore the order by reimplementing this with two TIF flags that help us to issue system call restarts immediately in the kernel. This is essentially a reimplementation of commit 81783786d5cf "ARM: 7473/1: deal with handlerless restarts without leaving the kernel" from 2012, but in C, on top of generic entry. Link: http://lists.infradead.org/pipermail/linux-arm-kernel/2012-June/10473= 3.html Link: https://lore.kernel.org/all/1340377626-17075-1-git-send-email-will.de= acon@arm.com/ Acked-by: Thomas Gleixner Acked-by: Paul E. McKenney Signed-off-by: Linus Walleij --- arch/arm/include/asm/thread_info.h | 4 ++++ arch/arm/kernel/signal.c | 17 +++++++++++++---- arch/arm/kernel/syscall.c | 22 ++++++++++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/arch/arm/include/asm/thread_info.h b/arch/arm/include/asm/thre= ad_info.h index 84e58a9cdab63ad264c2cd2bad64239d1912cbe7..09dcaeef645a4ab45f40a14f8d7= b46f408225f81 100644 --- a/arch/arm/include/asm/thread_info.h +++ b/arch/arm/include/asm/thread_info.h @@ -150,6 +150,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, #define TIF_USING_IWMMXT 17 #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ #define TIF_RESTORE_SIGMASK 19 +#define TIF_LOCAL_RESTART 20 +#define TIF_LOCAL_RESTART_BLOCK 21 =20 #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) @@ -157,6 +159,8 @@ extern int vfp_restore_user_hwstate(struct user_vfp *, #define _TIF_UPROBE (1 << TIF_UPROBE) #define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL) #define _TIF_USING_IWMMXT (1 << TIF_USING_IWMMXT) +#define _TIF_LOCAL_RESTART (1 << TIF_LOCAL_RESTART) +#define _TIF_LOCAL_RESTART_BLOCK (1 << TIF_LOCAL_RESTART_BLOCK) =20 #define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | \ _TIF_NOTIFY_RESUME | _TIF_UPROBE | \ diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 35d2bb3cd2b442dac164548037262e065fbfe12a..a4fc6522124fd3ac3df7149ba38= cf4b097196e06 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -541,7 +541,8 @@ void arch_do_signal_or_restart(struct pt_regs *regs) unsigned int retval =3D 0, continue_addr =3D 0, restart_addr =3D 0; bool syscall =3D (syscall_get_nr(current, regs) !=3D -1); struct ksignal ksig; - int restart =3D 0; + bool restart =3D false; + bool restart_block =3D false; =20 /* * If we were from a system call, check for system call restarting... @@ -557,12 +558,12 @@ void arch_do_signal_or_restart(struct pt_regs *regs) */ switch (retval) { case -ERESTART_RESTARTBLOCK: - restart -=3D 2; + restart_block =3D true; fallthrough; case -ERESTARTNOHAND: case -ERESTARTSYS: case -ERESTARTNOINTR: - restart++; + restart =3D true; regs->ARM_r0 =3D regs->ARM_ORIG_r0; regs->ARM_pc =3D restart_addr; break; @@ -593,8 +594,16 @@ void arch_do_signal_or_restart(struct pt_regs *regs) } else { /* no handler */ restore_saved_sigmask(); - if (unlikely(restart) && regs->ARM_pc =3D=3D restart_addr) + if (unlikely(restart) && regs->ARM_pc =3D=3D restart_addr) { + /* + * These flags will be picked up in the syscall invocation code, + * and a local restart will be issued without exiting the kernel. + */ + set_thread_flag(TIF_LOCAL_RESTART); + if (restart_block) + set_thread_flag(TIF_LOCAL_RESTART_BLOCK); regs->ARM_pc =3D continue_addr; + } } return; } diff --git a/arch/arm/kernel/syscall.c b/arch/arm/kernel/syscall.c index ed3ab51283c06c1398ece2ad3ee1fae16cd03ee8..20b59f5dfdc8d2e8c168ac04c22= 44cb6371e5672 100644 --- a/arch/arm/kernel/syscall.c +++ b/arch/arm/kernel/syscall.c @@ -11,6 +11,7 @@ __visible void invoke_syscall(void *table, struct pt_regs= *regs, int scno) { int ret; =20 +local_restart: scno =3D syscall_enter_from_user_mode(regs, scno); /* When tracing syscall -1 means "skip syscall" */ if (scno < 0) { @@ -34,4 +35,25 @@ __visible void invoke_syscall(void *table, struct pt_reg= s *regs, int scno) syscall_set_return_value(current, regs, 0, ret); =20 syscall_exit_to_user_mode(regs); + + /* + * Handle local restart: this means that when generic entry + * calls arch_do_signal_or_restart() because a signal to + * restart the syscall arrived while processing a system call, + * we set these flags for the thread so that we don't even + * exit the kernel, we just restart right here and clear + * the restart condition. + * + * This is done because of signal race issues on ARM. + */ + if (test_thread_flag(TIF_LOCAL_RESTART)) { + if (test_thread_flag(TIF_LOCAL_RESTART_BLOCK)) { + scno =3D __NR_restart_syscall - __NR_SYSCALL_BASE; + /* Make this change visible to tracers */ + task_thread_info(current)->abi_syscall =3D scno; + clear_thread_flag(TIF_LOCAL_RESTART_BLOCK); + } + clear_thread_flag(TIF_LOCAL_RESTART); + goto local_restart; + } } --=20 2.49.0