|
@@ -391,6 +391,7 @@ ENDPROC(__turn_mmu_on)
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_SMP_ON_UP
|
|
|
+ __INIT
|
|
|
__fixup_smp:
|
|
|
and r3, r9, #0x000f0000 @ architecture version
|
|
|
teq r3, #0x000f0000 @ CPU ID supported?
|
|
@@ -415,18 +416,7 @@ __fixup_smp_on_up:
|
|
|
sub r3, r0, r3
|
|
|
add r4, r4, r3
|
|
|
add r5, r5, r3
|
|
|
-2: cmp r4, r5
|
|
|
- movhs pc, lr
|
|
|
- ldmia r4!, {r0, r6}
|
|
|
- ARM( str r6, [r0, r3] )
|
|
|
- THUMB( add r0, r0, r3 )
|
|
|
-#ifdef __ARMEB__
|
|
|
- THUMB( mov r6, r6, ror #16 ) @ Convert word order for big-endian.
|
|
|
-#endif
|
|
|
- THUMB( strh r6, [r0], #2 ) @ For Thumb-2, store as two halfwords
|
|
|
- THUMB( mov r6, r6, lsr #16 ) @ to be robust against misaligned r3.
|
|
|
- THUMB( strh r6, [r0] )
|
|
|
- b 2b
|
|
|
+ b __do_fixup_smp_on_up
|
|
|
ENDPROC(__fixup_smp)
|
|
|
|
|
|
.align
|
|
@@ -440,7 +430,31 @@ smp_on_up:
|
|
|
ALT_SMP(.long 1)
|
|
|
ALT_UP(.long 0)
|
|
|
.popsection
|
|
|
+#endif
|
|
|
|
|
|
+ .text
|
|
|
+__do_fixup_smp_on_up:
|
|
|
+ cmp r4, r5
|
|
|
+ movhs pc, lr
|
|
|
+ ldmia r4!, {r0, r6}
|
|
|
+ ARM( str r6, [r0, r3] )
|
|
|
+ THUMB( add r0, r0, r3 )
|
|
|
+#ifdef __ARMEB__
|
|
|
+ THUMB( mov r6, r6, ror #16 ) @ Convert word order for big-endian.
|
|
|
#endif
|
|
|
+ THUMB( strh r6, [r0], #2 ) @ For Thumb-2, store as two halfwords
|
|
|
+ THUMB( mov r6, r6, lsr #16 ) @ to be robust against misaligned r3.
|
|
|
+ THUMB( strh r6, [r0] )
|
|
|
+ b __do_fixup_smp_on_up
|
|
|
+ENDPROC(__do_fixup_smp_on_up)
|
|
|
+
|
|
|
+ENTRY(fixup_smp)
|
|
|
+ stmfd sp!, {r4 - r6, lr}
|
|
|
+ mov r4, r0
|
|
|
+ add r5, r0, r1
|
|
|
+ mov r3, #0
|
|
|
+ bl __do_fixup_smp_on_up
|
|
|
+ ldmfd sp!, {r4 - r6, pc}
|
|
|
+ENDPROC(fixup_smp)
|
|
|
|
|
|
#include "head-common.S"
|