Add clear_cache implementation for ppc64. Fix buffer to meet ppc64 alignment.

llvm-svn: 309423
This commit is contained in:
Sterling Augustine
2017-07-28 19:49:22 +00:00
parent 9be82c3169
commit dd9173420f
2 changed files with 16 additions and 2 deletions

View File

@@ -165,6 +165,21 @@ void __clear_cache(void *start, void *end) {
for (addr = xstart; addr < xend; addr += icache_line_size) for (addr = xstart; addr < xend; addr += icache_line_size)
__asm __volatile("ic ivau, %0" :: "r"(addr)); __asm __volatile("ic ivau, %0" :: "r"(addr));
__asm __volatile("isb sy"); __asm __volatile("isb sy");
#elif defined (__powerpc64__) && defined(__LITTLE_ENDIAN__)
const size_t line_size = 32;
const size_t len = (uintptr_t)end - (uintptr_t)start;
const uintptr_t mask = ~(line_size - 1);
const uintptr_t start_line = ((uintptr_t)start) & mask;
const uintptr_t end_line = ((uintptr_t)start + len + line_size - 1) & mask;
for (uintptr_t line = start_line; line < end_line; line += line_size)
__asm__ volatile("dcbf 0, %0" : : "r"(line));
__asm__ volatile("sync");
for (uintptr_t line = start_line; line < end_line; line += line_size)
__asm__ volatile("icbi 0, %0" : : "r"(line));
__asm__ volatile("isync");
#else #else
#if __APPLE__ #if __APPLE__
/* On Darwin, sys_icache_invalidate() provides this functionality */ /* On Darwin, sys_icache_invalidate() provides this functionality */
@@ -174,4 +189,3 @@ void __clear_cache(void *start, void *end) {
#endif #endif
#endif #endif
} }

View File

@@ -52,7 +52,7 @@ memcpy_f(void *dst, const void *src, size_t n) {
#endif #endif
} }
unsigned char execution_buffer[128]; unsigned char execution_buffer[128] __attribute__((aligned(8)));
int main() int main()
{ {