diff options
Diffstat (limited to 'src/common/cache_management.cpp')
| -rw-r--r-- | src/common/cache_management.cpp | 59 |
1 files changed, 0 insertions, 59 deletions
diff --git a/src/common/cache_management.cpp b/src/common/cache_management.cpp deleted file mode 100644 index ed353828a..000000000 --- a/src/common/cache_management.cpp +++ /dev/null | |||
| @@ -1,59 +0,0 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include <cstdint> | ||
| 5 | #include <cstring> | ||
| 6 | |||
| 7 | #include "common/cache_management.h" | ||
| 8 | |||
| 9 | namespace Common { | ||
| 10 | |||
| 11 | #if defined(ARCHITECTURE_x86_64) | ||
| 12 | |||
| 13 | // Most cache operations are no-ops on x86 | ||
| 14 | |||
| 15 | void DataCacheLineCleanByVAToPoU(void* start, size_t size) {} | ||
| 16 | void DataCacheLineCleanAndInvalidateByVAToPoC(void* start, size_t size) {} | ||
| 17 | void DataCacheLineCleanByVAToPoC(void* start, size_t size) {} | ||
| 18 | void DataCacheZeroByVA(void* start, size_t size) { | ||
| 19 | std::memset(start, 0, size); | ||
| 20 | } | ||
| 21 | |||
| 22 | #elif defined(ARCHITECTURE_arm64) | ||
| 23 | |||
| 24 | // BS/DminLine is log2(cache size in words), we want size in bytes | ||
| 25 | #define EXTRACT_DMINLINE(ctr_el0) (1 << ((((ctr_el0) >> 16) & 0xf) + 2)) | ||
| 26 | #define EXTRACT_BS(dczid_el0) (1 << (((dczid_el0)&0xf) + 2)) | ||
| 27 | |||
| 28 | #define DEFINE_DC_OP(op_name, function_name) \ | ||
| 29 | void function_name(void* start, size_t size) { \ | ||
| 30 | size_t ctr_el0; \ | ||
| 31 | asm volatile("mrs %[ctr_el0], ctr_el0\n\t" : [ctr_el0] "=r"(ctr_el0)); \ | ||
| 32 | size_t cacheline_size = EXTRACT_DMINLINE(ctr_el0); \ | ||
| 33 | uintptr_t va_start = reinterpret_cast<uintptr_t>(start); \ | ||
| 34 | uintptr_t va_end = va_start + size; \ | ||
| 35 | for (uintptr_t va = va_start; va < va_end; va += cacheline_size) { \ | ||
| 36 | asm volatile("dc " #op_name ", %[va]\n\t" : : [va] "r"(va) : "memory"); \ | ||
| 37 | } \ | ||
| 38 | } | ||
| 39 | |||
| 40 | #define DEFINE_DC_OP_DCZID(op_name, function_name) \ | ||
| 41 | void function_name(void* start, size_t size) { \ | ||
| 42 | size_t dczid_el0; \ | ||
| 43 | asm volatile("mrs %[dczid_el0], dczid_el0\n\t" : [dczid_el0] "=r"(dczid_el0)); \ | ||
| 44 | size_t cacheline_size = EXTRACT_BS(dczid_el0); \ | ||
| 45 | uintptr_t va_start = reinterpret_cast<uintptr_t>(start); \ | ||
| 46 | uintptr_t va_end = va_start + size; \ | ||
| 47 | for (uintptr_t va = va_start; va < va_end; va += cacheline_size) { \ | ||
| 48 | asm volatile("dc " #op_name ", %[va]\n\t" : : [va] "r"(va) : "memory"); \ | ||
| 49 | } \ | ||
| 50 | } | ||
| 51 | |||
| 52 | DEFINE_DC_OP(cvau, DataCacheLineCleanByVAToPoU); | ||
| 53 | DEFINE_DC_OP(civac, DataCacheLineCleanAndInvalidateByVAToPoC); | ||
| 54 | DEFINE_DC_OP(cvac, DataCacheLineCleanByVAToPoC); | ||
| 55 | DEFINE_DC_OP_DCZID(zva, DataCacheZeroByVA); | ||
| 56 | |||
| 57 | #endif | ||
| 58 | |||
| 59 | } // namespace Common | ||