提交 1ddb22e1 编写于 作者: S Sam Ravnborg 提交者: David S. Miller

sparc32,leon: fix leon bootup

head_32.S failed to set cputypval for leon, causing boot to fail.
The boot failed because we failed to recognize this was a LEON
cpu so we did not preoperly run-time patch the the kernel.
This resulted in an early crash.
Reported-by: NDaniel Hellstrom <daniel@gaisler.com>
Tested-by: NDaniel Hellstrom <daniel@gaisler.com>
Signed-off-by: NSam Ravnborg <sam@ravnborg.org>
Cc: Konrad Eisele <konrad@gaisler.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 d4511e69
...@@ -372,36 +372,9 @@ execute_in_high_mem: ...@@ -372,36 +372,9 @@ execute_in_high_mem:
sethi %hi(linux_dbvec), %g1 sethi %hi(linux_dbvec), %g1
st %o1, [%g1 + %lo(linux_dbvec)] st %o1, [%g1 + %lo(linux_dbvec)]
/* Check if this is a LEON CPU. /* Get the machine type via the romvec
* Skip getprops call if it is * getprops node operation
*/ */
srl %g3, PSR_IMPL_SHIFT, %g3
and %g3, PSR_IMPL_SHIFTED_MASK, %g3
cmp %g3, PSR_IMPL_LEON
bne get_cputype
/* LEON CPU - set boot_cpu_id */
sethi %hi(boot_cpu_id), %g2 ! boot-cpu index
#ifdef CONFIG_SMP
ldub [%g2 + %lo(boot_cpu_id)], %g1
cmp %g1, 0xff ! unset means first CPU
bne leon_smp_cpu_startup ! continue only with master
nop
#endif
/* Get CPU-ID from most significant 4-bit of ASR17 */
rd %asr17, %g1
srl %g1, 28, %g1
/* Update boot_cpu_id only on boot cpu */
stub %g1, [%g2 + %lo(boot_cpu_id)]
ba continue_boot
nop
/* Get the machine type via the mysterious romvec node operations. */
get_cputype:
add %g7, 0x1c, %l1 add %g7, 0x1c, %l1
ld [%l1], %l0 ld [%l1], %l0
ld [%l0], %l0 ld [%l0], %l0
...@@ -420,10 +393,26 @@ get_cputype: ...@@ -420,10 +393,26 @@ get_cputype:
! to a buf where above string ! to a buf where above string
! will get stored by the prom. ! will get stored by the prom.
/* Check to cputype. We may be booted on a sun4u (64 bit box),
* and sun4d needs special treatment. /* Check value of "compatible" property.
*/ * "value" => "model"
* leon => sparc_leon
* sun4m => sun4m
* sun4s => sun4m
* sun4d => sun4d
* sun4e => "no_sun4e_here"
* '*' => "no_sun4u_here"
* Check single letters only
*/
set cputypval, %o2 set cputypval, %o2
/* If cputypval[0] == 'l' (lower case letter L) this is leon */
ldub [%o2], %l1
cmp %l1, 'l'
be leon_init
nop
/* Check cputypval[4] to find the sun model */
ldub [%o2 + 0x4], %l1 ldub [%o2 + 0x4], %l1
cmp %l1, 'm' cmp %l1, 'm'
...@@ -438,6 +427,26 @@ get_cputype: ...@@ -438,6 +427,26 @@ get_cputype:
b no_sun4u_here ! AIEEE, a V9 sun4u... Get our BIG BROTHER kernel :)) b no_sun4u_here ! AIEEE, a V9 sun4u... Get our BIG BROTHER kernel :))
nop nop
leon_init:
/* LEON CPU - set boot_cpu_id */
sethi %hi(boot_cpu_id), %g2 ! boot-cpu index
#ifdef CONFIG_SMP
ldub [%g2 + %lo(boot_cpu_id)], %g1
cmp %g1, 0xff ! unset means first CPU
bne leon_smp_cpu_startup ! continue only with master
nop
#endif
/* Get CPU-ID from most significant 4-bit of ASR17 */
rd %asr17, %g1
srl %g1, 28, %g1
/* Update boot_cpu_id only on boot cpu */
stub %g1, [%g2 + %lo(boot_cpu_id)]
ba continue_boot
nop
/* CPUID in bootbus can be found at PA 0xff0140000 */ /* CPUID in bootbus can be found at PA 0xff0140000 */
#define SUN4D_BOOTBUS_CPUID 0xf0140000 #define SUN4D_BOOTBUS_CPUID 0xf0140000
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册