sh: BSS init bugfix and barrier in entry point.
A synco is needed before we jump to start_kernel(). While we're at it, also move the sh_cpu_init() jump until after we've zeroed BSS, as this has caused some undesirable results in sh_cpu_init(). Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
Родитель
298476220d
Коммит
b7e108ee63
|
@ -12,6 +12,17 @@
|
||||||
*/
|
*/
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_SH4A
|
||||||
|
#define SYNCO() synco
|
||||||
|
|
||||||
|
#define PREFI(label, reg) \
|
||||||
|
mov.l label, reg; \
|
||||||
|
prefi @reg
|
||||||
|
#else
|
||||||
|
#define SYNCO()
|
||||||
|
#define PREFI(label, reg)
|
||||||
|
#endif
|
||||||
|
|
||||||
.section .empty_zero_page, "aw"
|
.section .empty_zero_page, "aw"
|
||||||
ENTRY(empty_zero_page)
|
ENTRY(empty_zero_page)
|
||||||
.long 1 /* MOUNT_ROOT_RDONLY */
|
.long 1 /* MOUNT_ROOT_RDONLY */
|
||||||
|
@ -42,6 +53,17 @@ ENTRY(_stext)
|
||||||
! Initialize global interrupt mask
|
! Initialize global interrupt mask
|
||||||
mov #0, r0
|
mov #0, r0
|
||||||
ldc r0, r6_bank
|
ldc r0, r6_bank
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Prefetch if possible to reduce cache miss penalty.
|
||||||
|
*
|
||||||
|
* We do this early on for SH-4A as a micro-optimization,
|
||||||
|
* as later on we will have speculative execution enabled
|
||||||
|
* and this will become less of an issue.
|
||||||
|
*/
|
||||||
|
PREFI(5f, r0)
|
||||||
|
PREFI(6f, r0)
|
||||||
|
|
||||||
!
|
!
|
||||||
mov.l 2f, r0
|
mov.l 2f, r0
|
||||||
mov r0, r15 ! Set initial r15 (stack pointer)
|
mov r0, r15 ! Set initial r15 (stack pointer)
|
||||||
|
@ -49,11 +71,7 @@ ENTRY(_stext)
|
||||||
shll8 r1 ! r1 = 8192
|
shll8 r1 ! r1 = 8192
|
||||||
sub r1, r0 !
|
sub r1, r0 !
|
||||||
ldc r0, r7_bank ! ... and initial thread_info
|
ldc r0, r7_bank ! ... and initial thread_info
|
||||||
!
|
|
||||||
! Additional CPU initialization
|
|
||||||
mov.l 6f, r0
|
|
||||||
jsr @r0
|
|
||||||
nop
|
|
||||||
! Clear BSS area
|
! Clear BSS area
|
||||||
mov.l 3f, r1
|
mov.l 3f, r1
|
||||||
add #4, r1
|
add #4, r1
|
||||||
|
@ -62,6 +80,14 @@ ENTRY(_stext)
|
||||||
9: cmp/hs r2, r1
|
9: cmp/hs r2, r1
|
||||||
bf/s 9b ! while (r1 < r2)
|
bf/s 9b ! while (r1 < r2)
|
||||||
mov.l r0,@-r2
|
mov.l r0,@-r2
|
||||||
|
|
||||||
|
! Additional CPU initialization
|
||||||
|
mov.l 6f, r0
|
||||||
|
jsr @r0
|
||||||
|
nop
|
||||||
|
|
||||||
|
SYNCO() ! Wait for pending instructions..
|
||||||
|
|
||||||
! Start kernel
|
! Start kernel
|
||||||
mov.l 5f, r0
|
mov.l 5f, r0
|
||||||
jmp @r0
|
jmp @r0
|
||||||
|
|
Загрузка…
Ссылка в новой задаче