rendered paste body#define icache_clear_256b() ;\
nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop ;\
nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop ;\
nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop ;\
nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop; nop ;\
nop; nop; nop; nop; ;\
#define icache_clear_1kb() ;\
icache_clear_256b() ;\
icache_clear_256b() ;\
icache_clear_256b() ;\
icache_clear_256b() ;\
#define icache_clear_4kb() ;\
icache_clear_1kb() ;\
icache_clear_1kb() ;\
icache_clear_1kb() ;\
icache_clear_1kb() ;\
subs r3, r3, #1 ;\
bxeq lr ;\
#define icache_clear_16kb() ;\
icache_clear_4kb() ;\
icache_clear_4kb() ;\
icache_clear_4kb() ;\
icache_clear_4kb() ;\
@ This will clear n blocks of 4kb of icache, up to 64kb
@ Pass n in r3.
invalidate_icache_region_software:
cmp r2, #0 @ if the size is zero, exit early
bxeq lr
icache_clear_16kb()
icache_clear_16kb()
icache_clear_16kb()
icache_clear_16kb()
bx lr
@ This will clear however much dcache you want, up to 512kb or so
@ Pass the amount to clear in r3.
1:
.word ewram @ a nice random big array
invalidate_dcache_region_software:
cmp r2, #0
bxeq lr
ldr r0, 1b @ r0 is a pointer to the array
2:
ldr r1, [r0], #4 @ load word
subs r3, r3, #1
bne 2b
bx lr
.align 5
.comm memory_map 0x100000