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