py/asmarm: Use builtin func to flush I- and D-cache on ARM 7 archs.
The inline assembler code does not work for __ARM_ARCH == 7. Signed-off-by: Damien George <damien@micropython.org>
This commit is contained in:
parent
c732b80f05
commit
4ee8ec6931
py
|
@ -40,7 +40,7 @@
|
||||||
|
|
||||||
void asm_arm_end_pass(asm_arm_t *as) {
|
void asm_arm_end_pass(asm_arm_t *as) {
|
||||||
if (as->base.pass == MP_ASM_PASS_EMIT) {
|
if (as->base.pass == MP_ASM_PASS_EMIT) {
|
||||||
#if defined(__linux__) && defined(__GNUC__)
|
#if (defined(__linux__) && defined(__GNUC__)) || __ARM_ARCH == 7
|
||||||
char *start = mp_asm_base_get_code(&as->base);
|
char *start = mp_asm_base_get_code(&as->base);
|
||||||
char *end = start + mp_asm_base_get_code_size(&as->base);
|
char *end = start + mp_asm_base_get_code_size(&as->base);
|
||||||
__builtin___clear_cache(start, end);
|
__builtin___clear_cache(start, end);
|
||||||
|
@ -48,10 +48,10 @@ void asm_arm_end_pass(asm_arm_t *as) {
|
||||||
// flush I- and D-cache
|
// flush I- and D-cache
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"0:"
|
"0:"
|
||||||
"mrc p15, 0, r15, c7, c10, 3\n"
|
"mrc p15, 0, r15, c7, c10, 3\n" // test and clean D-cache
|
||||||
"bne 0b\n"
|
"bne 0b\n"
|
||||||
"mov r0, #0\n"
|
"mov r0, #0\n"
|
||||||
"mcr p15, 0, r0, c7, c7, 0\n"
|
"mcr p15, 0, r0, c7, c7, 0\n" // invalidate I-cache and D-cache
|
||||||
: : : "r0", "cc");
|
: : : "r0", "cc");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue