mirror of
https://github.com/tobast/libunwind-eh_elf.git
synced 2024-12-23 12:03:41 +01:00
Flush icache with __builtin___clear_cache() in tests when compiling with GCC
When compiling with GCC, use the builtin instruction cache flushing mechanism in all tests where it is needed. Quoting GCC docs: ''If the target does not require instruction cache flushes, __builtin___clear_cache has no effect. Otherwise either instructions are emitted in-line to clear the instruction cache or a call to the __clear_cache function in libgcc is made.''.
This commit is contained in:
parent
5fedf3407c
commit
39b8398159
3 changed files with 13 additions and 1 deletions
|
@ -86,7 +86,9 @@ struct fdesc
|
||||||
# define get_gp(fdesc) (0)
|
# define get_gp(fdesc) (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
extern void flush_cache (void *addr, size_t len);
|
extern void flush_cache (void *addr, size_t len);
|
||||||
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
template (int i, template_t self,
|
template (int i, template_t self,
|
||||||
|
@ -186,7 +188,7 @@ main (int argc, char *argv[] __attribute__((unused)))
|
||||||
2*getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC);
|
2*getpagesize(), PROT_READ | PROT_WRITE | PROT_EXEC);
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
__clear_cache(mem, mem + MAX_FUNC_SIZE);
|
__builtin___clear_cache(mem, mem + MAX_FUNC_SIZE);
|
||||||
#else
|
#else
|
||||||
flush_cache (mem, MAX_FUNC_SIZE);
|
flush_cache (mem, MAX_FUNC_SIZE);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#ifndef __GNUC__
|
||||||
|
|
||||||
#if defined(__ia64__)
|
#if defined(__ia64__)
|
||||||
|
|
||||||
.global flush_cache
|
.global flush_cache
|
||||||
|
@ -80,3 +82,5 @@ flush_cache:
|
||||||
/* We do not need executable stack. */
|
/* We do not need executable stack. */
|
||||||
.section .note.GNU-stack,"",@progbits
|
.section .note.GNU-stack,"",@progbits
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -20,7 +20,9 @@ int verbose;
|
||||||
# define EXTRA 0
|
# define EXTRA 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef __GNUC__
|
||||||
extern void flush_cache (void *addr, size_t len);
|
extern void flush_cache (void *addr, size_t len);
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
make_executable (void *addr, size_t len)
|
make_executable (void *addr, size_t len)
|
||||||
|
@ -31,7 +33,11 @@ make_executable (void *addr, size_t len)
|
||||||
perror ("mprotect");
|
perror ("mprotect");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#ifdef __GNUC__
|
||||||
|
__builtin___clear_cache(addr, addr + len);
|
||||||
|
#else
|
||||||
flush_cache (addr, len);
|
flush_cache (addr, len);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue