aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/kernel/head.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/kernel/head.S')
-rw-r--r--arch/arm/kernel/head.S38
1 files changed, 26 insertions, 12 deletions
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index 6a87261e1b1e..c9173cfbbc74 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -395,6 +395,7 @@ ENDPROC(__turn_mmu_on)
395 395
396 396
397#ifdef CONFIG_SMP_ON_UP 397#ifdef CONFIG_SMP_ON_UP
398 __INIT
398__fixup_smp: 399__fixup_smp:
399 and r3, r9, #0x000f0000 @ architecture version 400 and r3, r9, #0x000f0000 @ architecture version
400 teq r3, #0x000f0000 @ CPU ID supported? 401 teq r3, #0x000f0000 @ CPU ID supported?
@@ -419,18 +420,7 @@ __fixup_smp_on_up:
419 sub r3, r0, r3 420 sub r3, r0, r3
420 add r4, r4, r3 421 add r4, r4, r3
421 add r5, r5, r3 422 add r5, r5, r3
4222: cmp r4, r5 423 b __do_fixup_smp_on_up
423 movhs pc, lr
424 ldmia r4!, {r0, r6}
425 ARM( str r6, [r0, r3] )
426 THUMB( add r0, r0, r3 )
427#ifdef __ARMEB__
428 THUMB( mov r6, r6, ror #16 ) @ Convert word order for big-endian.
429#endif
430 THUMB( strh r6, [r0], #2 ) @ For Thumb-2, store as two halfwords
431 THUMB( mov r6, r6, lsr #16 ) @ to be robust against misaligned r3.
432 THUMB( strh r6, [r0] )
433 b 2b
434ENDPROC(__fixup_smp) 424ENDPROC(__fixup_smp)
435 425
436 .align 426 .align
@@ -444,8 +434,32 @@ smp_on_up:
444 ALT_SMP(.long 1) 434 ALT_SMP(.long 1)
445 ALT_UP(.long 0) 435 ALT_UP(.long 0)
446 .popsection 436 .popsection
437#endif
447 438
439 .text
440__do_fixup_smp_on_up:
441 cmp r4, r5
442 movhs pc, lr
443 ldmia r4!, {r0, r6}
444 ARM( str r6, [r0, r3] )
445 THUMB( add r0, r0, r3 )
446#ifdef __ARMEB__
447 THUMB( mov r6, r6, ror #16 ) @ Convert word order for big-endian.
448#endif 448#endif
449 THUMB( strh r6, [r0], #2 ) @ For Thumb-2, store as two halfwords
450 THUMB( mov r6, r6, lsr #16 ) @ to be robust against misaligned r3.
451 THUMB( strh r6, [r0] )
452 b __do_fixup_smp_on_up
453ENDPROC(__do_fixup_smp_on_up)
454
455ENTRY(fixup_smp)
456 stmfd sp!, {r4 - r6, lr}
457 mov r4, r0
458 add r5, r0, r1
459 mov r3, #0
460 bl __do_fixup_smp_on_up
461 ldmfd sp!, {r4 - r6, pc}
462ENDPROC(fixup_smp)
449 463
450#ifdef CONFIG_ARM_PATCH_PHYS_VIRT 464#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
451 465