From patchwork Thu Oct 10 11:33:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 13829988 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 0B1B5CF11D1 for ; Thu, 10 Oct 2024 11:37:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:List-Subscribe:List-Help :List-Post:List-Archive:List-Unsubscribe:List-Id:Cc:To: Content-Transfer-Encoding:Content-Type:MIME-Version:Message-Id:Date:Subject: From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=jEyuiFWgoMlrQ/8epEbwWJkTaCNZnZTgvo3IasEf6I0=; b=v0NTRUXVx6pw2r I/R3bahpuYlE/GYugup1HQCSOCMWMqto6QexAi5d/SKwsIOIz3/YmdI+bImImZjyuFaKLAD64+NhG O4peiNuYoNIZIFSuQTuzldQxGoHCKTqWWliBR5SagD5LT1Zity8g42G5Dk6G3ND8YIZq9QCQb7c4d blpF+QEK1AidYcWwT7ipVhtsyJjDHBufehLCeBCwfCOZQ49/FLjVTuGSDazBMOXDy2ex2lQbiu/hB L2ECfKR3SWa1ZQSFDURu7Ewujn7EM2uKL2VsDWrxjDORpnSM/z5j/IFAuIz+Ueb6qYURPJ6EKfACJ ldERZu8CkUsCy/QmhuiA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1syrTo-0000000CZD2-1KqU; Thu, 10 Oct 2024 11:37:16 +0000 Received: from mail-ej1-x62d.google.com ([2a00:1450:4864:20::62d]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1syrQO-0000000CY99-1CnI for linux-arm-kernel@lists.infradead.org; Thu, 10 Oct 2024 11:33:50 +0000 Received: by mail-ej1-x62d.google.com with SMTP id a640c23a62f3a-a9944c4d5d4so119747466b.0 for ; Thu, 10 Oct 2024 04:33:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1728560022; x=1729164822; darn=lists.infradead.org; h=cc:to:content-transfer-encoding:mime-version:message-id:date :subject:from:from:to:cc:subject:date:message-id:reply-to; bh=jEyuiFWgoMlrQ/8epEbwWJkTaCNZnZTgvo3IasEf6I0=; b=oEY1rN407RLvdmyxDOIMsdNGRxMwSc1Sa/CG9wTeVrpLZlm2JnXXQemGw2mDjydOiA BtHAdu8VryaNCHGxjQ3HhWAmwOGcQbAK1AY98BBre3D7A6/wDhE1AlyhcR3E5l5oea9V ChW3Gt14Cs3zlnAZd3DQhWGaZY5h9zvVdGJ8zNl/euQjiXIM8sftIwPI3+ILQirvRn7V DZ5rf6Am9rv4NhHhT2JV+riWCouQkE9J2WsWjZNaEUXsvuu3QmxD0R2RUXJ2tNG+7aXc jG8xnUdHQGdzPjmWMfKnaxEw00een1+hHUtKe0DSD5k4ndJdyWFo3DCtaaUC+WhrFnVC cNUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728560022; x=1729164822; h=cc:to:content-transfer-encoding:mime-version:message-id:date :subject:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=jEyuiFWgoMlrQ/8epEbwWJkTaCNZnZTgvo3IasEf6I0=; b=q/nZM/Tim8ugGcxnqVi8moM/DwnfYGqPodW4o+2cLyBNJamJSJBzgzZye3oolnE1tM aLV8KoBxkC2UyZ20PehiExlbLeuRcuznW/wsdfPB0ON8TmjviYNntyOQqP8tE2IY+hBL 2NznOSGVz15fEln3oPLMP2c78NTvatimajTWzwv5ubEEH+1jhyIygr6etywYnOxLlUZx M9XtzznuF/uAjwTh1RXCKCgc/3wJwblAAr/msDW8Gh26BUXqXSF4OLsJzDzZmEEI7AEA lCs6J99YrnyQjEh+1SSuQZDnoowvmx4LEbE6CONlTzHHe5K9owdKKjMAsQDcW90Fe1eZ CyoA== X-Gm-Message-State: AOJu0Yx8oZe4lfi/CMJXKrvPxCt5QwNUOXEWQ4KbhDiSnTfDXxAjDTXp mf7CQ9S/fqraQvXOsjIjau0IwEXoqTQx6w0gqAzYPr3y48QapILGP6RYR88JrM0= X-Google-Smtp-Source: AGHT+IG9UpDR2ovzZ66IthivCf3I31e/FfM2orVk5ZJ1TTBxrgXO95elksQlw3k8TUdTAVU1enx42Q== X-Received: by 2002:a17:907:1c82:b0:a99:8629:603a with SMTP id a640c23a62f3a-a998d328e6cmr536255766b.57.1728560022136; Thu, 10 Oct 2024 04:33:42 -0700 (PDT) Received: from lino.lan ([85.235.12.238]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-a99a7f25406sm77619066b.69.2024.10.10.04.33.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Oct 2024 04:33:41 -0700 (PDT) From: Linus Walleij Subject: [PATCH RFC 00/28] ARM: Switch to generic entry Date: Thu, 10 Oct 2024 13:33:38 +0200 Message-Id: <20241010-arm-generic-entry-v1-0-b94f451d087b@linaro.org> MIME-Version: 1.0 X-B4-Tracking: v=1; b=H4sIAJK7B2cC/6tWKk4tykwtVrJSqFYqSi3LLM7MzwNyDHUUlJIzE vPSU3UzU4B8JSMDIxMDSwNj3cSiXN301DygrmTd1LySokrdxJREQxNTY3OLpKRUJaC+gqLUtMw KsJnRSkFuzkqxtbUAH8tUv2gAAAA= To: 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.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20241010_043344_380857_45F2D3BC X-CRM114-Status: GOOD ( 28.96 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org This patch series converts a slew of ARM assembly into the corresponding C code, step by step moving the codebase closer to the expectations of the generic entry code, and as a last step switches ARM over to the generic entry code. This was inspired by Jinjie Ruans similar work for ARM64. The low-level assembly calls into arch/arm/kernel/syscall.c to invoke syscalls from userspace, and to the functions listed in arch/arm/kernel/entry.c for any other transitions to and from userspace. Looking at these functions and the call sites in the assembly on the final result should give a pretty good idea about how this works, and what the generic entry expects from an architecture. To test the code the following seccomp patch is needed on older ARM systems: https://lore.kernel.org/lkml/20241008-seccomp-compile-error-v1-1-f87de4007095@linaro.org There is a git branch you can pull in and test (v6.12-rc1 based): https://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-integrator.git/log/?h=b4/arm-generic-entry-v6.12-rc1 Upsides: - Same code paths as x86, S390, RISCV, Loongarch and probably soon ARM64 is used for the ARM systems. This includes some instrumentation stubs helping out with things we haven't even started to look at such as kmsan and live patching (!). - By introducing the new callbacks to C, we can move away from the deprecated (and I think partly unmaintained) context tracking mechanism for RCU (user_exit_callable(), user_enter_callable()) in favor of what everyone else is using, i.e. calling rcu_irq_enter_check_tick() on IRQ entry. - I think also lockdep is now behaving more according to expectations (the lockdep calls in ARM64 and generic entry seems different and more fine-granular from the ARM32 code) but I am no expert in lockdep so I cannot really tell if this is a real improvement. Downsides: - I had to remove the "fast syscall restart" from Al Viro. I don't know how much it will affect performance, but if this is something we must have, let's try to make the solution generic, i.e. add fast syscall restart in the generic entry code. - The "superfast return to userspace" using just very small assembly snippets to get back to userspace on e.g. IRQs if and only if no instrumentation was compiled in, is no longer possible, since we unconditionally call into code written in C. Testing: - Booted into Versatile Express QEMU (ARMv7), Ux500 full graphic UI (PostmarketOS Phosh, ARMv7 on hardware, Gemini ARMv4 on hardware. No special issues. - Tested some ptrace/strace obviously, such as issuing several instances of "ptrace find /" and let this scroll by in the terminal over some 10 minutes or so. - Turned on RCU torture tests and ran for a while. Seems stable and the test outputs look normal. - Ran stress-ng, which triggers the idle bug below that also appear during boot. - perf top doesn't give any output, I don't really know how to enble interesting stuff in the kernel to run this tool. Help needed. Potential bugs: - This comes up during boot and stress-ng runs: ------------[ cut here ]------------ WARNING: CPU: 0 PID: 0 at kernel/context_tracking.c:128 ct_kernel_exit+0xf8/0x100 CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.12.0-rc1+ #31 Hardware name: ARM-Versatile Express (...) It is emitted in kernel/context_tracking.c, ct_kernel_exit(): WARN_ON_ONCE(ct_nmi_nesting() != CT_NESTING_IRQ_NONIDLE); I don't know exactly what's going on here, but it happens right after CPU1 is brought online at boot, so there might be some unexpected nesting of IPI:s happening when CPU1 is brought up? Open questions: - Generic entry requires PTRACE_SYSEMU and PTRACE_SYSEMU_SINGLESTEP to be defined. I added them but don't even know what they do or if generic entry magically adds support for them (probably not) so I need help here. - I need Al Viro's input on how to deal with the "fast syscall restart" that I bluntly deleted, if we need to reincarnate it in the generic entry or what we shall do here. - I need to test with an OABI rootfs. - Performance impact. If this is major I think it's a no-go, we need to agree on metrics here however and I need suggestions on what to test with. Signed-off-by: Linus Walleij --- Linus Walleij (28): ARM: Prepare includes for generic entry ARM: ptrace: Split report_syscall() ARM: entry: Skip ret_slow_syscall label ARM: process: Rewrite ret_from_fork i C ARM: process: Remove local restart ARM: entry: Invoke syscalls using C ARM: entry: Rewrite two asm calls in C ARM: entry: Move trace entry to C function ARM: entry: save the syscall sp in thread_info ARM: entry: move all tracing invocation to C ARM: entry: Merge the common and trace entry code ARM: entry: Rename syscall invocation ARM: entry: Create user_mode_enter/exit ARM: entry: Drop trace argument from usr_entry macro ARM: entry: Separate call path for syscall SWI entry ARM: entry: Drop argument to asm_irqentry macros ARM: entry: Implement syscall_exit_to_user_mode() ARM: entry: Drop the superfast ret_fast_syscall ARM: entry: Remove fast and offset register restore ARM: entry: Untangle ret_fast_syscall/to_user ARM: entry: Do not double-call exit functions ARM: entry: Move work processing to C ARM: entry: Stop exiting syscalls like IRQs ARM: entry: Complete syscall and IRQ transition to C ARM: entry: Create irqentry calls from kernel mode ARM: entry: Move in-kernel hardirq tracing to C ARM: entry: Add FIQ/NMI C callbacks ARM: entry: Convert to generic entry arch/arm/Kconfig | 1 + arch/arm/include/asm/entry-common.h | 66 ++++++++++++ arch/arm/include/asm/entry.h | 17 +++ arch/arm/include/asm/ptrace.h | 8 +- arch/arm/include/asm/signal.h | 4 - arch/arm/include/asm/stacktrace.h | 2 +- arch/arm/include/asm/switch_to.h | 4 + arch/arm/include/asm/syscall.h | 7 ++ arch/arm/include/asm/thread_info.h | 18 +--- arch/arm/include/asm/traps.h | 2 +- arch/arm/include/uapi/asm/ptrace.h | 2 + arch/arm/kernel/Makefile | 5 +- arch/arm/kernel/asm-offsets.c | 1 + arch/arm/kernel/entry-armv.S | 39 +++---- arch/arm/kernel/entry-common.S | 202 ++++++++++++++---------------------- arch/arm/kernel/entry-header.S | 108 +++++-------------- arch/arm/kernel/entry.c | 59 +++++++++++ arch/arm/kernel/process.c | 22 +++- arch/arm/kernel/ptrace.c | 76 -------------- arch/arm/kernel/signal.c | 57 ++-------- arch/arm/kernel/syscall.c | 31 ++++++ arch/arm/kernel/traps.c | 2 +- 22 files changed, 349 insertions(+), 384 deletions(-) --- base-commit: e1dc5c87445c608a99e508fe4d3102e2b32858ef change-id: 20240903-arm-generic-entry-ada145378bbe Best regards,