#include <machine/asm.h>
#include <machine/param.h>
.text
.align 2
.macro cache_handle_range dcop = 0, ic = 0, icop = 0
.if \ic == 0
ldr x3, =dcache_line_size
.else
ldr x3, =idcache_line_size
.endif
ldr x3, [x3]
sub x4, x3, #1
and x2, x0, x4
add x1, x1, x2
bic x0, x0, x4
.if \ic != 0
mov x2, x0
mov x4, x1
.endif
1:
dc \dcop, x0
add x0, x0, x3
subs x1, x1, x3
b.hi 1b
dsb ish
.if \ic != 0
2:
ic \icop, x2
add x2, x2, x3
subs x4, x4, x3
b.hi 2b
dsb ish
isb
.endif
.endm
ENTRY(cpu_setttb)
RETGUARD_SETUP(cpu_setttb, x15)
mrs x2, ttbr1_el1
bfi x2, x0, #48, #16
msr ttbr1_el1, x2
isb
msr ttbr0_el1, x1
isb
RETGUARD_CHECK(cpu_setttb, x15)
ret
END(cpu_setttb)
ENTRY(cpu_tlb_flush)
RETGUARD_SETUP(cpu_tlb_flush, x15)
dsb ishst
tlbi vmalle1is
dsb ish
isb
RETGUARD_CHECK(cpu_tlb_flush, x15)
ret
END(cpu_tlb_flush)
ENTRY(cpu_tlb_flush_asid)
RETGUARD_SETUP(cpu_tlb_flush_asid, x15)
dsb ishst
tlbi vae1is, x0
dsb ish
isb
RETGUARD_CHECK(cpu_tlb_flush_asid, x15)
ret
END(cpu_tlb_flush_asid)
ENTRY(cpu_tlb_flush_all_asid)
RETGUARD_SETUP(cpu_tlb_flush_all_asid, x15)
dsb ishst
tlbi vaale1is, x0
dsb ish
isb
RETGUARD_CHECK(cpu_tlb_flush_all_asid, x15)
ret
END(cpu_tlb_flush_all_asid)
ENTRY(cpu_tlb_flush_asid_all)
RETGUARD_SETUP(cpu_tlb_flush_asid_all, x15)
dsb ishst
tlbi aside1is, x0
dsb ish
isb
RETGUARD_CHECK(cpu_tlb_flush_asid_all, x15)
ret
END(cpu_tlb_flush_asid_all)
ENTRY(cpu_dcache_wb_range)
RETGUARD_SETUP(cpu_dcache_wb_range, x15)
cache_handle_range dcop = cvac
RETGUARD_CHECK(cpu_dcache_wb_range, x15)
ret
END(cpu_dcache_wb_range)
ENTRY(cpu_dcache_wbinv_range)
RETGUARD_SETUP(cpu_dcache_wbinv_range, x15)
cache_handle_range dcop = civac
RETGUARD_CHECK(cpu_dcache_wbinv_range, x15)
ret
END(cpu_dcache_wbinv_range)
ENTRY(cpu_dcache_inv_range)
RETGUARD_SETUP(cpu_dcache_inv_range, x15)
cache_handle_range dcop = ivac
RETGUARD_CHECK(cpu_dcache_inv_range, x15)
ret
END(cpu_dcache_inv_range)
ENTRY(cpu_idcache_wbinv_range)
RETGUARD_SETUP(cpu_idcache_wbinv_range, x15)
cache_handle_range dcop = civac, ic = 1, icop = ivau
RETGUARD_CHECK(cpu_idcache_wbinv_range, x15)
ret
END(cpu_idcache_wbinv_range)
ENTRY(cpu_icache_sync_range)
RETGUARD_SETUP(cpu_icache_sync_range, x15)
cache_handle_range dcop = cvau, ic = 1, icop = ivau
RETGUARD_CHECK(cpu_icache_sync_range, x15)
ret
END(cpu_icache_sync_range)
ENTRY(cpu_wfi)
RETGUARD_SETUP(cpu_wfi, x15)
dsb sy
wfi
RETGUARD_CHECK(cpu_wfi, x15)
ret
END(cpu_wfi)
ENTRY(aplcpu_deep_wfi)
RETGUARD_SETUP(aplcpu_deep_wfi, x15)
stp x30, x15, [sp, #-16]!
stp x28, x29, [sp, #-16]!
stp x26, x27, [sp, #-16]!
stp x24, x25, [sp, #-16]!
stp x22, x23, [sp, #-16]!
stp x20, x21, [sp, #-16]!
stp x18, x19, [sp, #-16]!
mrs x0, daif
str x0, [sp, #-16]!
msr daifset, #3
mrs x0, s3_5_c15_c5_0
orr x0, x0, #(3 << 24)
msr s3_5_c15_c5_0, x0
dsb sy
wfi
mrs x0, s3_5_c15_c5_0
bic x0, x0, #(1 << 24)
msr s3_5_c15_c5_0, x0
ldr x0, [sp], #16
msr daif, x0
ldp x18, x19, [sp], #16
ldp x20, x21, [sp], #16
ldp x22, x23, [sp], #16
ldp x24, x25, [sp], #16
ldp x26, x27, [sp], #16
ldp x28, x29, [sp], #16
ldp x30, x15, [sp], #16
RETGUARD_CHECK(aplcpu_deep_wfi, x15)
ret
END(aplcpu_deep_wfi)