From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.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 5C7743264CE for ; Sat, 1 Aug 2026 16:35:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785602136; cv=none; b=hOOgmDO8DWurRqf6yLkB5Akxr0OQP3+Zn5wtekYF1g0NZXbt1la+Ssy7NDSZurHMpwbaMUpy4+pZyTrVQeRT9cG3uWzaZanhHDyUi3RpawOc5aZ0P+Mt6Z1U8kaDH/vizTleQuJg2ubKsYjv2PXYg6b+aO/UDRSSS7BpksyLZrQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785602136; c=relaxed/simple; bh=64VvO8d8INQ3EZrgvb/0fctdpa6TYLY3j8XkRq912js=; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version; b=ny1Js/ga32qQv6XxBm6ZqRS7YAz3i6rTOtDaJuPWEPtuh3vFHWk5VMk6CukkeV7Ns1b1DsBTwWfWCO7zjAz9rm7ZURcZoX1ZTcI90ZTfrD/M0SWYKdvuemV7C470dPGDfemYhP1oLdxgENdpjIajveT9Ew+oobU4FmQdrPGZ49g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hD2HSQfV; arc=none smtp.client-ip=209.85.221.51 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hD2HSQfV" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-4799b3f7c83so1527416f8f.2 for ; Sat, 01 Aug 2026 09:35:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785602132; x=1786206932; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=OlVco+inngiGEnvknyK5vR66wpHcUHEUtQhbuVIVbBw=; b=hD2HSQfVxgJaP7qInf8qgfR3WADClR7Hxuib6WBnEW0Hv5dRRxa+T+vr27nSHoSG1Y sQzNQNfB/Af/5f7pd+aHgBxG1SBLXZ0msfS93wNZgdZMn8NEhDLj764I4ltOBE0Mb8Jh N8P6wfp9fcPWqKNZ88ynq7IIEF6kQucFHuooPdv6+HThFINnS1H9v3V7JbCxn4HYAEzh ulIg/cQRLP7B0yxSQMsWxQoInNl7aF50XM5bU8ulh7LHxID/jB3SHlRaixO/yxfbWOFb Y+h/cU7dG2zGizZaFD6oulom36fJXUYo/EHSIRjV/WIptAw9gr6va7GGQ33KHBeL3Ezh LlMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785602132; x=1786206932; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=OlVco+inngiGEnvknyK5vR66wpHcUHEUtQhbuVIVbBw=; b=TNqn6dDioxPAvVASvxE6tPIGFRaGQDw/TBu2skoPLuxgUP9moP1AeLCx761EtdbDjV pQ/ndGau88GFpQusujrEZPo8M9XeGO5ZtKFDD/F8dRt/V9WEt7EerdBlVQYTr13eJftY QunG0FCfyfcn4sio2N0q/KNRdXZtobeb4S039kzO0zBelJrtB71+Ufg0OhAApOePY221 Or+Bl5EWSZP+pTA5WkeE5HwTlFDLF4DRSmtTEhDCyZTgCsgcyCC5jyypbpQO2HM0GGCA lazneK4vuAX81yCnHPCQsi76uIxAy22BKzbT/LGUzlCs7wZWw0TpbXn5nseid7bVGHdX mMCA== X-Forwarded-Encrypted: i=1; AHgh+RrhPd6E1hG0Rg1fsvAVs26Z0nxIege+HRwyNGFDYffLts3CHusHJfOLEFlDUxGrU7t4XHu4fNuGq8lm1d8=@vger.kernel.org X-Gm-Message-State: AOJu0YzklVQOluZK4RF7Tm2QmhIZPy4dw9w7OjxuE+fIl6lOJIyaJ6NY upUMFOio49TeQJqAhNtK0essHzlBptnp0YONmbrzbCmPvxE5VoyFgKWJ X-Gm-Gg: AR+sD100lhfUPZC1V3d9Qyutd2iPNZw4Zecl5TtUMgA4jNdqoaU/3qsv751U6H1jTdE 052nuzYDdiOahOu9jHzLB6FijkMKWUXBYLQvsElnKS87pHzMVmEa99e8mv/88gjTESL5BNvvdIM EhV/Tp+NzDMZsQ/RW25vTYy9dvtHQToL+poRO2pLy3iXwkxgMNvd/9yhhGwuIp0U4nOIghWlB20 QsgsbPEbwluspTh0GUfeWnShWUTcXW4AoxU2vf+eeOgpM/sG0nd6HOPOOV2su8ytxGPnCSGAInz D/Dw1zTuG4qSthaMY2e/+9R9PfiYbo24fgNuw3tK+aVK2brReWtgFjPckzBQj+KVSkcAFN8uDUU r7Y/CAa1t1lg9Q0PSOd80kOB1I/t+dx8brHqmUJeXjEkuft8Yu3wN3oiMuVPYWtQe2teSoxUPPg KUlrTuYH1+Bm+eAYeUrHky1u1EHHhi9BIIsI4TltG4O9Fbeo94n7R+wvz9Emi8r/QNuShJa8DS8 z7gm104MC0t3Fu02p7VW7LBcRvo1+71WtIuSTzTXCZoEqVS44+vCKizBua6iBsl9KLnuRG+vsJl R+y9GDYcSqgQrzGnAaY7z+Y5EIj3PRVT6twfax9VhF+8I1qO6Ic3J7hk4EPYpZyYlg== X-Received: by 2002:a5d:5f48:0:b0:46a:8fab:eb44 with SMTP id ffacd0b85a97d-47fd729e7b8mr8907476f8f.1.1785602132433; Sat, 01 Aug 2026 09:35:32 -0700 (PDT) Received: from localhost.localdomain (dynamic-2a02-3100-b118-f401-004d-3df1-8834-8499.310.pool.telefonica.de. [2a02:3100:b118:f401:4d:3df1:8834:8499]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-47fd41d1956sm17607243f8f.6.2026.08.01.09.35.30 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Sat, 01 Aug 2026 09:35:31 -0700 (PDT) From: Karl Mehltretter To: Russell King Cc: Karl Mehltretter , Ard Biesheuvel , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org Subject: [PATCH v2] ARM: smp: set current pointer in assembly before jumping into C Date: Sat, 1 Aug 2026 18:35:20 +0200 Message-Id: <20260801163520.74751-1-kmehltretter@gmail.com> X-Mailer: git-send-email 2.39.5 (Apple Git-154) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit With CONFIG_KCOV_INSTRUMENT_ALL=y, secondary CPUs fail to come online on ARMv6K/ARMv7 SMP: CPU1: failed to boot: -38 The compiler inserts a call to __sanitizer_cov_trace_pc() at the entry of secondary_start_kernel(), before set_current(task). The KCOV hook dereferences current while TPIDRURO is still uninitialized, causing a data abort before cpu_init() has installed the exception stacks. The secondary CPU consequently never completes startup. Initialize current in the secondary assembly handoff, as __mmap_switched already does for the boot CPU. With current set in assembly, the set_current() call in secondary_start_kernel() is redundant. Drop it together with the function and the task argument. The hotplug resuscitate path in arch_cpu_idle_dead() needs no hand-off either, as smp_ops.cpu_die() can only return if the CPU kept its register state, TPIDRURO included. Fixes: 50596b7559bf ("ARM: smp: Store current pointer in TPIDRURO register if available") Cc: stable@vger.kernel.org Assisted-by: Claude:claude-fable-5 Signed-off-by: Karl Mehltretter --- v2: drop the redundant set_current() call and helper (Ard), along with the now-unused task argument to secondary_start_kernel() v1: https://lore.kernel.org/r/20260718091600.92021-1-kmehltretter@gmail.com/ Tested on QEMU vexpress-a15 (v6.16) with CONFIG_KCOV_INSTRUMENT_ALL=y, covering SMP bringup and 10 CPU1 offline/online cycles through the arch_cpu_idle_dead() resuscitate path. The head-nommu.S change is untested because no currently reachable Kconfig combination enables non-MMU SMP. arch/arm/include/asm/smp.h | 2 +- arch/arm/kernel/head-nommu.S | 1 + arch/arm/kernel/head.S | 1 + arch/arm/kernel/smp.c | 15 ++------------- 4 files changed, 5 insertions(+), 14 deletions(-) diff --git a/arch/arm/include/asm/smp.h b/arch/arm/include/asm/smp.h index 8c05a7f374d8..84aa6a663e81 100644 --- a/arch/arm/include/asm/smp.h +++ b/arch/arm/include/asm/smp.h @@ -43,7 +43,7 @@ extern void set_smp_ipi_range(int ipi_base, int nr_ipi); * Called from platform specific assembly code, this is the * secondary CPU entry point. */ -asmlinkage void secondary_start_kernel(struct task_struct *task); +asmlinkage void secondary_start_kernel(void); /* diff --git a/arch/arm/kernel/head-nommu.S b/arch/arm/kernel/head-nommu.S index b9d6818f1ee1..f80bbfbd3a6f 100644 --- a/arch/arm/kernel/head-nommu.S +++ b/arch/arm/kernel/head-nommu.S @@ -116,6 +116,7 @@ ENTRY(secondary_startup) ldr r7, __secondary_data @ reload r7 ldr sp, [r7, #12] @ set up the stack pointer ldr r0, [r7, #16] @ set up task pointer + set_current r0, r1 mov fp, #0 b secondary_start_kernel ENDPROC(secondary_startup) diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S index f22c50d4bd41..a22403a629ef 100644 --- a/arch/arm/kernel/head.S +++ b/arch/arm/kernel/head.S @@ -442,6 +442,7 @@ ENTRY(__secondary_switched) adr_l r7, secondary_data + 12 @ get secondary_data.stack ldr sp, [r7] ldr r0, [r7, #4] @ get secondary_data.task + set_current r0, r1 mov fp, #0 b secondary_start_kernel ENDPROC(__secondary_switched) diff --git a/arch/arm/kernel/smp.c b/arch/arm/kernel/smp.c index 50999886a8b5..e30206365877 100644 --- a/arch/arm/kernel/smp.c +++ b/arch/arm/kernel/smp.c @@ -371,12 +371,9 @@ void __noreturn arch_cpu_idle_dead(void) */ __asm__("mov sp, %0\n" " mov fp, #0\n" - " mov r0, %1\n" " b secondary_start_kernel" : - : "r" (task_stack_page(current) + THREAD_SIZE - 8), - "r" (current) - : "r0"); + : "r" (task_stack_page(current) + THREAD_SIZE - 8)); unreachable(); } @@ -397,23 +394,15 @@ static void smp_store_cpu_info(unsigned int cpuid) check_cpu_icache_size(cpuid); } -static void set_current(struct task_struct *cur) -{ - /* Set TPIDRURO */ - asm("mcr p15, 0, %0, c13, c0, 3" :: "r"(cur) : "memory"); -} - /* * This is the secondary CPU boot entry. We're using this CPUs * idle thread stack, but a set of temporary page tables. */ -asmlinkage void secondary_start_kernel(struct task_struct *task) +asmlinkage void secondary_start_kernel(void) { struct mm_struct *mm = &init_mm; unsigned int cpu; - set_current(task); - secondary_biglittle_init(); /* -- 2.43.0