mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 23:24:38 +00:00
MIPS: Hang if run on a secondary CPU
Some systems are configured such that multiple CPUs begin running from their reset vector following a system reset. If this occurs then U-Boot will be run on multiple CPUs simultaneously, which causes all sorts of issues as the multiple instances of U-Boot clobber each other. Prevent this from happening by simply hanging with an infinite loop if we run on a CPU whose ID, as determined by GlobalNumber or EBase.CPUNum as appropriate, is non-zero. Signed-off-by: Paul Burton <paul.burton@imgtec.com>
This commit is contained in:
parent
d263cda5ae
commit
31d36f748c
2 changed files with 27 additions and 1 deletions
|
@ -108,9 +108,28 @@ ENTRY(_start)
|
||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
reset:
|
reset:
|
||||||
|
#if __mips_isa_rev >= 6
|
||||||
|
mfc0 t0, CP0_CONFIG, 5
|
||||||
|
and t0, t0, MIPS_CONF5_VP
|
||||||
|
beqz t0, 1f
|
||||||
|
nop
|
||||||
|
|
||||||
|
b 2f
|
||||||
|
mfc0 t0, CP0_GLOBALNUMBER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
1: mfc0 t0, CP0_EBASE
|
||||||
|
and t0, t0, EBASE_CPUNUM
|
||||||
|
|
||||||
|
/* Hang if this isn't the first CPU in the system */
|
||||||
|
2: beqz t0, 4f
|
||||||
|
nop
|
||||||
|
3: wait
|
||||||
|
b 3b
|
||||||
|
nop
|
||||||
|
|
||||||
/* Clear watch registers */
|
/* Clear watch registers */
|
||||||
MTC0 zero, CP0_WATCHLO
|
4: MTC0 zero, CP0_WATCHLO
|
||||||
mtc0 zero, CP0_WATCHHI
|
mtc0 zero, CP0_WATCHHI
|
||||||
|
|
||||||
/* WP(Watch Pending), SW0/1 should be cleared */
|
/* WP(Watch Pending), SW0/1 should be cleared */
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#define CP0_ENTRYLO0 $2
|
#define CP0_ENTRYLO0 $2
|
||||||
#define CP0_ENTRYLO1 $3
|
#define CP0_ENTRYLO1 $3
|
||||||
#define CP0_CONF $3
|
#define CP0_CONF $3
|
||||||
|
#define CP0_GLOBALNUMBER $3, 1
|
||||||
#define CP0_CONTEXT $4
|
#define CP0_CONTEXT $4
|
||||||
#define CP0_PAGEMASK $5
|
#define CP0_PAGEMASK $5
|
||||||
#define CP0_WIRED $6
|
#define CP0_WIRED $6
|
||||||
|
@ -360,6 +361,11 @@
|
||||||
#define CAUSEB_BD 31
|
#define CAUSEB_BD 31
|
||||||
#define CAUSEF_BD (_ULCAST_(1) << 31)
|
#define CAUSEF_BD (_ULCAST_(1) << 31)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bits in the coprocessor 0 EBase register.
|
||||||
|
*/
|
||||||
|
#define EBASE_CPUNUM 0x3ff
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Bits in the coprocessor 0 config register.
|
* Bits in the coprocessor 0 config register.
|
||||||
*/
|
*/
|
||||||
|
@ -553,6 +559,7 @@
|
||||||
#define MIPS_CONF5_MRP (_ULCAST_(1) << 3)
|
#define MIPS_CONF5_MRP (_ULCAST_(1) << 3)
|
||||||
#define MIPS_CONF5_LLB (_ULCAST_(1) << 4)
|
#define MIPS_CONF5_LLB (_ULCAST_(1) << 4)
|
||||||
#define MIPS_CONF5_MVH (_ULCAST_(1) << 5)
|
#define MIPS_CONF5_MVH (_ULCAST_(1) << 5)
|
||||||
|
#define MIPS_CONF5_VP (_ULCAST_(1) << 7)
|
||||||
#define MIPS_CONF5_FRE (_ULCAST_(1) << 8)
|
#define MIPS_CONF5_FRE (_ULCAST_(1) << 8)
|
||||||
#define MIPS_CONF5_UFE (_ULCAST_(1) << 9)
|
#define MIPS_CONF5_UFE (_ULCAST_(1) << 9)
|
||||||
#define MIPS_CONF5_L2C (_ULCAST_(1) << 10)
|
#define MIPS_CONF5_L2C (_ULCAST_(1) << 10)
|
||||||
|
|
Loading…
Reference in a new issue