| /* SPDX-License-Identifier: GPL-2.0-only */ |
| /* |
| * Based on the file arch/arm64/include/asm/assembled.h from Linux v5.10, which |
| * in turn is based on arch/arm/include/asm/assembler.h and |
| * arch/arm/mm/proc-macros.S |
| * |
| * Copyright (C) 1996-2000 Russell King |
| * Copyright (C) 2012 ARM Ltd. |
| */ |
| |
| #ifndef __ASSEMBLY__ |
| #error "Only include this from assembly code" |
| #endif |
| |
| #ifndef _ASMARM64_ASSEMBLER_H_ |
| #define _ASMARM64_ASSEMBLER_H_ |
| |
| /* |
| * raw_dcache_line_size - get the minimum D-cache line size on this CPU |
| * from the CTR register. |
| */ |
| .macro raw_dcache_line_size, reg, tmp |
| mrs \tmp, ctr_el0 // read CTR |
| ubfx \tmp, \tmp, #16, #4 // cache line size encoding |
| mov \reg, #4 // bytes per word |
| lsl \reg, \reg, \tmp // actual cache line size |
| .endm |
| |
| /* |
| * Macro to perform a data cache maintenance for the interval |
| * [addr, addr + size). Use the raw value for the dcache line size because |
| * kvm-unit-tests has no concept of scheduling. |
| * |
| * op: operation passed to dc instruction |
| * domain: domain used in dsb instruction |
| * addr: starting virtual address of the region |
| * size: size of the region |
| * Corrupts: addr, size, tmp1, tmp2 |
| */ |
| |
| .macro dcache_by_line_op op, domain, addr, size, tmp1, tmp2 |
| raw_dcache_line_size \tmp1, \tmp2 |
| add \size, \addr, \size |
| sub \tmp2, \tmp1, #1 |
| bic \addr, \addr, \tmp2 |
| 9998: |
| dc \op, \addr |
| add \addr, \addr, \tmp1 |
| cmp \addr, \size |
| b.lo 9998b |
| dsb \domain |
| .endm |
| |
| #endif /* _ASMARM64_ASSEMBLER_H_ */ |