git: a1e516a731e3 - main - arm64: Move curthread setup earlier

From: Colin Percival <cperciva_at_FreeBSD.org>
Date: Tue, 19 Mar 2024 22:17:22 UTC
The branch main has been updated by cperciva:

URL: https://cgit.FreeBSD.org/src/commit/?id=a1e516a731e3d45e10dab65bb8ccb0484f316d55

commit a1e516a731e3d45e10dab65bb8ccb0484f316d55
Author:     Isaac Cilia Attard <iciliaat@gmail.com>
AuthorDate: 2024-03-13 18:06:19 +0000
Commit:     Colin Percival <cperciva@FreeBSD.org>
CommitDate: 2024-03-19 22:16:48 +0000

    arm64: Move curthread setup earlier
    
    In 469cfa3c30ee cperciva added TSLOG profiling to link_elf_ireloc.  This
    requires curthread to be read when the kernel linker is invoked, but it
    hadn't yet been initialized.  On amd64 this was harmless since [gs:0] was
    readable; but on arm64 this broke since [x18] was not readable.
    
    Move the curthread (and associated PCPU) setup earlier on arm64 in order
    to allow TSLOG to work there.
    
    Fixes: 469cfa3c30ee ("tslog: Annotate some early boot functions")
    Differential Revision: https://reviews.freebsd.org/D44317
---
 sys/arm64/arm64/machdep.c | 32 ++++++++++++++++----------------
 1 file changed, 16 insertions(+), 16 deletions(-)

diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c
index 50b2cd15df3f..d566a8e2298c 100644
--- a/sys/arm64/arm64/machdep.c
+++ b/sys/arm64/arm64/machdep.c
@@ -920,6 +920,22 @@ initarm(struct arm64_bootparams *abp)
 
 	update_special_regs(0);
 
+	/* Set the pcpu data, this is needed by pmap_bootstrap */
+	pcpup = &pcpu0;
+	pcpu_init(pcpup, 0, sizeof(struct pcpu));
+
+	/*
+	 * Set the pcpu pointer with a backup in tpidr_el1 to be
+	 * loaded when entering the kernel from userland.
+	 */
+	__asm __volatile(
+	    "mov x18, %0 \n"
+	    "msr tpidr_el1, %0" :: "r"(pcpup));
+
+	/* locore.S sets sp_el0 to &thread0 so no need to set it here. */
+	PCPU_SET(curthread, &thread0);
+	PCPU_SET(midr, get_midr());
+
 	link_elf_ireloc(kmdp);
 #ifdef FDT
 	try_load_dtb(kmdp);
@@ -952,22 +968,6 @@ initarm(struct arm64_bootparams *abp)
 		physmem_exclude_region(efifb->fb_addr, efifb->fb_size,
 		    EXFLAG_NOALLOC);
 
-	/* Set the pcpu data, this is needed by pmap_bootstrap */
-	pcpup = &pcpu0;
-	pcpu_init(pcpup, 0, sizeof(struct pcpu));
-
-	/*
-	 * Set the pcpu pointer with a backup in tpidr_el1 to be
-	 * loaded when entering the kernel from userland.
-	 */
-	__asm __volatile(
-	    "mov x18, %0 \n"
-	    "msr tpidr_el1, %0" :: "r"(pcpup));
-
-	/* locore.S sets sp_el0 to &thread0 so no need to set it here. */
-	PCPU_SET(curthread, &thread0);
-	PCPU_SET(midr, get_midr());
-
 	/* Do basic tuning, hz etc */
 	init_param1();