18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * We need constants.h for: 48c2ecf20Sopenharmony_ci * VMA_VM_MM 58c2ecf20Sopenharmony_ci * VMA_VM_FLAGS 68c2ecf20Sopenharmony_ci * VM_EXEC 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci#include <asm/asm-offsets.h> 98c2ecf20Sopenharmony_ci#include <asm/thread_info.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_V7M 128c2ecf20Sopenharmony_ci#include <asm/v7m.h> 138c2ecf20Sopenharmony_ci#endif 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/* 168c2ecf20Sopenharmony_ci * vma_vm_mm - get mm pointer from vma pointer (vma->vm_mm) 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ci .macro vma_vm_mm, rd, rn 198c2ecf20Sopenharmony_ci ldr \rd, [\rn, #VMA_VM_MM] 208c2ecf20Sopenharmony_ci .endm 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci/* 238c2ecf20Sopenharmony_ci * vma_vm_flags - get vma->vm_flags 248c2ecf20Sopenharmony_ci */ 258c2ecf20Sopenharmony_ci .macro vma_vm_flags, rd, rn 268c2ecf20Sopenharmony_ci ldr \rd, [\rn, #VMA_VM_FLAGS] 278c2ecf20Sopenharmony_ci .endm 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci/* 308c2ecf20Sopenharmony_ci * act_mm - get current->active_mm 318c2ecf20Sopenharmony_ci */ 328c2ecf20Sopenharmony_ci .macro act_mm, rd 338c2ecf20Sopenharmony_ci get_thread_info \rd 348c2ecf20Sopenharmony_ci ldr \rd, [\rd, #TI_TASK] 358c2ecf20Sopenharmony_ci .if (TSK_ACTIVE_MM > IMM12_MASK) 368c2ecf20Sopenharmony_ci add \rd, \rd, #TSK_ACTIVE_MM & ~IMM12_MASK 378c2ecf20Sopenharmony_ci .endif 388c2ecf20Sopenharmony_ci ldr \rd, [\rd, #TSK_ACTIVE_MM & IMM12_MASK] 398c2ecf20Sopenharmony_ci .endm 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci/* 428c2ecf20Sopenharmony_ci * mmid - get context id from mm pointer (mm->context.id) 438c2ecf20Sopenharmony_ci * note, this field is 64bit, so in big-endian the two words are swapped too. 448c2ecf20Sopenharmony_ci */ 458c2ecf20Sopenharmony_ci .macro mmid, rd, rn 468c2ecf20Sopenharmony_ci#ifdef __ARMEB__ 478c2ecf20Sopenharmony_ci ldr \rd, [\rn, #MM_CONTEXT_ID + 4 ] 488c2ecf20Sopenharmony_ci#else 498c2ecf20Sopenharmony_ci ldr \rd, [\rn, #MM_CONTEXT_ID] 508c2ecf20Sopenharmony_ci#endif 518c2ecf20Sopenharmony_ci .endm 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci/* 548c2ecf20Sopenharmony_ci * mask_asid - mask the ASID from the context ID 558c2ecf20Sopenharmony_ci */ 568c2ecf20Sopenharmony_ci .macro asid, rd, rn 578c2ecf20Sopenharmony_ci and \rd, \rn, #255 588c2ecf20Sopenharmony_ci .endm 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci .macro crval, clear, mmuset, ucset 618c2ecf20Sopenharmony_ci#ifdef CONFIG_MMU 628c2ecf20Sopenharmony_ci .word \clear 638c2ecf20Sopenharmony_ci .word \mmuset 648c2ecf20Sopenharmony_ci#else 658c2ecf20Sopenharmony_ci .word \clear 668c2ecf20Sopenharmony_ci .word \ucset 678c2ecf20Sopenharmony_ci#endif 688c2ecf20Sopenharmony_ci .endm 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci/* 718c2ecf20Sopenharmony_ci * dcache_line_size - get the minimum D-cache line size from the CTR register 728c2ecf20Sopenharmony_ci * on ARMv7. 738c2ecf20Sopenharmony_ci */ 748c2ecf20Sopenharmony_ci .macro dcache_line_size, reg, tmp 758c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_V7M 768c2ecf20Sopenharmony_ci movw \tmp, #:lower16:BASEADDR_V7M_SCB + V7M_SCB_CTR 778c2ecf20Sopenharmony_ci movt \tmp, #:upper16:BASEADDR_V7M_SCB + V7M_SCB_CTR 788c2ecf20Sopenharmony_ci ldr \tmp, [\tmp] 798c2ecf20Sopenharmony_ci#else 808c2ecf20Sopenharmony_ci mrc p15, 0, \tmp, c0, c0, 1 @ read ctr 818c2ecf20Sopenharmony_ci#endif 828c2ecf20Sopenharmony_ci lsr \tmp, \tmp, #16 838c2ecf20Sopenharmony_ci and \tmp, \tmp, #0xf @ cache line size encoding 848c2ecf20Sopenharmony_ci mov \reg, #4 @ bytes per word 858c2ecf20Sopenharmony_ci mov \reg, \reg, lsl \tmp @ actual cache line size 868c2ecf20Sopenharmony_ci .endm 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci/* 898c2ecf20Sopenharmony_ci * icache_line_size - get the minimum I-cache line size from the CTR register 908c2ecf20Sopenharmony_ci * on ARMv7. 918c2ecf20Sopenharmony_ci */ 928c2ecf20Sopenharmony_ci .macro icache_line_size, reg, tmp 938c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_V7M 948c2ecf20Sopenharmony_ci movw \tmp, #:lower16:BASEADDR_V7M_SCB + V7M_SCB_CTR 958c2ecf20Sopenharmony_ci movt \tmp, #:upper16:BASEADDR_V7M_SCB + V7M_SCB_CTR 968c2ecf20Sopenharmony_ci ldr \tmp, [\tmp] 978c2ecf20Sopenharmony_ci#else 988c2ecf20Sopenharmony_ci mrc p15, 0, \tmp, c0, c0, 1 @ read ctr 998c2ecf20Sopenharmony_ci#endif 1008c2ecf20Sopenharmony_ci and \tmp, \tmp, #0xf @ cache line size encoding 1018c2ecf20Sopenharmony_ci mov \reg, #4 @ bytes per word 1028c2ecf20Sopenharmony_ci mov \reg, \reg, lsl \tmp @ actual cache line size 1038c2ecf20Sopenharmony_ci .endm 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci/* 1068c2ecf20Sopenharmony_ci * Sanity check the PTE configuration for the code below - which makes 1078c2ecf20Sopenharmony_ci * certain assumptions about how these bits are laid out. 1088c2ecf20Sopenharmony_ci */ 1098c2ecf20Sopenharmony_ci#ifdef CONFIG_MMU 1108c2ecf20Sopenharmony_ci#if L_PTE_SHARED != PTE_EXT_SHARED 1118c2ecf20Sopenharmony_ci#error PTE shared bit mismatch 1128c2ecf20Sopenharmony_ci#endif 1138c2ecf20Sopenharmony_ci#if !defined (CONFIG_ARM_LPAE) && \ 1148c2ecf20Sopenharmony_ci (L_PTE_XN+L_PTE_USER+L_PTE_RDONLY+L_PTE_DIRTY+L_PTE_YOUNG+\ 1158c2ecf20Sopenharmony_ci L_PTE_PRESENT) > L_PTE_SHARED 1168c2ecf20Sopenharmony_ci#error Invalid Linux PTE bit settings 1178c2ecf20Sopenharmony_ci#endif 1188c2ecf20Sopenharmony_ci#endif /* CONFIG_MMU */ 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci/* 1218c2ecf20Sopenharmony_ci * The ARMv6 and ARMv7 set_pte_ext translation function. 1228c2ecf20Sopenharmony_ci * 1238c2ecf20Sopenharmony_ci * Permission translation: 1248c2ecf20Sopenharmony_ci * YUWD APX AP1 AP0 SVC User 1258c2ecf20Sopenharmony_ci * 0xxx 0 0 0 no acc no acc 1268c2ecf20Sopenharmony_ci * 100x 1 0 1 r/o no acc 1278c2ecf20Sopenharmony_ci * 10x0 1 0 1 r/o no acc 1288c2ecf20Sopenharmony_ci * 1011 0 0 1 r/w no acc 1298c2ecf20Sopenharmony_ci * 110x 1 1 1 r/o r/o 1308c2ecf20Sopenharmony_ci * 11x0 1 1 1 r/o r/o 1318c2ecf20Sopenharmony_ci * 1111 0 1 1 r/w r/w 1328c2ecf20Sopenharmony_ci */ 1338c2ecf20Sopenharmony_ci .macro armv6_mt_table pfx 1348c2ecf20Sopenharmony_ci\pfx\()_mt_table: 1358c2ecf20Sopenharmony_ci .long 0x00 @ L_PTE_MT_UNCACHED 1368c2ecf20Sopenharmony_ci .long PTE_EXT_TEX(1) @ L_PTE_MT_BUFFERABLE 1378c2ecf20Sopenharmony_ci .long PTE_CACHEABLE @ L_PTE_MT_WRITETHROUGH 1388c2ecf20Sopenharmony_ci .long PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_WRITEBACK 1398c2ecf20Sopenharmony_ci .long PTE_BUFFERABLE @ L_PTE_MT_DEV_SHARED 1408c2ecf20Sopenharmony_ci .long 0x00 @ unused 1418c2ecf20Sopenharmony_ci .long 0x00 @ L_PTE_MT_MINICACHE (not present) 1428c2ecf20Sopenharmony_ci .long PTE_EXT_TEX(1) | PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_WRITEALLOC 1438c2ecf20Sopenharmony_ci .long 0x00 @ unused 1448c2ecf20Sopenharmony_ci .long PTE_EXT_TEX(1) @ L_PTE_MT_DEV_WC 1458c2ecf20Sopenharmony_ci .long 0x00 @ unused 1468c2ecf20Sopenharmony_ci .long PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_DEV_CACHED 1478c2ecf20Sopenharmony_ci .long PTE_EXT_TEX(2) @ L_PTE_MT_DEV_NONSHARED 1488c2ecf20Sopenharmony_ci .long 0x00 @ unused 1498c2ecf20Sopenharmony_ci .long 0x00 @ unused 1508c2ecf20Sopenharmony_ci .long PTE_CACHEABLE | PTE_BUFFERABLE | PTE_EXT_APX @ L_PTE_MT_VECTORS 1518c2ecf20Sopenharmony_ci .endm 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci .macro armv6_set_pte_ext pfx 1548c2ecf20Sopenharmony_ci str r1, [r0], #2048 @ linux version 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci bic r3, r1, #0x000003fc 1578c2ecf20Sopenharmony_ci bic r3, r3, #PTE_TYPE_MASK 1588c2ecf20Sopenharmony_ci orr r3, r3, r2 1598c2ecf20Sopenharmony_ci orr r3, r3, #PTE_EXT_AP0 | 2 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci adr ip, \pfx\()_mt_table 1628c2ecf20Sopenharmony_ci and r2, r1, #L_PTE_MT_MASK 1638c2ecf20Sopenharmony_ci ldr r2, [ip, r2] 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci eor r1, r1, #L_PTE_DIRTY 1668c2ecf20Sopenharmony_ci tst r1, #L_PTE_DIRTY|L_PTE_RDONLY 1678c2ecf20Sopenharmony_ci orrne r3, r3, #PTE_EXT_APX 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci tst r1, #L_PTE_USER 1708c2ecf20Sopenharmony_ci orrne r3, r3, #PTE_EXT_AP1 1718c2ecf20Sopenharmony_ci tstne r3, #PTE_EXT_APX 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci @ user read-only -> kernel read-only 1748c2ecf20Sopenharmony_ci bicne r3, r3, #PTE_EXT_AP0 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci tst r1, #L_PTE_XN 1778c2ecf20Sopenharmony_ci orrne r3, r3, #PTE_EXT_XN 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci eor r3, r3, r2 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci tst r1, #L_PTE_YOUNG 1828c2ecf20Sopenharmony_ci tstne r1, #L_PTE_PRESENT 1838c2ecf20Sopenharmony_ci moveq r3, #0 1848c2ecf20Sopenharmony_ci tstne r1, #L_PTE_NONE 1858c2ecf20Sopenharmony_ci movne r3, #0 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci str r3, [r0] 1888c2ecf20Sopenharmony_ci mcr p15, 0, r0, c7, c10, 1 @ flush_pte 1898c2ecf20Sopenharmony_ci .endm 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci/* 1938c2ecf20Sopenharmony_ci * The ARMv3, ARMv4 and ARMv5 set_pte_ext translation function, 1948c2ecf20Sopenharmony_ci * covering most CPUs except Xscale and Xscale 3. 1958c2ecf20Sopenharmony_ci * 1968c2ecf20Sopenharmony_ci * Permission translation: 1978c2ecf20Sopenharmony_ci * YUWD AP SVC User 1988c2ecf20Sopenharmony_ci * 0xxx 0x00 no acc no acc 1998c2ecf20Sopenharmony_ci * 100x 0x00 r/o no acc 2008c2ecf20Sopenharmony_ci * 10x0 0x00 r/o no acc 2018c2ecf20Sopenharmony_ci * 1011 0x55 r/w no acc 2028c2ecf20Sopenharmony_ci * 110x 0xaa r/w r/o 2038c2ecf20Sopenharmony_ci * 11x0 0xaa r/w r/o 2048c2ecf20Sopenharmony_ci * 1111 0xff r/w r/w 2058c2ecf20Sopenharmony_ci */ 2068c2ecf20Sopenharmony_ci .macro armv3_set_pte_ext wc_disable=1 2078c2ecf20Sopenharmony_ci str r1, [r0], #2048 @ linux version 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_ci eor r3, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ci bic r2, r1, #PTE_SMALL_AP_MASK @ keep C, B bits 2128c2ecf20Sopenharmony_ci bic r2, r2, #PTE_TYPE_MASK 2138c2ecf20Sopenharmony_ci orr r2, r2, #PTE_TYPE_SMALL 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci tst r3, #L_PTE_USER @ user? 2168c2ecf20Sopenharmony_ci orrne r2, r2, #PTE_SMALL_AP_URO_SRW 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci tst r3, #L_PTE_RDONLY | L_PTE_DIRTY @ write and dirty? 2198c2ecf20Sopenharmony_ci orreq r2, r2, #PTE_SMALL_AP_UNO_SRW 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci tst r3, #L_PTE_PRESENT | L_PTE_YOUNG @ present and young? 2228c2ecf20Sopenharmony_ci movne r2, #0 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci .if \wc_disable 2258c2ecf20Sopenharmony_ci#ifdef CONFIG_CPU_DCACHE_WRITETHROUGH 2268c2ecf20Sopenharmony_ci tst r2, #PTE_CACHEABLE 2278c2ecf20Sopenharmony_ci bicne r2, r2, #PTE_BUFFERABLE 2288c2ecf20Sopenharmony_ci#endif 2298c2ecf20Sopenharmony_ci .endif 2308c2ecf20Sopenharmony_ci str r2, [r0] @ hardware version 2318c2ecf20Sopenharmony_ci .endm 2328c2ecf20Sopenharmony_ci 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci/* 2358c2ecf20Sopenharmony_ci * Xscale set_pte_ext translation, split into two halves to cope 2368c2ecf20Sopenharmony_ci * with work-arounds. r3 must be preserved by code between these 2378c2ecf20Sopenharmony_ci * two macros. 2388c2ecf20Sopenharmony_ci * 2398c2ecf20Sopenharmony_ci * Permission translation: 2408c2ecf20Sopenharmony_ci * YUWD AP SVC User 2418c2ecf20Sopenharmony_ci * 0xxx 00 no acc no acc 2428c2ecf20Sopenharmony_ci * 100x 00 r/o no acc 2438c2ecf20Sopenharmony_ci * 10x0 00 r/o no acc 2448c2ecf20Sopenharmony_ci * 1011 01 r/w no acc 2458c2ecf20Sopenharmony_ci * 110x 10 r/w r/o 2468c2ecf20Sopenharmony_ci * 11x0 10 r/w r/o 2478c2ecf20Sopenharmony_ci * 1111 11 r/w r/w 2488c2ecf20Sopenharmony_ci */ 2498c2ecf20Sopenharmony_ci .macro xscale_set_pte_ext_prologue 2508c2ecf20Sopenharmony_ci str r1, [r0] @ linux version 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci eor r3, r1, #L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_DIRTY 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci bic r2, r1, #PTE_SMALL_AP_MASK @ keep C, B bits 2558c2ecf20Sopenharmony_ci orr r2, r2, #PTE_TYPE_EXT @ extended page 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci tst r3, #L_PTE_USER @ user? 2588c2ecf20Sopenharmony_ci orrne r2, r2, #PTE_EXT_AP_URO_SRW @ yes -> user r/o, system r/w 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci tst r3, #L_PTE_RDONLY | L_PTE_DIRTY @ write and dirty? 2618c2ecf20Sopenharmony_ci orreq r2, r2, #PTE_EXT_AP_UNO_SRW @ yes -> user n/a, system r/w 2628c2ecf20Sopenharmony_ci @ combined with user -> user r/w 2638c2ecf20Sopenharmony_ci .endm 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_ci .macro xscale_set_pte_ext_epilogue 2668c2ecf20Sopenharmony_ci tst r3, #L_PTE_PRESENT | L_PTE_YOUNG @ present and young? 2678c2ecf20Sopenharmony_ci movne r2, #0 @ no -> fault 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ci str r2, [r0, #2048]! @ hardware version 2708c2ecf20Sopenharmony_ci mov ip, #0 2718c2ecf20Sopenharmony_ci mcr p15, 0, r0, c7, c10, 1 @ clean L1 D line 2728c2ecf20Sopenharmony_ci mcr p15, 0, ip, c7, c10, 4 @ data write barrier 2738c2ecf20Sopenharmony_ci .endm 2748c2ecf20Sopenharmony_ci 2758c2ecf20Sopenharmony_ci.macro define_processor_functions name:req, dabort:req, pabort:req, nommu=0, suspend=0, bugs=0 2768c2ecf20Sopenharmony_ci/* 2778c2ecf20Sopenharmony_ci * If we are building for big.Little with branch predictor hardening, 2788c2ecf20Sopenharmony_ci * we need the processor function tables to remain available after boot. 2798c2ecf20Sopenharmony_ci */ 2808c2ecf20Sopenharmony_ci#if defined(CONFIG_BIG_LITTLE) && defined(CONFIG_HARDEN_BRANCH_PREDICTOR) 2818c2ecf20Sopenharmony_ci .section ".rodata" 2828c2ecf20Sopenharmony_ci#endif 2838c2ecf20Sopenharmony_ci .type \name\()_processor_functions, #object 2848c2ecf20Sopenharmony_ci .align 2 2858c2ecf20Sopenharmony_ciENTRY(\name\()_processor_functions) 2868c2ecf20Sopenharmony_ci .word \dabort 2878c2ecf20Sopenharmony_ci .word \pabort 2888c2ecf20Sopenharmony_ci .word cpu_\name\()_proc_init 2898c2ecf20Sopenharmony_ci .word \bugs 2908c2ecf20Sopenharmony_ci .word cpu_\name\()_proc_fin 2918c2ecf20Sopenharmony_ci .word cpu_\name\()_reset 2928c2ecf20Sopenharmony_ci .word cpu_\name\()_do_idle 2938c2ecf20Sopenharmony_ci .word cpu_\name\()_dcache_clean_area 2948c2ecf20Sopenharmony_ci .word cpu_\name\()_switch_mm 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci .if \nommu 2978c2ecf20Sopenharmony_ci .word 0 2988c2ecf20Sopenharmony_ci .else 2998c2ecf20Sopenharmony_ci .word cpu_\name\()_set_pte_ext 3008c2ecf20Sopenharmony_ci .endif 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_ci .if \suspend 3038c2ecf20Sopenharmony_ci .word cpu_\name\()_suspend_size 3048c2ecf20Sopenharmony_ci#ifdef CONFIG_ARM_CPU_SUSPEND 3058c2ecf20Sopenharmony_ci .word cpu_\name\()_do_suspend 3068c2ecf20Sopenharmony_ci .word cpu_\name\()_do_resume 3078c2ecf20Sopenharmony_ci#else 3088c2ecf20Sopenharmony_ci .word 0 3098c2ecf20Sopenharmony_ci .word 0 3108c2ecf20Sopenharmony_ci#endif 3118c2ecf20Sopenharmony_ci .else 3128c2ecf20Sopenharmony_ci .word 0 3138c2ecf20Sopenharmony_ci .word 0 3148c2ecf20Sopenharmony_ci .word 0 3158c2ecf20Sopenharmony_ci .endif 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_ci .size \name\()_processor_functions, . - \name\()_processor_functions 3188c2ecf20Sopenharmony_ci#if defined(CONFIG_BIG_LITTLE) && defined(CONFIG_HARDEN_BRANCH_PREDICTOR) 3198c2ecf20Sopenharmony_ci .previous 3208c2ecf20Sopenharmony_ci#endif 3218c2ecf20Sopenharmony_ci.endm 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_ci.macro define_cache_functions name:req 3248c2ecf20Sopenharmony_ci .align 2 3258c2ecf20Sopenharmony_ci .type \name\()_cache_fns, #object 3268c2ecf20Sopenharmony_ciENTRY(\name\()_cache_fns) 3278c2ecf20Sopenharmony_ci .long \name\()_flush_icache_all 3288c2ecf20Sopenharmony_ci .long \name\()_flush_kern_cache_all 3298c2ecf20Sopenharmony_ci .long \name\()_flush_kern_cache_louis 3308c2ecf20Sopenharmony_ci .long \name\()_flush_user_cache_all 3318c2ecf20Sopenharmony_ci .long \name\()_flush_user_cache_range 3328c2ecf20Sopenharmony_ci .long \name\()_coherent_kern_range 3338c2ecf20Sopenharmony_ci .long \name\()_coherent_user_range 3348c2ecf20Sopenharmony_ci .long \name\()_flush_kern_dcache_area 3358c2ecf20Sopenharmony_ci .long \name\()_dma_map_area 3368c2ecf20Sopenharmony_ci .long \name\()_dma_unmap_area 3378c2ecf20Sopenharmony_ci .long \name\()_dma_flush_range 3388c2ecf20Sopenharmony_ci .size \name\()_cache_fns, . - \name\()_cache_fns 3398c2ecf20Sopenharmony_ci.endm 3408c2ecf20Sopenharmony_ci 3418c2ecf20Sopenharmony_ci.macro define_tlb_functions name:req, flags_up:req, flags_smp 3428c2ecf20Sopenharmony_ci .type \name\()_tlb_fns, #object 3438c2ecf20Sopenharmony_ci .align 2 3448c2ecf20Sopenharmony_ciENTRY(\name\()_tlb_fns) 3458c2ecf20Sopenharmony_ci .long \name\()_flush_user_tlb_range 3468c2ecf20Sopenharmony_ci .long \name\()_flush_kern_tlb_range 3478c2ecf20Sopenharmony_ci .ifnb \flags_smp 3488c2ecf20Sopenharmony_ci ALT_SMP(.long \flags_smp ) 3498c2ecf20Sopenharmony_ci ALT_UP(.long \flags_up ) 3508c2ecf20Sopenharmony_ci .else 3518c2ecf20Sopenharmony_ci .long \flags_up 3528c2ecf20Sopenharmony_ci .endif 3538c2ecf20Sopenharmony_ci .size \name\()_tlb_fns, . - \name\()_tlb_fns 3548c2ecf20Sopenharmony_ci.endm 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci.macro globl_equ x, y 3578c2ecf20Sopenharmony_ci .globl \x 3588c2ecf20Sopenharmony_ci .equ \x, \y 3598c2ecf20Sopenharmony_ci.endm 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci.macro initfn, func, base 3628c2ecf20Sopenharmony_ci .long \func - \base 3638c2ecf20Sopenharmony_ci.endm 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_ci /* 3668c2ecf20Sopenharmony_ci * Macro to calculate the log2 size for the protection region 3678c2ecf20Sopenharmony_ci * registers. This calculates rd = log2(size) - 1. tmp must 3688c2ecf20Sopenharmony_ci * not be the same register as rd. 3698c2ecf20Sopenharmony_ci */ 3708c2ecf20Sopenharmony_ci.macro pr_sz, rd, size, tmp 3718c2ecf20Sopenharmony_ci mov \tmp, \size, lsr #12 3728c2ecf20Sopenharmony_ci mov \rd, #11 3738c2ecf20Sopenharmony_ci1: movs \tmp, \tmp, lsr #1 3748c2ecf20Sopenharmony_ci addne \rd, \rd, #1 3758c2ecf20Sopenharmony_ci bne 1b 3768c2ecf20Sopenharmony_ci.endm 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci /* 3798c2ecf20Sopenharmony_ci * Macro to generate a protection region register value 3808c2ecf20Sopenharmony_ci * given a pre-masked address, size, and enable bit. 3818c2ecf20Sopenharmony_ci * Corrupts size. 3828c2ecf20Sopenharmony_ci */ 3838c2ecf20Sopenharmony_ci.macro pr_val, dest, addr, size, enable 3848c2ecf20Sopenharmony_ci pr_sz \dest, \size, \size @ calculate log2(size) - 1 3858c2ecf20Sopenharmony_ci orr \dest, \addr, \dest, lsl #1 @ mask in the region size 3868c2ecf20Sopenharmony_ci orr \dest, \dest, \enable 3878c2ecf20Sopenharmony_ci.endm 388