From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.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 838651F03C7 for ; Tue, 7 Jan 2025 09:41:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.47 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736242923; cv=none; b=S8nEWfXmZxlYCtXUIjY9hzceAucX1+rPNNlXtcvCL7U1LkzYzXvR0OAB3NhpGyh/ePSwW6MZT6C+46QtnQx9bNUl6om0Znva3rXXCJnFMgdnQhoEW5GQh6ixu0MAQVRsZsX/6tUkc3I3xaKge+O2NlICyVsjRFp9phTJdpln7Qw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1736242923; c=relaxed/simple; bh=Gc3g03WG0FZmvFFKXXN5tHOLJUC8d2Fqv7bWoTCy0TA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=s19oU5qXPeDVj6G6pfG4PFE/43xvZfxQPupthIJQfX02Dh47Kz6u00xcA0wcZEq1dVKwUHvRRf7H2D/O6umqxJhpNzMyQr89MRB42kQKqCn4KGAFz98vlDwjPuy5HvLmr7+7lXJEvLj5VS00/Rq3n7GbSCWthQW0Di+1/kLlLRU= 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=KWFjcfuJ; arc=none smtp.client-ip=209.85.218.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="KWFjcfuJ" Received: by mail-ej1-f47.google.com with SMTP id a640c23a62f3a-aa68b513abcso2839282466b.0 for ; Tue, 07 Jan 2025 01:41:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1736242918; x=1736847718; 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=xYkNHQuv+SACgxNERp8CxEKakLXgFnXCL7ekBiageuE=; b=KWFjcfuJTH1zNq93G1D/kixlOJtTa9Chfd6UfGgKz3NtN0sy+P0fg8Crgl8FPHOhKT xuM0wn7UCdWzhB/pNRfy299SD2VVhzd0Bki0cNifTn2qe9WtsErs9YgDU2EGbSNHdIRV T/e9PjWi76ZXxTeUw01fOiza5EjzaLmFOoV5F/KNo3D0y0DsgkrmbSzqOsYxtiGym8yY GqYS/vuH/STEqLoHiRLzZIxN3/m/EjLAkzvp8+HYfjG1U5oz4JBzcPFnQ937FtAwTJ5n b3KKl0jjrtasIe/w9r8spoAGKdEyhCEuZOCULej2kjAKd2bZe/o/xoYyUymhJrFidL5x aKuQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1736242918; x=1736847718; 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=xYkNHQuv+SACgxNERp8CxEKakLXgFnXCL7ekBiageuE=; b=COu4hQ7T32+9AornwDfkT4iW3wDzwjXZNtwY6Bo7eJOGgIdAEP1xolw7tL6xEH/otv QNnCWndhyyeq4osxkh+ssqjdXzJvHysllK0JlPYNmwKMc/0OBTwwANgD5dFRgEJ3Y5nQ QeqVyT9QdSH/QujmztgUpPp4cCQJCVFzlda1cfUzgitkQijo0W1nDHsvAP0nOTAt9OXK fLcTGjsg73EkfVuNzKXaZiT9sTbjPUwwVDp0H213uH6fDV000IgR7Bll9wnAWYu4oWcm vGlDeddamVaF0+aM9Nze3DacnmAIr9ssos5QmtTit+sFv1FkoOpJxZmDu+AF9zIBbFXF UGsQ== X-Forwarded-Encrypted: i=1; AJvYcCXNp8m7QefIMaAj5AGWKZ2Fk2wttvJWP74074Oj9/Md3q5SDhspaGvv/kN+PEpZN/yGZYcU+4ghl1ZZrhc=@vger.kernel.org X-Gm-Message-State: AOJu0YzQKjFqaFU2ObXP8E6id45WTq4b5jAsQWiNL4CyBEuvr29f3ueB DATRn0PJLVOmV1T/U/f/sCFmEWSY6OX9dBtAm8BOO6L+5n5qq1DXW9wkR5JVgic= X-Gm-Gg: ASbGnctQ4WftfiPHOq/bfy61ivc1ARzOihAaC/skjdsid9MLzNtJbgqIucXyWgWR3uI /w7klBQ1n7XAU2Ig7ySHWqDq9UatKzdmPPfpL23k6PsmHNihJegUtYsUfCETz7SPWP66HUbeTk/ rQ1Cqs0wHVfKgWFLPgiFm90G6l8+H3S+s8bY49ElrXabyogx3DxRZCHQsBFM57nX4oCcJCCaZF/ qXXPa+pw3OWbiyDVUk6WijX2kxl180utYgDi4kFfY9WEASHw+pncf1zqNqOW3iF9LM= X-Google-Smtp-Source: AGHT+IGS1h0tqhv8PFF2VyP7s0fGDYjnRN6TwLkjLD1tgNRKoA7OPaiv3ifCCBh2WK52GnioqRk31A== X-Received: by 2002:a17:907:968a:b0:aab:f014:fc9a with SMTP id a640c23a62f3a-aac2b383cb3mr4464284266b.22.1736242917900; Tue, 07 Jan 2025 01:41:57 -0800 (PST) Received: from [192.168.1.140] ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-aac0f012229sm2356901166b.133.2025.01.07.01.41.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 07 Jan 2025 01:41:57 -0800 (PST) From: Linus Walleij Date: Tue, 07 Jan 2025 10:41:40 +0100 Subject: [PATCH RFC v3 24/30] 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: 7bit Message-Id: <20250107-arm-generic-entry-v3-24-4e5f3c15db2d@linaro.org> References: <20250107-arm-generic-entry-v3-0-4e5f3c15db2d@linaro.org> In-Reply-To: <20250107-arm-generic-entry-v3-0-4e5f3c15db2d@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 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 != 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. 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..6b0f86786a7d9e656ecbe8c741f2edbcbafd2915 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) 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 #ifdef CONFIG_GCC_PLUGIN_STACKLEAK diff --git a/arch/arm/kernel/entry.c b/arch/arm/kernel/entry.c index 88a7a699306ab61153d57333c26266b9161f5466..d7fdb9df33312dd2a914b59512b701748f33b597 100644 --- a/arch/arm/kernel/entry.c +++ b/arch/arm/kernel/entry.c @@ -6,11 +6,6 @@ #include #include -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) rseq_syscall(regs); local_irq_disable(); - if (has_syscall_work(flags)) + /* + * It really matters that we check for flags != 0 and not + * just for pending work here! + */ + if (flags) do_work_pending(regs, flags); trace_hardirqs_on(); @@ -45,6 +44,14 @@ noinstr void irqentry_enter_from_user_mode(struct pt_regs *regs) noinstr void irqentry_exit_to_user_mode(struct pt_regs *regs) { + unsigned long flags = read_thread_flags(); + + /* + * It really matters that we check for flags != 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..a39ee14ec5b70b3738ecef537709326ef1e8217c 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 *regs) return; } -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 -- 2.47.1