diff options
Diffstat (limited to 'arch/parisc/kernel/pacache.S')
-rw-r--r-- | arch/parisc/kernel/pacache.S | 245 |
1 files changed, 109 insertions, 136 deletions
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S index 09b77b2553c6..a85823668cba 100644 --- a/arch/parisc/kernel/pacache.S +++ b/arch/parisc/kernel/pacache.S | |||
@@ -608,93 +608,131 @@ ENTRY(__clear_user_page_asm) | |||
608 | .procend | 608 | .procend |
609 | ENDPROC(__clear_user_page_asm) | 609 | ENDPROC(__clear_user_page_asm) |
610 | 610 | ||
611 | ENTRY(flush_kernel_dcache_page_asm) | 611 | ENTRY(flush_dcache_page_asm) |
612 | .proc | 612 | .proc |
613 | .callinfo NO_CALLS | 613 | .callinfo NO_CALLS |
614 | .entry | 614 | .entry |
615 | 615 | ||
616 | ldil L%(TMPALIAS_MAP_START), %r28 | ||
617 | #ifdef CONFIG_64BIT | ||
618 | #if (TMPALIAS_MAP_START >= 0x80000000) | ||
619 | depdi 0, 31,32, %r28 /* clear any sign extension */ | ||
620 | /* FIXME: page size dependend */ | ||
621 | #endif | ||
622 | extrd,u %r26, 56,32, %r26 /* convert phys addr to tlb insert format */ | ||
623 | depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ | ||
624 | depdi 0, 63,12, %r28 /* Clear any offset bits */ | ||
625 | #else | ||
626 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ | ||
627 | depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ | ||
628 | depwi 0, 31,12, %r28 /* Clear any offset bits */ | ||
629 | #endif | ||
630 | |||
631 | /* Purge any old translation */ | ||
632 | |||
633 | pdtlb 0(%r28) | ||
634 | |||
616 | ldil L%dcache_stride, %r1 | 635 | ldil L%dcache_stride, %r1 |
617 | ldw R%dcache_stride(%r1), %r23 | 636 | ldw R%dcache_stride(%r1), %r1 |
618 | 637 | ||
619 | #ifdef CONFIG_64BIT | 638 | #ifdef CONFIG_64BIT |
620 | depdi,z 1, 63-PAGE_SHIFT,1, %r25 | 639 | depdi,z 1, 63-PAGE_SHIFT,1, %r25 |
621 | #else | 640 | #else |
622 | depwi,z 1, 31-PAGE_SHIFT,1, %r25 | 641 | depwi,z 1, 31-PAGE_SHIFT,1, %r25 |
623 | #endif | 642 | #endif |
624 | add %r26, %r25, %r25 | 643 | add %r28, %r25, %r25 |
625 | sub %r25, %r23, %r25 | 644 | sub %r25, %r1, %r25 |
626 | 645 | ||
627 | 646 | ||
628 | 1: fdc,m %r23(%r26) | 647 | 1: fdc,m %r1(%r28) |
629 | fdc,m %r23(%r26) | 648 | fdc,m %r1(%r28) |
630 | fdc,m %r23(%r26) | 649 | fdc,m %r1(%r28) |
631 | fdc,m %r23(%r26) | 650 | fdc,m %r1(%r28) |
632 | fdc,m %r23(%r26) | 651 | fdc,m %r1(%r28) |
633 | fdc,m %r23(%r26) | 652 | fdc,m %r1(%r28) |
634 | fdc,m %r23(%r26) | 653 | fdc,m %r1(%r28) |
635 | fdc,m %r23(%r26) | 654 | fdc,m %r1(%r28) |
636 | fdc,m %r23(%r26) | 655 | fdc,m %r1(%r28) |
637 | fdc,m %r23(%r26) | 656 | fdc,m %r1(%r28) |
638 | fdc,m %r23(%r26) | 657 | fdc,m %r1(%r28) |
639 | fdc,m %r23(%r26) | 658 | fdc,m %r1(%r28) |
640 | fdc,m %r23(%r26) | 659 | fdc,m %r1(%r28) |
641 | fdc,m %r23(%r26) | 660 | fdc,m %r1(%r28) |
642 | fdc,m %r23(%r26) | 661 | fdc,m %r1(%r28) |
643 | cmpb,COND(<<) %r26, %r25,1b | 662 | cmpb,COND(<<) %r28, %r25,1b |
644 | fdc,m %r23(%r26) | 663 | fdc,m %r1(%r28) |
645 | 664 | ||
646 | sync | 665 | sync |
647 | bv %r0(%r2) | 666 | bv %r0(%r2) |
648 | nop | 667 | pdtlb (%r25) |
649 | .exit | 668 | .exit |
650 | 669 | ||
651 | .procend | 670 | .procend |
652 | ENDPROC(flush_kernel_dcache_page_asm) | 671 | ENDPROC(flush_dcache_page_asm) |
653 | 672 | ||
654 | ENTRY(flush_user_dcache_page) | 673 | ENTRY(flush_icache_page_asm) |
655 | .proc | 674 | .proc |
656 | .callinfo NO_CALLS | 675 | .callinfo NO_CALLS |
657 | .entry | 676 | .entry |
658 | 677 | ||
659 | ldil L%dcache_stride, %r1 | 678 | ldil L%(TMPALIAS_MAP_START), %r28 |
660 | ldw R%dcache_stride(%r1), %r23 | ||
661 | |||
662 | #ifdef CONFIG_64BIT | 679 | #ifdef CONFIG_64BIT |
663 | depdi,z 1,63-PAGE_SHIFT,1, %r25 | 680 | #if (TMPALIAS_MAP_START >= 0x80000000) |
681 | depdi 0, 31,32, %r28 /* clear any sign extension */ | ||
682 | /* FIXME: page size dependend */ | ||
683 | #endif | ||
684 | extrd,u %r26, 56,32, %r26 /* convert phys addr to tlb insert format */ | ||
685 | depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ | ||
686 | depdi 0, 63,12, %r28 /* Clear any offset bits */ | ||
664 | #else | 687 | #else |
665 | depwi,z 1,31-PAGE_SHIFT,1, %r25 | 688 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ |
689 | depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ | ||
690 | depwi 0, 31,12, %r28 /* Clear any offset bits */ | ||
666 | #endif | 691 | #endif |
667 | add %r26, %r25, %r25 | ||
668 | sub %r25, %r23, %r25 | ||
669 | 692 | ||
693 | /* Purge any old translation */ | ||
670 | 694 | ||
671 | 1: fdc,m %r23(%sr3, %r26) | 695 | pitlb (%sr0,%r28) |
672 | fdc,m %r23(%sr3, %r26) | 696 | |
673 | fdc,m %r23(%sr3, %r26) | 697 | ldil L%icache_stride, %r1 |
674 | fdc,m %r23(%sr3, %r26) | 698 | ldw R%icache_stride(%r1), %r1 |
675 | fdc,m %r23(%sr3, %r26) | 699 | |
676 | fdc,m %r23(%sr3, %r26) | 700 | #ifdef CONFIG_64BIT |
677 | fdc,m %r23(%sr3, %r26) | 701 | depdi,z 1, 63-PAGE_SHIFT,1, %r25 |
678 | fdc,m %r23(%sr3, %r26) | 702 | #else |
679 | fdc,m %r23(%sr3, %r26) | 703 | depwi,z 1, 31-PAGE_SHIFT,1, %r25 |
680 | fdc,m %r23(%sr3, %r26) | 704 | #endif |
681 | fdc,m %r23(%sr3, %r26) | 705 | add %r28, %r25, %r25 |
682 | fdc,m %r23(%sr3, %r26) | 706 | sub %r25, %r1, %r25 |
683 | fdc,m %r23(%sr3, %r26) | 707 | |
684 | fdc,m %r23(%sr3, %r26) | 708 | |
685 | fdc,m %r23(%sr3, %r26) | 709 | 1: fic,m %r1(%r28) |
686 | cmpb,COND(<<) %r26, %r25,1b | 710 | fic,m %r1(%r28) |
687 | fdc,m %r23(%sr3, %r26) | 711 | fic,m %r1(%r28) |
712 | fic,m %r1(%r28) | ||
713 | fic,m %r1(%r28) | ||
714 | fic,m %r1(%r28) | ||
715 | fic,m %r1(%r28) | ||
716 | fic,m %r1(%r28) | ||
717 | fic,m %r1(%r28) | ||
718 | fic,m %r1(%r28) | ||
719 | fic,m %r1(%r28) | ||
720 | fic,m %r1(%r28) | ||
721 | fic,m %r1(%r28) | ||
722 | fic,m %r1(%r28) | ||
723 | fic,m %r1(%r28) | ||
724 | cmpb,COND(<<) %r28, %r25,1b | ||
725 | fic,m %r1(%r28) | ||
688 | 726 | ||
689 | sync | 727 | sync |
690 | bv %r0(%r2) | 728 | bv %r0(%r2) |
691 | nop | 729 | pitlb (%sr0,%r25) |
692 | .exit | 730 | .exit |
693 | 731 | ||
694 | .procend | 732 | .procend |
695 | ENDPROC(flush_user_dcache_page) | 733 | ENDPROC(flush_icache_page_asm) |
696 | 734 | ||
697 | ENTRY(flush_user_icache_page) | 735 | ENTRY(flush_kernel_dcache_page_asm) |
698 | .proc | 736 | .proc |
699 | .callinfo NO_CALLS | 737 | .callinfo NO_CALLS |
700 | .entry | 738 | .entry |
@@ -711,23 +749,23 @@ ENTRY(flush_user_icache_page) | |||
711 | sub %r25, %r23, %r25 | 749 | sub %r25, %r23, %r25 |
712 | 750 | ||
713 | 751 | ||
714 | 1: fic,m %r23(%sr3, %r26) | 752 | 1: fdc,m %r23(%r26) |
715 | fic,m %r23(%sr3, %r26) | 753 | fdc,m %r23(%r26) |
716 | fic,m %r23(%sr3, %r26) | 754 | fdc,m %r23(%r26) |
717 | fic,m %r23(%sr3, %r26) | 755 | fdc,m %r23(%r26) |
718 | fic,m %r23(%sr3, %r26) | 756 | fdc,m %r23(%r26) |
719 | fic,m %r23(%sr3, %r26) | 757 | fdc,m %r23(%r26) |
720 | fic,m %r23(%sr3, %r26) | 758 | fdc,m %r23(%r26) |
721 | fic,m %r23(%sr3, %r26) | 759 | fdc,m %r23(%r26) |
722 | fic,m %r23(%sr3, %r26) | 760 | fdc,m %r23(%r26) |
723 | fic,m %r23(%sr3, %r26) | 761 | fdc,m %r23(%r26) |
724 | fic,m %r23(%sr3, %r26) | 762 | fdc,m %r23(%r26) |
725 | fic,m %r23(%sr3, %r26) | 763 | fdc,m %r23(%r26) |
726 | fic,m %r23(%sr3, %r26) | 764 | fdc,m %r23(%r26) |
727 | fic,m %r23(%sr3, %r26) | 765 | fdc,m %r23(%r26) |
728 | fic,m %r23(%sr3, %r26) | 766 | fdc,m %r23(%r26) |
729 | cmpb,COND(<<) %r26, %r25,1b | 767 | cmpb,COND(<<) %r26, %r25,1b |
730 | fic,m %r23(%sr3, %r26) | 768 | fdc,m %r23(%r26) |
731 | 769 | ||
732 | sync | 770 | sync |
733 | bv %r0(%r2) | 771 | bv %r0(%r2) |
@@ -735,8 +773,7 @@ ENTRY(flush_user_icache_page) | |||
735 | .exit | 773 | .exit |
736 | 774 | ||
737 | .procend | 775 | .procend |
738 | ENDPROC(flush_user_icache_page) | 776 | ENDPROC(flush_kernel_dcache_page_asm) |
739 | |||
740 | 777 | ||
741 | ENTRY(purge_kernel_dcache_page) | 778 | ENTRY(purge_kernel_dcache_page) |
742 | .proc | 779 | .proc |
@@ -780,69 +817,6 @@ ENTRY(purge_kernel_dcache_page) | |||
780 | .procend | 817 | .procend |
781 | ENDPROC(purge_kernel_dcache_page) | 818 | ENDPROC(purge_kernel_dcache_page) |
782 | 819 | ||
783 | #if 0 | ||
784 | /* Currently not used, but it still is a possible alternate | ||
785 | * solution. | ||
786 | */ | ||
787 | |||
788 | ENTRY(flush_alias_page) | ||
789 | .proc | ||
790 | .callinfo NO_CALLS | ||
791 | .entry | ||
792 | |||
793 | tophys_r1 %r26 | ||
794 | |||
795 | ldil L%(TMPALIAS_MAP_START), %r28 | ||
796 | #ifdef CONFIG_64BIT | ||
797 | extrd,u %r26, 56,32, %r26 /* convert phys addr to tlb insert format */ | ||
798 | depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ | ||
799 | depdi 0, 63,12, %r28 /* Clear any offset bits */ | ||
800 | #else | ||
801 | extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ | ||
802 | depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ | ||
803 | depwi 0, 31,12, %r28 /* Clear any offset bits */ | ||
804 | #endif | ||
805 | |||
806 | /* Purge any old translation */ | ||
807 | |||
808 | pdtlb 0(%r28) | ||
809 | |||
810 | ldil L%dcache_stride, %r1 | ||
811 | ldw R%dcache_stride(%r1), %r23 | ||
812 | |||
813 | #ifdef CONFIG_64BIT | ||
814 | depdi,z 1, 63-PAGE_SHIFT,1, %r29 | ||
815 | #else | ||
816 | depwi,z 1, 31-PAGE_SHIFT,1, %r29 | ||
817 | #endif | ||
818 | add %r28, %r29, %r29 | ||
819 | sub %r29, %r23, %r29 | ||
820 | |||
821 | 1: fdc,m %r23(%r28) | ||
822 | fdc,m %r23(%r28) | ||
823 | fdc,m %r23(%r28) | ||
824 | fdc,m %r23(%r28) | ||
825 | fdc,m %r23(%r28) | ||
826 | fdc,m %r23(%r28) | ||
827 | fdc,m %r23(%r28) | ||
828 | fdc,m %r23(%r28) | ||
829 | fdc,m %r23(%r28) | ||
830 | fdc,m %r23(%r28) | ||
831 | fdc,m %r23(%r28) | ||
832 | fdc,m %r23(%r28) | ||
833 | fdc,m %r23(%r28) | ||
834 | fdc,m %r23(%r28) | ||
835 | fdc,m %r23(%r28) | ||
836 | cmpb,COND(<<) %r28, %r29, 1b | ||
837 | fdc,m %r23(%r28) | ||
838 | |||
839 | sync | ||
840 | bv %r0(%r2) | ||
841 | nop | ||
842 | .exit | ||
843 | |||
844 | .procend | ||
845 | #endif | ||
846 | 820 | ||
847 | .export flush_user_dcache_range_asm | 821 | .export flush_user_dcache_range_asm |
848 | 822 | ||
@@ -865,7 +839,6 @@ flush_user_dcache_range_asm: | |||
865 | .exit | 839 | .exit |
866 | 840 | ||
867 | .procend | 841 | .procend |
868 | ENDPROC(flush_alias_page) | ||
869 | 842 | ||
870 | ENTRY(flush_kernel_dcache_range_asm) | 843 | ENTRY(flush_kernel_dcache_range_asm) |
871 | .proc | 844 | .proc |