[OpenBIOS] SPARC32 : Fix SMP Boot
Mark Cave-Ayland
mark.cave-ayland at ilande.co.uk
Sat Dec 31 18:01:39 CET 2016
On 25/11/16 22:45, Olivier Danet wrote:
> Only the first CPU should clear the RAM
>
> Signed-off-by: Olivier Danet <odanet at caramail.com>
> --------------------
> diff --git a/arch/sparc32/entry.S b/arch/sparc32/entry.S
> index 82aa88e..0374f0c 100644
> --- a/arch/sparc32/entry.S
> +++ b/arch/sparc32/entry.S
> @@ -125,6 +125,17 @@ entry:
> sll %g3, 24, %g3
> or %g3, %g4, %g1
> ! %g1 contains end of memory
> +
> + ! Get CPU number
> + ! XXX: not all CPUs should have MXCC
> + set 0x1c00f00, %g2
> + ldda [%g2] ASI_CONTROL, %g2
> + srl %g3, 24, %g7
> + subcc %g7, 8, %g7
> +
> + ! Only the first CPU clears memory
> + bnz clear_done
> + nop
>
> ! Get kernel address from configuration device
> ! NB: little endian format
> @@ -146,6 +157,9 @@ entry:
> sll %g3, 24, %g3
> or %g3, %g4, %g4
>
> + mov 0,%l0
> + mov 0,%l1
> +
> ! If kernel address is set, don't clear from base of RAM in order to
> ! leave the kernel image intact
> mov 0, %g6
> @@ -157,8 +171,8 @@ entry:
> set 0x1000000, %g6
>
> clear_mem:
> - sta %g0, [%g6] ASI_M_BYPASS
> - add %g6, 0x4, %g6
> + stda %l0, [%g6] ASI_M_BYPASS
> + add %g6, 0x8, %g6
> cmp %g6, %g1
> bl clear_mem
> nop
> @@ -168,23 +182,6 @@ clear_done:
> set 0x2000, %g3
> sub %g1, %g3, %g6
>
> - ! Check if this is the boot CPU and skip SMP table check if yes
> - ! XXX: not all CPUs should have MXCC
> - set 0x1c00f00, %g2
> - ldda [%g2] ASI_CONTROL, %g2
> - srl %g3, 24, %g7
> - sub %g7, 8, %g7
> - tst %g7
> - bz skip_table
> - nop
> -
> - ! Calculate SMP table location
> - set 0x1f0c, %g2
> - add %g6, %g2, %g2 ! valid?
> - lda [%g2] ASI_M_BYPASS, %g7
> - sta %g0, [%g2] ASI_M_BYPASS
> -
> -skip_table:
> ! Get machine ID from configuration device
> mov FW_CFG_MACHINE_ID, %g2
> sub %g5, 2, %g5
> @@ -205,36 +202,39 @@ skip_table:
> blu ss2
> nop
>
> - ! Ok, this is SS-5
> + ! Ok, this is SS-5, uniprocessor
> + ba first_cpu
> + nop
>
> +ss10:
> + ! Ok, this is SS-10/20 or SS-600MP
> tst %g7
> bz first_cpu
> nop
>
> - ! Clear softints used for SMP CPU startup
> - set PHYS_JJ_INTR0 + 0x04, %g1
> - sll %g2, 12, %g2
> + ! SMP init, clear softints, which are used for starting non-boot CPUs
> + set PHYS_SS10_INTR0 + 0x04, %g1
> + sll %g7, 12, %g2
> add %g1, %g2, %g2
> set 0xffffffff, %g1
> - sta %g1, [%g2] ASI_M_BYPASS ! clear softints
> + sta %g1, [%g2] ASI_M_CTL ! clear softints
> add %g2, 4, %g2
> - sta %g0, [%g2] ASI_M_BYPASS ! clear softints
> + sta %g0, [%g2] ASI_M_CTL ! clear softints
>
> -load_ctx:
> ! SMP init, jump to user specified address
> - set 0x1f04, %g5
> + set 0x1f04, %g5
> add %g6, %g5, %g5 ! ctxtbl
> lda [%g5] ASI_M_BYPASS, %g2
> sta %g0, [%g5] ASI_M_BYPASS
> set AC_M_CTPR, %g1
> sta %g2, [%g1] ASI_M_MMUREGS ! set ctx table ptr
> - set 0x1f00, %g5
> + set 0x1f00, %g5
> add %g6, %g5, %g5 ! ctx
> lda [%g5] ASI_M_BYPASS, %g2
> sta %g0, [%g5] ASI_M_BYPASS
> set AC_M_CXR, %g1
> sta %g2, [%g1] ASI_M_MMUREGS ! set context
> - set 0x1f08, %g5
> + set 0x1f08, %g5
> add %g6, %g5, %g5 ! entry
> lda [%g5] ASI_M_BYPASS, %g2
> sta %g0, [%g5] ASI_M_BYPASS
> @@ -242,22 +242,6 @@ load_ctx:
> jmp %g2 ! jump to kernel
> sta %g1, [%g0] ASI_M_MMUREGS ! enable mmu
>
> -ss10:
> - ! Ok, this is SS-10 or SS-600MP
> - tst %g7
> - bz first_cpu
> - nop
> -
> - ! Clear softints used for SMP CPU startup
> - set PHYS_SS10_INTR0 + 0x04, %g1
> - sll %g2, 12, %g2
> - add %g1, %g2, %g2
> - set 0xffffffff, %g1
> - sta %g1, [%g2] ASI_M_CTL ! clear softints
> - add %g2, 4, %g2
> - b load_ctx
> - sta %g0, [%g2] ASI_M_CTL ! clear softints
> -
> ss2:
> ! Ok, this is SS-2
> set ss2_error, %o2
>
Hi Olivier,
Thanks for the patch!
It looks like this does a bit more than bypass the memory clearing for
CPU IDs != 0, e.g.
- sta %g1, [%g2] ASI_M_BYPASS ! clear softints
+ sta %g1, [%g2] ASI_M_CTL ! clear softints
add %g2, 4, %g2
- sta %g0, [%g2] ASI_M_BYPASS ! clear softints
+ sta %g0, [%g2] ASI_M_CTL ! clear softints
Could you augment the commit the message to explain a bit more about this?
Also can you confirm how you were able to test the patch - was it
booting in QEMU with -smp 2 or similar?
ATB,
Mark.
More information about the OpenBIOS
mailing list