| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-or-later */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * PARISC TLB and cache flushing support |
|---|
| 3 | 4 | * Copyright (C) 2000-2001 Hewlett-Packard (John Marvin) |
|---|
| 4 | 5 | * Copyright (C) 2001 Matthew Wilcox (willy at parisc-linux.org) |
|---|
| 5 | 6 | * Copyright (C) 2002 Richard Hirst (rhirst with parisc-linux.org) |
|---|
| 6 | | - * |
|---|
| 7 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 8 | | - * it under the terms of the GNU General Public License as published by |
|---|
| 9 | | - * the Free Software Foundation; either version 2, or (at your option) |
|---|
| 10 | | - * any later version. |
|---|
| 11 | | - * |
|---|
| 12 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 13 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 14 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 15 | | - * GNU General Public License for more details. |
|---|
| 16 | | - * |
|---|
| 17 | | - * You should have received a copy of the GNU General Public License |
|---|
| 18 | | - * along with this program; if not, write to the Free Software |
|---|
| 19 | | - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|---|
| 20 | 7 | */ |
|---|
| 21 | 8 | |
|---|
| 22 | 9 | /* |
|---|
| .. | .. |
|---|
| 34 | 21 | |
|---|
| 35 | 22 | #include <asm/psw.h> |
|---|
| 36 | 23 | #include <asm/assembly.h> |
|---|
| 37 | | -#include <asm/pgtable.h> |
|---|
| 38 | 24 | #include <asm/cache.h> |
|---|
| 39 | 25 | #include <asm/ldcw.h> |
|---|
| 26 | +#include <asm/alternative.h> |
|---|
| 40 | 27 | #include <linux/linkage.h> |
|---|
| 41 | 28 | #include <linux/init.h> |
|---|
| 29 | +#include <linux/pgtable.h> |
|---|
| 42 | 30 | |
|---|
| 43 | 31 | .section .text.hot |
|---|
| 44 | 32 | .align 16 |
|---|
| .. | .. |
|---|
| 75 | 63 | |
|---|
| 76 | 64 | /* Flush Instruction Tlb */ |
|---|
| 77 | 65 | |
|---|
| 78 | | - LDREG ITLB_SID_BASE(%r1), %r20 |
|---|
| 66 | +88: LDREG ITLB_SID_BASE(%r1), %r20 |
|---|
| 79 | 67 | LDREG ITLB_SID_STRIDE(%r1), %r21 |
|---|
| 80 | 68 | LDREG ITLB_SID_COUNT(%r1), %r22 |
|---|
| 81 | 69 | LDREG ITLB_OFF_BASE(%r1), %arg0 |
|---|
| .. | .. |
|---|
| 115 | 103 | add %r21, %r20, %r20 /* increment space */ |
|---|
| 116 | 104 | |
|---|
| 117 | 105 | fitdone: |
|---|
| 106 | + ALTERNATIVE(88b, fitdone, ALT_COND_NO_SPLIT_TLB, INSN_NOP) |
|---|
| 118 | 107 | |
|---|
| 119 | 108 | /* Flush Data Tlb */ |
|---|
| 120 | 109 | |
|---|
| .. | .. |
|---|
| 185 | 174 | |
|---|
| 186 | 175 | 2: bv %r0(%r2) |
|---|
| 187 | 176 | nop |
|---|
| 177 | + |
|---|
| 178 | + /* |
|---|
| 179 | + * When running in qemu, drop whole flush_tlb_all_local function and |
|---|
| 180 | + * replace by one pdtlbe instruction, for which QEMU will drop all |
|---|
| 181 | + * local TLB entries. |
|---|
| 182 | + */ |
|---|
| 183 | +3: pdtlbe %r0(%sr1,%r0) |
|---|
| 184 | + bv,n %r0(%r2) |
|---|
| 185 | + ALTERNATIVE_CODE(flush_tlb_all_local, 2, ALT_COND_RUN_ON_QEMU, 3b) |
|---|
| 188 | 186 | ENDPROC_CFI(flush_tlb_all_local) |
|---|
| 189 | 187 | |
|---|
| 190 | 188 | .import cache_info,data |
|---|
| 191 | 189 | |
|---|
| 192 | 190 | ENTRY_CFI(flush_instruction_cache_local) |
|---|
| 193 | | - load32 cache_info, %r1 |
|---|
| 191 | +88: load32 cache_info, %r1 |
|---|
| 194 | 192 | |
|---|
| 195 | 193 | /* Flush Instruction Cache */ |
|---|
| 196 | 194 | |
|---|
| .. | .. |
|---|
| 243 | 241 | fisync: |
|---|
| 244 | 242 | sync |
|---|
| 245 | 243 | mtsm %r22 /* restore I-bit */ |
|---|
| 244 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_ICACHE, INSN_NOP) |
|---|
| 246 | 245 | bv %r0(%r2) |
|---|
| 247 | 246 | nop |
|---|
| 248 | 247 | ENDPROC_CFI(flush_instruction_cache_local) |
|---|
| .. | .. |
|---|
| 250 | 249 | |
|---|
| 251 | 250 | .import cache_info, data |
|---|
| 252 | 251 | ENTRY_CFI(flush_data_cache_local) |
|---|
| 253 | | - load32 cache_info, %r1 |
|---|
| 252 | +88: load32 cache_info, %r1 |
|---|
| 254 | 253 | |
|---|
| 255 | 254 | /* Flush Data Cache */ |
|---|
| 256 | 255 | |
|---|
| .. | .. |
|---|
| 304 | 303 | syncdma |
|---|
| 305 | 304 | sync |
|---|
| 306 | 305 | mtsm %r22 /* restore I-bit */ |
|---|
| 306 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP) |
|---|
| 307 | 307 | bv %r0(%r2) |
|---|
| 308 | 308 | nop |
|---|
| 309 | 309 | ENDPROC_CFI(flush_data_cache_local) |
|---|
| 310 | | - |
|---|
| 311 | | -/* Macros to serialize TLB purge operations on SMP. */ |
|---|
| 312 | | - |
|---|
| 313 | | - .macro tlb_lock la,flags,tmp |
|---|
| 314 | | -#ifdef CONFIG_SMP |
|---|
| 315 | | -#if __PA_LDCW_ALIGNMENT > 4 |
|---|
| 316 | | - load32 pa_tlb_lock + __PA_LDCW_ALIGNMENT-1, \la |
|---|
| 317 | | - depi 0,31,__PA_LDCW_ALIGN_ORDER, \la |
|---|
| 318 | | -#else |
|---|
| 319 | | - load32 pa_tlb_lock, \la |
|---|
| 320 | | -#endif |
|---|
| 321 | | - rsm PSW_SM_I,\flags |
|---|
| 322 | | -1: LDCW 0(\la),\tmp |
|---|
| 323 | | - cmpib,<>,n 0,\tmp,3f |
|---|
| 324 | | -2: ldw 0(\la),\tmp |
|---|
| 325 | | - cmpb,<> %r0,\tmp,1b |
|---|
| 326 | | - nop |
|---|
| 327 | | - b,n 2b |
|---|
| 328 | | -3: |
|---|
| 329 | | -#endif |
|---|
| 330 | | - .endm |
|---|
| 331 | | - |
|---|
| 332 | | - .macro tlb_unlock la,flags,tmp |
|---|
| 333 | | -#ifdef CONFIG_SMP |
|---|
| 334 | | - ldi 1,\tmp |
|---|
| 335 | | - sync |
|---|
| 336 | | - stw \tmp,0(\la) |
|---|
| 337 | | - mtsm \flags |
|---|
| 338 | | -#endif |
|---|
| 339 | | - .endm |
|---|
| 340 | 310 | |
|---|
| 341 | 311 | /* Clear page using kernel mapping. */ |
|---|
| 342 | 312 | |
|---|
| .. | .. |
|---|
| 595 | 565 | pdtlb,l %r0(%r28) |
|---|
| 596 | 566 | pdtlb,l %r0(%r29) |
|---|
| 597 | 567 | #else |
|---|
| 598 | | - tlb_lock %r20,%r21,%r22 |
|---|
| 599 | | - pdtlb %r0(%r28) |
|---|
| 600 | | - pdtlb %r0(%r29) |
|---|
| 601 | | - tlb_unlock %r20,%r21,%r22 |
|---|
| 568 | +0: pdtlb %r0(%r28) |
|---|
| 569 | +1: pdtlb %r0(%r29) |
|---|
| 570 | + ALTERNATIVE(0b, 0b+4, ALT_COND_NO_SMP, INSN_PxTLB) |
|---|
| 571 | + ALTERNATIVE(1b, 1b+4, ALT_COND_NO_SMP, INSN_PxTLB) |
|---|
| 602 | 572 | #endif |
|---|
| 603 | 573 | |
|---|
| 604 | 574 | #ifdef CONFIG_64BIT |
|---|
| .. | .. |
|---|
| 735 | 705 | #ifdef CONFIG_PA20 |
|---|
| 736 | 706 | pdtlb,l %r0(%r28) |
|---|
| 737 | 707 | #else |
|---|
| 738 | | - tlb_lock %r20,%r21,%r22 |
|---|
| 739 | | - pdtlb %r0(%r28) |
|---|
| 740 | | - tlb_unlock %r20,%r21,%r22 |
|---|
| 708 | +0: pdtlb %r0(%r28) |
|---|
| 709 | + ALTERNATIVE(0b, 0b+4, ALT_COND_NO_SMP, INSN_PxTLB) |
|---|
| 741 | 710 | #endif |
|---|
| 742 | 711 | |
|---|
| 743 | 712 | #ifdef CONFIG_64BIT |
|---|
| .. | .. |
|---|
| 812 | 781 | #ifdef CONFIG_PA20 |
|---|
| 813 | 782 | pdtlb,l %r0(%r28) |
|---|
| 814 | 783 | #else |
|---|
| 815 | | - tlb_lock %r20,%r21,%r22 |
|---|
| 816 | | - pdtlb %r0(%r28) |
|---|
| 817 | | - tlb_unlock %r20,%r21,%r22 |
|---|
| 784 | +0: pdtlb %r0(%r28) |
|---|
| 785 | + ALTERNATIVE(0b, 0b+4, ALT_COND_NO_SMP, INSN_PxTLB) |
|---|
| 818 | 786 | #endif |
|---|
| 819 | 787 | |
|---|
| 820 | | - ldil L%dcache_stride, %r1 |
|---|
| 788 | +88: ldil L%dcache_stride, %r1 |
|---|
| 821 | 789 | ldw R%dcache_stride(%r1), r31 |
|---|
| 822 | 790 | |
|---|
| 823 | 791 | #ifdef CONFIG_64BIT |
|---|
| .. | .. |
|---|
| 828 | 796 | add %r28, %r25, %r25 |
|---|
| 829 | 797 | sub %r25, r31, %r25 |
|---|
| 830 | 798 | |
|---|
| 831 | | - |
|---|
| 832 | | -1: fdc,m r31(%r28) |
|---|
| 799 | +1: fdc,m r31(%r28) |
|---|
| 833 | 800 | fdc,m r31(%r28) |
|---|
| 834 | 801 | fdc,m r31(%r28) |
|---|
| 835 | 802 | fdc,m r31(%r28) |
|---|
| .. | .. |
|---|
| 844 | 811 | fdc,m r31(%r28) |
|---|
| 845 | 812 | fdc,m r31(%r28) |
|---|
| 846 | 813 | fdc,m r31(%r28) |
|---|
| 847 | | - cmpb,COND(<<) %r28, %r25,1b |
|---|
| 814 | + cmpb,COND(>>) %r25, %r28, 1b /* predict taken */ |
|---|
| 848 | 815 | fdc,m r31(%r28) |
|---|
| 849 | 816 | |
|---|
| 817 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP) |
|---|
| 850 | 818 | sync |
|---|
| 851 | 819 | bv %r0(%r2) |
|---|
| 852 | 820 | nop |
|---|
| 853 | 821 | ENDPROC_CFI(flush_dcache_page_asm) |
|---|
| 822 | + |
|---|
| 823 | +ENTRY_CFI(purge_dcache_page_asm) |
|---|
| 824 | + ldil L%(TMPALIAS_MAP_START), %r28 |
|---|
| 825 | +#ifdef CONFIG_64BIT |
|---|
| 826 | +#if (TMPALIAS_MAP_START >= 0x80000000) |
|---|
| 827 | + depdi 0, 31,32, %r28 /* clear any sign extension */ |
|---|
| 828 | +#endif |
|---|
| 829 | + convert_phys_for_tlb_insert20 %r26 /* convert phys addr to tlb insert format */ |
|---|
| 830 | + depd %r25, 63,22, %r28 /* Form aliased virtual address 'to' */ |
|---|
| 831 | + depdi 0, 63,PAGE_SHIFT, %r28 /* Clear any offset bits */ |
|---|
| 832 | +#else |
|---|
| 833 | + extrw,u %r26, 24,25, %r26 /* convert phys addr to tlb insert format */ |
|---|
| 834 | + depw %r25, 31,22, %r28 /* Form aliased virtual address 'to' */ |
|---|
| 835 | + depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ |
|---|
| 836 | +#endif |
|---|
| 837 | + |
|---|
| 838 | + /* Purge any old translation */ |
|---|
| 839 | + |
|---|
| 840 | +#ifdef CONFIG_PA20 |
|---|
| 841 | + pdtlb,l %r0(%r28) |
|---|
| 842 | +#else |
|---|
| 843 | +0: pdtlb %r0(%r28) |
|---|
| 844 | + ALTERNATIVE(0b, 0b+4, ALT_COND_NO_SMP, INSN_PxTLB) |
|---|
| 845 | +#endif |
|---|
| 846 | + |
|---|
| 847 | +88: ldil L%dcache_stride, %r1 |
|---|
| 848 | + ldw R%dcache_stride(%r1), r31 |
|---|
| 849 | + |
|---|
| 850 | +#ifdef CONFIG_64BIT |
|---|
| 851 | + depdi,z 1, 63-PAGE_SHIFT,1, %r25 |
|---|
| 852 | +#else |
|---|
| 853 | + depwi,z 1, 31-PAGE_SHIFT,1, %r25 |
|---|
| 854 | +#endif |
|---|
| 855 | + add %r28, %r25, %r25 |
|---|
| 856 | + sub %r25, r31, %r25 |
|---|
| 857 | + |
|---|
| 858 | +1: pdc,m r31(%r28) |
|---|
| 859 | + pdc,m r31(%r28) |
|---|
| 860 | + pdc,m r31(%r28) |
|---|
| 861 | + pdc,m r31(%r28) |
|---|
| 862 | + pdc,m r31(%r28) |
|---|
| 863 | + pdc,m r31(%r28) |
|---|
| 864 | + pdc,m r31(%r28) |
|---|
| 865 | + pdc,m r31(%r28) |
|---|
| 866 | + pdc,m r31(%r28) |
|---|
| 867 | + pdc,m r31(%r28) |
|---|
| 868 | + pdc,m r31(%r28) |
|---|
| 869 | + pdc,m r31(%r28) |
|---|
| 870 | + pdc,m r31(%r28) |
|---|
| 871 | + pdc,m r31(%r28) |
|---|
| 872 | + pdc,m r31(%r28) |
|---|
| 873 | + cmpb,COND(>>) %r25, %r28, 1b /* predict taken */ |
|---|
| 874 | + pdc,m r31(%r28) |
|---|
| 875 | + |
|---|
| 876 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP) |
|---|
| 877 | + sync |
|---|
| 878 | + bv %r0(%r2) |
|---|
| 879 | + nop |
|---|
| 880 | +ENDPROC_CFI(purge_dcache_page_asm) |
|---|
| 854 | 881 | |
|---|
| 855 | 882 | ENTRY_CFI(flush_icache_page_asm) |
|---|
| 856 | 883 | ldil L%(TMPALIAS_MAP_START), %r28 |
|---|
| .. | .. |
|---|
| 874 | 901 | |
|---|
| 875 | 902 | #ifdef CONFIG_PA20 |
|---|
| 876 | 903 | pdtlb,l %r0(%r28) |
|---|
| 877 | | - pitlb,l %r0(%sr4,%r28) |
|---|
| 904 | +1: pitlb,l %r0(%sr4,%r28) |
|---|
| 905 | + ALTERNATIVE(1b, 1b+4, ALT_COND_NO_SPLIT_TLB, INSN_NOP) |
|---|
| 878 | 906 | #else |
|---|
| 879 | | - tlb_lock %r20,%r21,%r22 |
|---|
| 880 | | - pdtlb %r0(%r28) |
|---|
| 881 | | - pitlb %r0(%sr4,%r28) |
|---|
| 882 | | - tlb_unlock %r20,%r21,%r22 |
|---|
| 907 | +0: pdtlb %r0(%r28) |
|---|
| 908 | +1: pitlb %r0(%sr4,%r28) |
|---|
| 909 | + ALTERNATIVE(0b, 0b+4, ALT_COND_NO_SMP, INSN_PxTLB) |
|---|
| 910 | + ALTERNATIVE(1b, 1b+4, ALT_COND_NO_SMP, INSN_PxTLB) |
|---|
| 911 | + ALTERNATIVE(1b, 1b+4, ALT_COND_NO_SPLIT_TLB, INSN_NOP) |
|---|
| 883 | 912 | #endif |
|---|
| 884 | 913 | |
|---|
| 885 | | - ldil L%icache_stride, %r1 |
|---|
| 914 | +88: ldil L%icache_stride, %r1 |
|---|
| 886 | 915 | ldw R%icache_stride(%r1), %r31 |
|---|
| 887 | 916 | |
|---|
| 888 | 917 | #ifdef CONFIG_64BIT |
|---|
| .. | .. |
|---|
| 892 | 921 | #endif |
|---|
| 893 | 922 | add %r28, %r25, %r25 |
|---|
| 894 | 923 | sub %r25, %r31, %r25 |
|---|
| 895 | | - |
|---|
| 896 | 924 | |
|---|
| 897 | 925 | /* fic only has the type 26 form on PA1.1, requiring an |
|---|
| 898 | 926 | * explicit space specification, so use %sr4 */ |
|---|
| .. | .. |
|---|
| 911 | 939 | fic,m %r31(%sr4,%r28) |
|---|
| 912 | 940 | fic,m %r31(%sr4,%r28) |
|---|
| 913 | 941 | fic,m %r31(%sr4,%r28) |
|---|
| 914 | | - cmpb,COND(<<) %r28, %r25,1b |
|---|
| 942 | + cmpb,COND(>>) %r25, %r28, 1b /* predict taken */ |
|---|
| 915 | 943 | fic,m %r31(%sr4,%r28) |
|---|
| 916 | 944 | |
|---|
| 945 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_ICACHE, INSN_NOP) |
|---|
| 917 | 946 | sync |
|---|
| 918 | 947 | bv %r0(%r2) |
|---|
| 919 | 948 | nop |
|---|
| 920 | 949 | ENDPROC_CFI(flush_icache_page_asm) |
|---|
| 921 | 950 | |
|---|
| 922 | 951 | ENTRY_CFI(flush_kernel_dcache_page_asm) |
|---|
| 923 | | - ldil L%dcache_stride, %r1 |
|---|
| 952 | +88: ldil L%dcache_stride, %r1 |
|---|
| 924 | 953 | ldw R%dcache_stride(%r1), %r23 |
|---|
| 925 | 954 | |
|---|
| 926 | 955 | #ifdef CONFIG_64BIT |
|---|
| .. | .. |
|---|
| 930 | 959 | #endif |
|---|
| 931 | 960 | add %r26, %r25, %r25 |
|---|
| 932 | 961 | sub %r25, %r23, %r25 |
|---|
| 933 | | - |
|---|
| 934 | 962 | |
|---|
| 935 | 963 | 1: fdc,m %r23(%r26) |
|---|
| 936 | 964 | fdc,m %r23(%r26) |
|---|
| .. | .. |
|---|
| 947 | 975 | fdc,m %r23(%r26) |
|---|
| 948 | 976 | fdc,m %r23(%r26) |
|---|
| 949 | 977 | fdc,m %r23(%r26) |
|---|
| 950 | | - cmpb,COND(<<) %r26, %r25,1b |
|---|
| 978 | + cmpb,COND(>>) %r25, %r26, 1b /* predict taken */ |
|---|
| 951 | 979 | fdc,m %r23(%r26) |
|---|
| 952 | 980 | |
|---|
| 981 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP) |
|---|
| 953 | 982 | sync |
|---|
| 954 | 983 | bv %r0(%r2) |
|---|
| 955 | 984 | nop |
|---|
| 956 | 985 | ENDPROC_CFI(flush_kernel_dcache_page_asm) |
|---|
| 957 | 986 | |
|---|
| 958 | 987 | ENTRY_CFI(purge_kernel_dcache_page_asm) |
|---|
| 959 | | - ldil L%dcache_stride, %r1 |
|---|
| 988 | +88: ldil L%dcache_stride, %r1 |
|---|
| 960 | 989 | ldw R%dcache_stride(%r1), %r23 |
|---|
| 961 | 990 | |
|---|
| 962 | 991 | #ifdef CONFIG_64BIT |
|---|
| .. | .. |
|---|
| 982 | 1011 | pdc,m %r23(%r26) |
|---|
| 983 | 1012 | pdc,m %r23(%r26) |
|---|
| 984 | 1013 | pdc,m %r23(%r26) |
|---|
| 985 | | - cmpb,COND(<<) %r26, %r25, 1b |
|---|
| 1014 | + cmpb,COND(>>) %r25, %r26, 1b /* predict taken */ |
|---|
| 986 | 1015 | pdc,m %r23(%r26) |
|---|
| 987 | 1016 | |
|---|
| 1017 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP) |
|---|
| 988 | 1018 | sync |
|---|
| 989 | 1019 | bv %r0(%r2) |
|---|
| 990 | 1020 | nop |
|---|
| 991 | 1021 | ENDPROC_CFI(purge_kernel_dcache_page_asm) |
|---|
| 992 | 1022 | |
|---|
| 993 | 1023 | ENTRY_CFI(flush_user_dcache_range_asm) |
|---|
| 994 | | - ldil L%dcache_stride, %r1 |
|---|
| 1024 | +88: ldil L%dcache_stride, %r1 |
|---|
| 995 | 1025 | ldw R%dcache_stride(%r1), %r23 |
|---|
| 996 | 1026 | ldo -1(%r23), %r21 |
|---|
| 997 | 1027 | ANDCM %r26, %r21, %r26 |
|---|
| 998 | 1028 | |
|---|
| 999 | | -1: cmpb,COND(<<),n %r26, %r25, 1b |
|---|
| 1029 | +#ifdef CONFIG_64BIT |
|---|
| 1030 | + depd,z %r23, 59, 60, %r21 |
|---|
| 1031 | +#else |
|---|
| 1032 | + depw,z %r23, 27, 28, %r21 |
|---|
| 1033 | +#endif |
|---|
| 1034 | + add %r26, %r21, %r22 |
|---|
| 1035 | + cmpb,COND(>>),n %r22, %r25, 2f /* predict not taken */ |
|---|
| 1036 | +1: add %r22, %r21, %r22 |
|---|
| 1037 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1038 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1039 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1040 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1041 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1042 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1043 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1044 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1045 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1046 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1047 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1048 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1049 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1050 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1051 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1052 | + cmpb,COND(<<=) %r22, %r25, 1b /* predict taken */ |
|---|
| 1000 | 1053 | fdc,m %r23(%sr3, %r26) |
|---|
| 1001 | 1054 | |
|---|
| 1055 | +2: cmpb,COND(>>),n %r25, %r26, 2b |
|---|
| 1056 | + fdc,m %r23(%sr3, %r26) |
|---|
| 1057 | + |
|---|
| 1058 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP) |
|---|
| 1002 | 1059 | sync |
|---|
| 1003 | 1060 | bv %r0(%r2) |
|---|
| 1004 | 1061 | nop |
|---|
| 1005 | 1062 | ENDPROC_CFI(flush_user_dcache_range_asm) |
|---|
| 1006 | 1063 | |
|---|
| 1007 | 1064 | ENTRY_CFI(flush_kernel_dcache_range_asm) |
|---|
| 1008 | | - ldil L%dcache_stride, %r1 |
|---|
| 1065 | +88: ldil L%dcache_stride, %r1 |
|---|
| 1009 | 1066 | ldw R%dcache_stride(%r1), %r23 |
|---|
| 1010 | 1067 | ldo -1(%r23), %r21 |
|---|
| 1011 | 1068 | ANDCM %r26, %r21, %r26 |
|---|
| 1012 | 1069 | |
|---|
| 1013 | | -1: cmpb,COND(<<),n %r26, %r25,1b |
|---|
| 1070 | +#ifdef CONFIG_64BIT |
|---|
| 1071 | + depd,z %r23, 59, 60, %r21 |
|---|
| 1072 | +#else |
|---|
| 1073 | + depw,z %r23, 27, 28, %r21 |
|---|
| 1074 | +#endif |
|---|
| 1075 | + add %r26, %r21, %r22 |
|---|
| 1076 | + cmpb,COND(>>),n %r22, %r25, 2f /* predict not taken */ |
|---|
| 1077 | +1: add %r22, %r21, %r22 |
|---|
| 1078 | + fdc,m %r23(%r26) |
|---|
| 1079 | + fdc,m %r23(%r26) |
|---|
| 1080 | + fdc,m %r23(%r26) |
|---|
| 1081 | + fdc,m %r23(%r26) |
|---|
| 1082 | + fdc,m %r23(%r26) |
|---|
| 1083 | + fdc,m %r23(%r26) |
|---|
| 1084 | + fdc,m %r23(%r26) |
|---|
| 1085 | + fdc,m %r23(%r26) |
|---|
| 1086 | + fdc,m %r23(%r26) |
|---|
| 1087 | + fdc,m %r23(%r26) |
|---|
| 1088 | + fdc,m %r23(%r26) |
|---|
| 1089 | + fdc,m %r23(%r26) |
|---|
| 1090 | + fdc,m %r23(%r26) |
|---|
| 1091 | + fdc,m %r23(%r26) |
|---|
| 1092 | + fdc,m %r23(%r26) |
|---|
| 1093 | + cmpb,COND(<<=) %r22, %r25, 1b /* predict taken */ |
|---|
| 1094 | + fdc,m %r23(%r26) |
|---|
| 1095 | + |
|---|
| 1096 | +2: cmpb,COND(>>),n %r25, %r26, 2b /* predict taken */ |
|---|
| 1014 | 1097 | fdc,m %r23(%r26) |
|---|
| 1015 | 1098 | |
|---|
| 1016 | 1099 | sync |
|---|
| 1100 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP) |
|---|
| 1017 | 1101 | syncdma |
|---|
| 1018 | 1102 | bv %r0(%r2) |
|---|
| 1019 | 1103 | nop |
|---|
| 1020 | 1104 | ENDPROC_CFI(flush_kernel_dcache_range_asm) |
|---|
| 1021 | 1105 | |
|---|
| 1022 | 1106 | ENTRY_CFI(purge_kernel_dcache_range_asm) |
|---|
| 1023 | | - ldil L%dcache_stride, %r1 |
|---|
| 1107 | +88: ldil L%dcache_stride, %r1 |
|---|
| 1024 | 1108 | ldw R%dcache_stride(%r1), %r23 |
|---|
| 1025 | 1109 | ldo -1(%r23), %r21 |
|---|
| 1026 | 1110 | ANDCM %r26, %r21, %r26 |
|---|
| 1027 | 1111 | |
|---|
| 1028 | | -1: cmpb,COND(<<),n %r26, %r25,1b |
|---|
| 1112 | +#ifdef CONFIG_64BIT |
|---|
| 1113 | + depd,z %r23, 59, 60, %r21 |
|---|
| 1114 | +#else |
|---|
| 1115 | + depw,z %r23, 27, 28, %r21 |
|---|
| 1116 | +#endif |
|---|
| 1117 | + add %r26, %r21, %r22 |
|---|
| 1118 | + cmpb,COND(>>),n %r22, %r25, 2f /* predict not taken */ |
|---|
| 1119 | +1: add %r22, %r21, %r22 |
|---|
| 1120 | + pdc,m %r23(%r26) |
|---|
| 1121 | + pdc,m %r23(%r26) |
|---|
| 1122 | + pdc,m %r23(%r26) |
|---|
| 1123 | + pdc,m %r23(%r26) |
|---|
| 1124 | + pdc,m %r23(%r26) |
|---|
| 1125 | + pdc,m %r23(%r26) |
|---|
| 1126 | + pdc,m %r23(%r26) |
|---|
| 1127 | + pdc,m %r23(%r26) |
|---|
| 1128 | + pdc,m %r23(%r26) |
|---|
| 1129 | + pdc,m %r23(%r26) |
|---|
| 1130 | + pdc,m %r23(%r26) |
|---|
| 1131 | + pdc,m %r23(%r26) |
|---|
| 1132 | + pdc,m %r23(%r26) |
|---|
| 1133 | + pdc,m %r23(%r26) |
|---|
| 1134 | + pdc,m %r23(%r26) |
|---|
| 1135 | + cmpb,COND(<<=) %r22, %r25, 1b /* predict taken */ |
|---|
| 1136 | + pdc,m %r23(%r26) |
|---|
| 1137 | + |
|---|
| 1138 | +2: cmpb,COND(>>),n %r25, %r26, 2b /* predict taken */ |
|---|
| 1029 | 1139 | pdc,m %r23(%r26) |
|---|
| 1030 | 1140 | |
|---|
| 1031 | 1141 | sync |
|---|
| 1142 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_DCACHE, INSN_NOP) |
|---|
| 1032 | 1143 | syncdma |
|---|
| 1033 | 1144 | bv %r0(%r2) |
|---|
| 1034 | 1145 | nop |
|---|
| 1035 | 1146 | ENDPROC_CFI(purge_kernel_dcache_range_asm) |
|---|
| 1036 | 1147 | |
|---|
| 1037 | 1148 | ENTRY_CFI(flush_user_icache_range_asm) |
|---|
| 1038 | | - ldil L%icache_stride, %r1 |
|---|
| 1149 | +88: ldil L%icache_stride, %r1 |
|---|
| 1039 | 1150 | ldw R%icache_stride(%r1), %r23 |
|---|
| 1040 | 1151 | ldo -1(%r23), %r21 |
|---|
| 1041 | 1152 | ANDCM %r26, %r21, %r26 |
|---|
| 1042 | 1153 | |
|---|
| 1043 | | -1: cmpb,COND(<<),n %r26, %r25,1b |
|---|
| 1154 | +#ifdef CONFIG_64BIT |
|---|
| 1155 | + depd,z %r23, 59, 60, %r21 |
|---|
| 1156 | +#else |
|---|
| 1157 | + depw,z %r23, 27, 28, %r21 |
|---|
| 1158 | +#endif |
|---|
| 1159 | + add %r26, %r21, %r22 |
|---|
| 1160 | + cmpb,COND(>>),n %r22, %r25, 2f /* predict not taken */ |
|---|
| 1161 | +1: add %r22, %r21, %r22 |
|---|
| 1162 | + fic,m %r23(%sr3, %r26) |
|---|
| 1163 | + fic,m %r23(%sr3, %r26) |
|---|
| 1164 | + fic,m %r23(%sr3, %r26) |
|---|
| 1165 | + fic,m %r23(%sr3, %r26) |
|---|
| 1166 | + fic,m %r23(%sr3, %r26) |
|---|
| 1167 | + fic,m %r23(%sr3, %r26) |
|---|
| 1168 | + fic,m %r23(%sr3, %r26) |
|---|
| 1169 | + fic,m %r23(%sr3, %r26) |
|---|
| 1170 | + fic,m %r23(%sr3, %r26) |
|---|
| 1171 | + fic,m %r23(%sr3, %r26) |
|---|
| 1172 | + fic,m %r23(%sr3, %r26) |
|---|
| 1173 | + fic,m %r23(%sr3, %r26) |
|---|
| 1174 | + fic,m %r23(%sr3, %r26) |
|---|
| 1175 | + fic,m %r23(%sr3, %r26) |
|---|
| 1176 | + fic,m %r23(%sr3, %r26) |
|---|
| 1177 | + cmpb,COND(<<=) %r22, %r25, 1b /* predict taken */ |
|---|
| 1044 | 1178 | fic,m %r23(%sr3, %r26) |
|---|
| 1045 | 1179 | |
|---|
| 1180 | +2: cmpb,COND(>>),n %r25, %r26, 2b |
|---|
| 1181 | + fic,m %r23(%sr3, %r26) |
|---|
| 1182 | + |
|---|
| 1183 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_ICACHE, INSN_NOP) |
|---|
| 1046 | 1184 | sync |
|---|
| 1047 | 1185 | bv %r0(%r2) |
|---|
| 1048 | 1186 | nop |
|---|
| 1049 | 1187 | ENDPROC_CFI(flush_user_icache_range_asm) |
|---|
| 1050 | 1188 | |
|---|
| 1051 | 1189 | ENTRY_CFI(flush_kernel_icache_page) |
|---|
| 1052 | | - ldil L%icache_stride, %r1 |
|---|
| 1190 | +88: ldil L%icache_stride, %r1 |
|---|
| 1053 | 1191 | ldw R%icache_stride(%r1), %r23 |
|---|
| 1054 | 1192 | |
|---|
| 1055 | 1193 | #ifdef CONFIG_64BIT |
|---|
| .. | .. |
|---|
| 1076 | 1214 | fic,m %r23(%sr4, %r26) |
|---|
| 1077 | 1215 | fic,m %r23(%sr4, %r26) |
|---|
| 1078 | 1216 | fic,m %r23(%sr4, %r26) |
|---|
| 1079 | | - cmpb,COND(<<) %r26, %r25, 1b |
|---|
| 1217 | + cmpb,COND(>>) %r25, %r26, 1b /* predict taken */ |
|---|
| 1080 | 1218 | fic,m %r23(%sr4, %r26) |
|---|
| 1081 | 1219 | |
|---|
| 1220 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_ICACHE, INSN_NOP) |
|---|
| 1082 | 1221 | sync |
|---|
| 1083 | 1222 | bv %r0(%r2) |
|---|
| 1084 | 1223 | nop |
|---|
| 1085 | 1224 | ENDPROC_CFI(flush_kernel_icache_page) |
|---|
| 1086 | 1225 | |
|---|
| 1087 | 1226 | ENTRY_CFI(flush_kernel_icache_range_asm) |
|---|
| 1088 | | - ldil L%icache_stride, %r1 |
|---|
| 1227 | +88: ldil L%icache_stride, %r1 |
|---|
| 1089 | 1228 | ldw R%icache_stride(%r1), %r23 |
|---|
| 1090 | 1229 | ldo -1(%r23), %r21 |
|---|
| 1091 | 1230 | ANDCM %r26, %r21, %r26 |
|---|
| 1092 | 1231 | |
|---|
| 1093 | | -1: cmpb,COND(<<),n %r26, %r25, 1b |
|---|
| 1232 | +#ifdef CONFIG_64BIT |
|---|
| 1233 | + depd,z %r23, 59, 60, %r21 |
|---|
| 1234 | +#else |
|---|
| 1235 | + depw,z %r23, 27, 28, %r21 |
|---|
| 1236 | +#endif |
|---|
| 1237 | + add %r26, %r21, %r22 |
|---|
| 1238 | + cmpb,COND(>>),n %r22, %r25, 2f /* predict not taken */ |
|---|
| 1239 | +1: add %r22, %r21, %r22 |
|---|
| 1240 | + fic,m %r23(%sr4, %r26) |
|---|
| 1241 | + fic,m %r23(%sr4, %r26) |
|---|
| 1242 | + fic,m %r23(%sr4, %r26) |
|---|
| 1243 | + fic,m %r23(%sr4, %r26) |
|---|
| 1244 | + fic,m %r23(%sr4, %r26) |
|---|
| 1245 | + fic,m %r23(%sr4, %r26) |
|---|
| 1246 | + fic,m %r23(%sr4, %r26) |
|---|
| 1247 | + fic,m %r23(%sr4, %r26) |
|---|
| 1248 | + fic,m %r23(%sr4, %r26) |
|---|
| 1249 | + fic,m %r23(%sr4, %r26) |
|---|
| 1250 | + fic,m %r23(%sr4, %r26) |
|---|
| 1251 | + fic,m %r23(%sr4, %r26) |
|---|
| 1252 | + fic,m %r23(%sr4, %r26) |
|---|
| 1253 | + fic,m %r23(%sr4, %r26) |
|---|
| 1254 | + fic,m %r23(%sr4, %r26) |
|---|
| 1255 | + cmpb,COND(<<=) %r22, %r25, 1b /* predict taken */ |
|---|
| 1094 | 1256 | fic,m %r23(%sr4, %r26) |
|---|
| 1095 | 1257 | |
|---|
| 1258 | +2: cmpb,COND(>>),n %r25, %r26, 2b /* predict taken */ |
|---|
| 1259 | + fic,m %r23(%sr4, %r26) |
|---|
| 1260 | + |
|---|
| 1261 | +89: ALTERNATIVE(88b, 89b, ALT_COND_NO_ICACHE, INSN_NOP) |
|---|
| 1096 | 1262 | sync |
|---|
| 1097 | 1263 | bv %r0(%r2) |
|---|
| 1098 | 1264 | nop |
|---|