git: cc521bcf790b - stable/13 - mips/malta: Explicitly set AP entry point to _locore
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 12 Dec 2024 21:10:21 UTC
The branch stable/13 has been updated by jrtc27:
URL: https://cgit.FreeBSD.org/src/commit/?id=cc521bcf790bdcc76fddd619f35d0279f22e535a
commit cc521bcf790bdcc76fddd619f35d0279f22e535a
Author: Jessica Clarke <jrtc27@FreeBSD.org>
AuthorDate: 2024-12-12 21:07:14 +0000
Commit: Jessica Clarke <jrtc27@FreeBSD.org>
CommitDate: 2024-12-12 21:07:14 +0000
mips/malta: Explicitly set AP entry point to _locore
Otherwise we rely on the firmware implicitly ending up there without
faulting. Perhaps the hardware this was tested on does so, but on QEMU
this is not the case, as the AP will otherwise re-run bootloader code
that tries to reconfigure PCI BARs and ends up faulting, so the AP is
never seen by FreeBSD to have started.
This matches Linux's arch/mips/kernel/smp-mt.c:vsmp_boot_secondary,
which unconditionally writes to TCRestart (this register), albeit using
a separate entry point, whilst ours is shared.
This is a direct commit to stable/13 as mips no longer exists in main.
Obtained from: CheriBSD (diagnosis; patch rewritten from scratch)
---
sys/mips/malta/malta_mp.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/sys/mips/malta/malta_mp.c b/sys/mips/malta/malta_mp.c
index 693c6b13248e..fe284501dffb 100644
--- a/sys/mips/malta/malta_mp.c
+++ b/sys/mips/malta/malta_mp.c
@@ -44,6 +44,9 @@
#include <machine/md_var.h>
#include <machine/smp.h>
+void _locore(__register_t a0, __register_t a1, __register_t a2,
+ __register_t a3);
+
#define VPECONF0_VPA (1 << 0)
#define MVPCONTROL_VPC (1 << 1)
#define MVPCONF0_PVPE_SHIFT 10
@@ -235,11 +238,8 @@ platform_start_ap(int cpuid)
set_thread_context(cpuid);
- /*
- * Hint: how to set entry point.
- * reg = 0x80000000;
- * mttc0(2, 3, reg);
- */
+ /* Set entry point */
+ mttc0(2, 3, (register_t)&_locore);
/* Enable thread */
reg = mftc0(2, 1);