Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Thumb-2: Implement the unified boot code

This patch adds the ARM/Thumb-2 unified support for the
arch/arm/boot/* files.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>

+99 -68
+99 -68
arch/arm/boot/compressed/head.S
··· 140 140 tst r2, #3 @ not user? 141 141 bne not_angel 142 142 mov r0, #0x17 @ angel_SWIreason_EnterSVC 143 - swi 0x123456 @ angel_SWI_ARM 143 + ARM( swi 0x123456 ) @ angel_SWI_ARM 144 + THUMB( svc 0xab ) @ angel_SWI_THUMB 144 145 not_angel: 145 146 mrs r2, cpsr @ turn off interrupts to 146 147 orr r2, r2, #0xc0 @ prevent angel from running ··· 162 161 163 162 .text 164 163 adr r0, LC0 165 - ldmia r0, {r1, r2, r3, r4, r5, r6, ip, sp} 164 + ARM( ldmia r0, {r1, r2, r3, r4, r5, r6, ip, sp} ) 165 + THUMB( ldmia r0, {r1, r2, r3, r4, r5, r6, ip} ) 166 + THUMB( ldr sp, [r0, #28] ) 166 167 subs r0, r0, r1 @ calculate the delta offset 167 168 168 169 @ if delta is zero, we are ··· 266 263 * r6 = processor ID 267 264 * r7 = architecture ID 268 265 * r8 = atags pointer 269 - * r9-r14 = corrupted 266 + * r9-r12,r14 = corrupted 270 267 */ 271 268 add r1, r5, r0 @ end of decompressed kernel 272 269 adr r2, reloc_start 273 270 ldr r3, LC1 274 271 add r3, r2, r3 275 - 1: ldmia r2!, {r9 - r14} @ copy relocation code 276 - stmia r1!, {r9 - r14} 277 - ldmia r2!, {r9 - r14} 278 - stmia r1!, {r9 - r14} 272 + 1: ldmia r2!, {r9 - r12, r14} @ copy relocation code 273 + stmia r1!, {r9 - r12, r14} 274 + ldmia r2!, {r9 - r12, r14} 275 + stmia r1!, {r9 - r12, r14} 279 276 cmp r2, r3 280 277 blo 1b 281 - add sp, r1, #128 @ relocate the stack 278 + mov sp, r1 279 + add sp, sp, #128 @ relocate the stack 282 280 283 281 bl cache_clean_flush 284 - add pc, r5, r0 @ call relocation code 282 + ARM( add pc, r5, r0 ) @ call relocation code 283 + THUMB( add r12, r5, r0 ) 284 + THUMB( mov pc, r12 ) @ call relocation code 285 285 286 286 /* 287 287 * We're not in danger of overwriting ourselves. Do this the simple way. ··· 505 499 mov pc, r12 506 500 507 501 __common_mmu_cache_on: 502 + #ifndef CONFIG_THUMB2_KERNEL 508 503 #ifndef DEBUG 509 504 orr r0, r0, #0x000d @ Write buffer, mmu 510 505 #endif ··· 517 510 1: mcr p15, 0, r0, c1, c0, 0 @ load control register 518 511 mrc p15, 0, r0, c1, c0, 0 @ and read it back to 519 512 sub pc, lr, r0, lsr #32 @ properly flush pipeline 513 + #endif 520 514 521 515 /* 522 516 * All code following this line is relocatable. It is relocated by ··· 531 523 * r6 = processor ID 532 524 * r7 = architecture ID 533 525 * r8 = atags pointer 534 - * r9-r14 = corrupted 526 + * r9-r12,r14 = corrupted 535 527 */ 536 528 .align 5 537 529 reloc_start: add r9, r5, r0 ··· 540 532 mov r1, r4 541 533 1: 542 534 .rept 4 543 - ldmia r5!, {r0, r2, r3, r10 - r14} @ relocate kernel 544 - stmia r1!, {r0, r2, r3, r10 - r14} 535 + ldmia r5!, {r0, r2, r3, r10 - r12, r14} @ relocate kernel 536 + stmia r1!, {r0, r2, r3, r10 - r12, r14} 545 537 .endr 546 538 547 539 cmp r5, r9 548 540 blo 1b 549 - add sp, r1, #128 @ relocate the stack 541 + mov sp, r1 542 + add sp, sp, #128 @ relocate the stack 550 543 debug_reloc_end 551 544 552 545 call_kernel: bl cache_clean_flush ··· 581 572 ldr r2, [r12, #4] @ get mask 582 573 eor r1, r1, r6 @ (real ^ match) 583 574 tst r1, r2 @ & mask 584 - addeq pc, r12, r3 @ call cache function 575 + ARM( addeq pc, r12, r3 ) @ call cache function 576 + THUMB( addeq r12, r3 ) 577 + THUMB( moveq pc, r12 ) @ call cache function 585 578 add r12, r12, #4*5 586 579 b 1b 587 580 ··· 606 595 proc_types: 607 596 .word 0x41560600 @ ARM6/610 608 597 .word 0xffffffe0 609 - b __arm6_mmu_cache_off @ works, but slow 610 - b __arm6_mmu_cache_off 598 + W(b) __arm6_mmu_cache_off @ works, but slow 599 + W(b) __arm6_mmu_cache_off 611 600 mov pc, lr 601 + THUMB( nop ) 612 602 @ b __arm6_mmu_cache_on @ untested 613 603 @ b __arm6_mmu_cache_off 614 604 @ b __armv3_mmu_cache_flush ··· 617 605 .word 0x00000000 @ old ARM ID 618 606 .word 0x0000f000 619 607 mov pc, lr 608 + THUMB( nop ) 620 609 mov pc, lr 610 + THUMB( nop ) 621 611 mov pc, lr 612 + THUMB( nop ) 622 613 623 614 .word 0x41007000 @ ARM7/710 624 615 .word 0xfff8fe00 625 - b __arm7_mmu_cache_off 626 - b __arm7_mmu_cache_off 616 + W(b) __arm7_mmu_cache_off 617 + W(b) __arm7_mmu_cache_off 627 618 mov pc, lr 619 + THUMB( nop ) 628 620 629 621 .word 0x41807200 @ ARM720T (writethrough) 630 622 .word 0xffffff00 631 - b __armv4_mmu_cache_on 632 - b __armv4_mmu_cache_off 623 + W(b) __armv4_mmu_cache_on 624 + W(b) __armv4_mmu_cache_off 633 625 mov pc, lr 626 + THUMB( nop ) 634 627 635 628 .word 0x41007400 @ ARM74x 636 629 .word 0xff00ff00 637 - b __armv3_mpu_cache_on 638 - b __armv3_mpu_cache_off 639 - b __armv3_mpu_cache_flush 630 + W(b) __armv3_mpu_cache_on 631 + W(b) __armv3_mpu_cache_off 632 + W(b) __armv3_mpu_cache_flush 640 633 641 634 .word 0x41009400 @ ARM94x 642 635 .word 0xff00ff00 643 - b __armv4_mpu_cache_on 644 - b __armv4_mpu_cache_off 645 - b __armv4_mpu_cache_flush 636 + W(b) __armv4_mpu_cache_on 637 + W(b) __armv4_mpu_cache_off 638 + W(b) __armv4_mpu_cache_flush 646 639 647 640 .word 0x00007000 @ ARM7 IDs 648 641 .word 0x0000f000 649 642 mov pc, lr 643 + THUMB( nop ) 650 644 mov pc, lr 645 + THUMB( nop ) 651 646 mov pc, lr 647 + THUMB( nop ) 652 648 653 649 @ Everything from here on will be the new ID system. 654 650 655 651 .word 0x4401a100 @ sa110 / sa1100 656 652 .word 0xffffffe0 657 - b __armv4_mmu_cache_on 658 - b __armv4_mmu_cache_off 659 - b __armv4_mmu_cache_flush 653 + W(b) __armv4_mmu_cache_on 654 + W(b) __armv4_mmu_cache_off 655 + W(b) __armv4_mmu_cache_flush 660 656 661 657 .word 0x6901b110 @ sa1110 662 658 .word 0xfffffff0 663 - b __armv4_mmu_cache_on 664 - b __armv4_mmu_cache_off 665 - b __armv4_mmu_cache_flush 659 + W(b) __armv4_mmu_cache_on 660 + W(b) __armv4_mmu_cache_off 661 + W(b) __armv4_mmu_cache_flush 666 662 667 663 .word 0x56056930 668 664 .word 0xff0ffff0 @ PXA935 669 - b __armv4_mmu_cache_on 670 - b __armv4_mmu_cache_off 671 - b __armv4_mmu_cache_flush 665 + W(b) __armv4_mmu_cache_on 666 + W(b) __armv4_mmu_cache_off 667 + W(b) __armv4_mmu_cache_flush 672 668 673 669 .word 0x56158000 @ PXA168 674 670 .word 0xfffff000 675 - b __armv4_mmu_cache_on 676 - b __armv4_mmu_cache_off 677 - b __armv5tej_mmu_cache_flush 671 + W(b) __armv4_mmu_cache_on 672 + W(b) __armv4_mmu_cache_off 673 + W(b) __armv5tej_mmu_cache_flush 678 674 679 675 .word 0x56056930 680 676 .word 0xff0ffff0 @ PXA935 681 - b __armv4_mmu_cache_on 682 - b __armv4_mmu_cache_off 683 - b __armv4_mmu_cache_flush 677 + W(b) __armv4_mmu_cache_on 678 + W(b) __armv4_mmu_cache_off 679 + W(b) __armv4_mmu_cache_flush 684 680 685 681 .word 0x56050000 @ Feroceon 686 682 .word 0xff0f0000 687 - b __armv4_mmu_cache_on 688 - b __armv4_mmu_cache_off 689 - b __armv5tej_mmu_cache_flush 683 + W(b) __armv4_mmu_cache_on 684 + W(b) __armv4_mmu_cache_off 685 + W(b) __armv5tej_mmu_cache_flush 690 686 691 687 #ifdef CONFIG_CPU_FEROCEON_OLD_ID 692 688 /* this conflicts with the standard ARMv5TE entry */ ··· 707 687 708 688 .word 0x66015261 @ FA526 709 689 .word 0xff01fff1 710 - b __fa526_cache_on 711 - b __armv4_mmu_cache_off 712 - b __fa526_cache_flush 690 + W(b) __fa526_cache_on 691 + W(b) __armv4_mmu_cache_off 692 + W(b) __fa526_cache_flush 713 693 714 694 @ These match on the architecture ID 715 695 716 696 .word 0x00020000 @ ARMv4T 717 697 .word 0x000f0000 718 - b __armv4_mmu_cache_on 719 - b __armv4_mmu_cache_off 720 - b __armv4_mmu_cache_flush 698 + W(b) __armv4_mmu_cache_on 699 + W(b) __armv4_mmu_cache_off 700 + W(b) __armv4_mmu_cache_flush 721 701 722 702 .word 0x00050000 @ ARMv5TE 723 703 .word 0x000f0000 724 - b __armv4_mmu_cache_on 725 - b __armv4_mmu_cache_off 726 - b __armv4_mmu_cache_flush 704 + W(b) __armv4_mmu_cache_on 705 + W(b) __armv4_mmu_cache_off 706 + W(b) __armv4_mmu_cache_flush 727 707 728 708 .word 0x00060000 @ ARMv5TEJ 729 709 .word 0x000f0000 730 - b __armv4_mmu_cache_on 731 - b __armv4_mmu_cache_off 732 - b __armv5tej_mmu_cache_flush 710 + W(b) __armv4_mmu_cache_on 711 + W(b) __armv4_mmu_cache_off 712 + W(b) __armv4_mmu_cache_flush 733 713 734 714 .word 0x0007b000 @ ARMv6 735 715 .word 0x000ff000 736 - b __armv4_mmu_cache_on 737 - b __armv4_mmu_cache_off 738 - b __armv6_mmu_cache_flush 716 + W(b) __armv4_mmu_cache_on 717 + W(b) __armv4_mmu_cache_off 718 + W(b) __armv6_mmu_cache_flush 739 719 740 720 .word 0x000f0000 @ new CPU Id 741 721 .word 0x000f0000 742 - b __armv7_mmu_cache_on 743 - b __armv7_mmu_cache_off 744 - b __armv7_mmu_cache_flush 722 + W(b) __armv7_mmu_cache_on 723 + W(b) __armv7_mmu_cache_off 724 + W(b) __armv7_mmu_cache_flush 745 725 746 726 .word 0 @ unrecognised type 747 727 .word 0 748 728 mov pc, lr 729 + THUMB( nop ) 749 730 mov pc, lr 731 + THUMB( nop ) 750 732 mov pc, lr 733 + THUMB( nop ) 751 734 752 735 .size proc_types, . - proc_types 753 736 ··· 877 854 b iflush 878 855 hierarchical: 879 856 mcr p15, 0, r10, c7, c10, 5 @ DMB 880 - stmfd sp!, {r0-r5, r7, r9, r11} 857 + stmfd sp!, {r0-r7, r9-r11} 881 858 mrc p15, 1, r0, c0, c0, 1 @ read clidr 882 859 ands r3, r0, #0x7000000 @ extract loc from clidr 883 860 mov r3, r3, lsr #23 @ left align loc bit field ··· 902 879 loop2: 903 880 mov r9, r4 @ create working copy of max way size 904 881 loop3: 905 - orr r11, r10, r9, lsl r5 @ factor way and cache number into r11 906 - orr r11, r11, r7, lsl r2 @ factor index number into r11 882 + ARM( orr r11, r10, r9, lsl r5 ) @ factor way and cache number into r11 883 + ARM( orr r11, r11, r7, lsl r2 ) @ factor index number into r11 884 + THUMB( lsl r6, r9, r5 ) 885 + THUMB( orr r11, r10, r6 ) @ factor way and cache number into r11 886 + THUMB( lsl r6, r7, r2 ) 887 + THUMB( orr r11, r11, r6 ) @ factor index number into r11 907 888 mcr p15, 0, r11, c7, c14, 2 @ clean & invalidate by set/way 908 889 subs r9, r9, #1 @ decrement the way 909 890 bge loop3 ··· 918 891 cmp r3, r10 919 892 bgt loop1 920 893 finished: 921 - ldmfd sp!, {r0-r5, r7, r9, r11} 894 + ldmfd sp!, {r0-r7, r9-r11} 922 895 mov r10, #0 @ swith back to cache level 0 923 896 mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr 924 897 iflush: ··· 952 925 mov r11, #8 953 926 mov r11, r11, lsl r3 @ cache line size in bytes 954 927 no_cache_id: 955 - bic r1, pc, #63 @ align to longest cache line 928 + mov r1, pc 929 + bic r1, r1, #63 @ align to longest cache line 956 930 add r2, r1, r2 957 - 1: ldr r3, [r1], r11 @ s/w flush D cache 931 + 1: 932 + ARM( ldr r3, [r1], r11 ) @ s/w flush D cache 933 + THUMB( ldr r3, [r1] ) @ s/w flush D cache 934 + THUMB( add r1, r1, r11 ) 958 935 teq r1, r2 959 936 bne 1b 960 937