From 5e915346477f4f2f33345c7dbe711be828b58730 Mon Sep 17 00:00:00 2001 From: Jason Thorpe Date: Wed, 2 Jun 2021 20:53:17 -0700 Subject: Fixes for secondary CPU start-up. Changes to make secondary CPU start-up work on NetBSD, which depends on some specific behavior in the architecture specification: - Change the internal swppal() function to take the new VPTPTR and Procedure Value as explicit arguments. Adapt do_start() to the new the new swppal() signature. - In do_start_wait(), extract the new VPTPTR and PV from the relevant HWRPB fields, which will have been initialized by the OS, and pass them to swppal(). - In the SWPPAL PAL call, get the value to stuff into PV (r27) from a4 (r20), and add a comment describing why this implementation detail is allowed by the architecture specification. Signed-off-by: Jason Thorpe Message-Id: <20210603035317.6814-9-thorpej@me.com> Signed-off-by: Richard Henderson --- pal.S | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'pal.S') diff --git a/pal.S b/pal.S index 015a829..8d55a0a 100644 --- a/pal.S +++ b/pal.S @@ -566,6 +566,8 @@ ENDFN CallPal_Cserve_Cont * r17 (a1) = New PC * r18 (a2) = New PCB * r19 (a3) = New VptPtr + * r20 (a4) = New Procedure Value (to place into $27) + * (Non-standard; See note below.) * * OUTPUT PARAMETERS: * @@ -574,11 +576,14 @@ ENDFN CallPal_Cserve_Cont * 1 - Unknown PALcode variant * 2 - Known PALcode variant, but PALcode not loaded * - * r26 (ra) = r27 (pv) = New PC + * r26 (ra) = New PC + * r27 (pv) = From r20 * Note that this is non-architected, but is relied on by * the usage of SwpPal within our own console code in order - * to simplify its use within C code. - * + * to simplify its use within C code. We can get away with + * the extra non-standard argument (in $20) because as + * architected, all registers except SP and R0 are + * UNPREDICTABLE; therefore private internal usage is fine. */ ORG_CALL_PAL_PRIV(0x0A) CallPal_SwpPal: @@ -624,7 +629,7 @@ CallPal_SwpPal_Cont: mtpr $31, qemu_tbia // Flush TLB for new PTBR mov a1, $26 - mov a1, $27 + mov a4, $27 hw_ret (a1) ENDFN CallPal_SwpPal_Cont .previous -- cgit v1.1