diff options
Diffstat (limited to 'arch/arm/kernel/head.S')
-rw-r--r-- | arch/arm/kernel/head.S | 38 |
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 |
422 | 2: 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 | ||
434 | ENDPROC(__fixup_smp) | 424 | ENDPROC(__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 | ||
453 | ENDPROC(__do_fixup_smp_on_up) | ||
454 | |||
455 | ENTRY(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} | ||
462 | ENDPROC(fixup_smp) | ||
449 | 463 | ||
450 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT | 464 | #ifdef CONFIG_ARM_PATCH_PHYS_VIRT |
451 | 465 | ||