[OpenBIOS] [commit] r1334 - trunk/openbios-devel/arch/sparc32

repository service svn at openbios.org
Wed Mar 11 23:58:20 CET 2015


Author: mcayland
Date: Wed Mar 11 23:58:20 2015
New Revision: 1334
URL: http://tracker.coreboot.org/trac/openbios/changeset/1334

Log:
SPARC32: clear physical memory upon startup

This is to work around a bug in Solaris which appears not to explicitly clear
some of its internal kmem structures (particularly its pagelists) on boot. The
result of this is that Solaris will initially boot fine, until a reboot/reset
is initiated.

When this occurs, the kmem structures contain whatever junk was previously left
in memory during initialisation causing a panic. The fix is to clear physical
memory on startup (as OBP appears to do) so that the kmem intialisation code
behaves correctly.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland at ilande.co.uk>

Modified:
   trunk/openbios-devel/arch/sparc32/entry.S

Modified: trunk/openbios-devel/arch/sparc32/entry.S
==============================================================================
--- trunk/openbios-devel/arch/sparc32/entry.S	Wed Mar 11 23:58:18 2015	(r1333)
+++ trunk/openbios-devel/arch/sparc32/entry.S	Wed Mar 11 23:58:20 2015	(r1334)
@@ -122,7 +122,44 @@
         or      %g3, %g4, %g1
         ! %g1 contains end of memory
 
+        ! Get kernel address from configuration device
+        ! NB: little endian format
+        mov     FW_CFG_KERNEL_ADDR, %g2
+        sub     %g5, 2, %g5
+        stha    %g2, [%g5] CFG_ASI
+        add     %g5, 2, %g5
+        lduba   [%g5] CFG_ASI, %g4
 
+        lduba   [%g5] CFG_ASI, %g3
+        sll     %g3, 8, %g3
+        or      %g3, %g4, %g4
+
+        lduba   [%g5] CFG_ASI, %g3
+        sll     %g3, 16, %g3
+        or      %g3, %g4, %g4
+
+        lduba   [%g5] CFG_ASI, %g3
+        sll     %g3, 24, %g3
+        or      %g3, %g4, %g4
+
+        ! If kernel address is set, don't clear from base of RAM in order to
+        ! leave the kernel image intact
+        mov     0, %g6
+        cmp     %g4, 0
+        beq     clear_mem
+         nop
+
+        ! Start from 16M
+        set     0x1000000, %g6
+
+clear_mem:
+        sta     %g0, [%g6] ASI_M_BYPASS
+        add     %g6, 0x4, %g6
+        cmp     %g6, %g1
+        bl      clear_mem
+         nop
+
+clear_done:
         ! Start of private memory in %g6
         set     0x2000, %g3
         sub     %g1, %g3, %g6



More information about the OpenBIOS mailing list