1
0
Fork 0
forked from len0rd/rockbox

Make basic cache functions into calls, and get rid of CACHE_FUNCTION_WRAPPERS and CACHE_FUNCTIONS_AS_CALL macros. Rename flush/invalidate_icache to cpucache_flush/invalidate. They're inlined only if an implementation isn't provided by defining HAVE_CPUCACHE_FLUSH/INVALIDATE.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19971 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Michael Sevakis 2009-02-11 12:55:51 +00:00
parent 4cd7597172
commit 21f0c9a282
28 changed files with 136 additions and 173 deletions

View file

@ -113,9 +113,9 @@ struct codec_api ci = {
semaphore_release, semaphore_release,
#endif #endif
#ifdef CACHE_FUNCTIONS_AS_CALL #if NUM_CORES > 1
flush_icache, cpucache_flush,
invalidate_icache, cpucache_invalidate,
#endif #endif
/* strings and memory */ /* strings and memory */
@ -232,7 +232,7 @@ static int codec_load_ram(int size, struct codec_api *api)
} }
*(hdr->api) = api; *(hdr->api) = api;
invalidate_icache(); cpucache_invalidate();
status = hdr->entry_point(); status = hdr->entry_point();
sim_codec_close(pd); sim_codec_close(pd);

View file

@ -170,9 +170,9 @@ struct codec_api {
void (*semaphore_release)(struct semaphore *s); void (*semaphore_release)(struct semaphore *s);
#endif /* NUM_CORES */ #endif /* NUM_CORES */
#ifdef CACHE_FUNCTIONS_AS_CALL #if NUM_CORES > 1
void (*flush_icache)(void); void (*cpucache_flush)(void);
void (*invalidate_icache)(void); void (*cpucache_invalidate)(void);
#endif #endif
/* strings and memory */ /* strings and memory */
@ -297,22 +297,4 @@ int codec_load_file(const char* codec, struct codec_api *api);
enum codec_status codec_start(void); enum codec_status codec_start(void);
enum codec_status codec_main(void); enum codec_status codec_main(void);
#ifndef CACHE_FUNCTION_WRAPPERS
#ifdef CACHE_FUNCTIONS_AS_CALL
#define CACHE_FUNCTION_WRAPPERS(api) \
void flush_icache(void) \
{ \
(api)->flush_icache(); \
} \
void invalidate_icache(void) \
{ \
(api)->invalidate_icache(); \
}
#else
#define CACHE_FUNCTION_WRAPPERS(api)
#endif /* CACHE_FUNCTIONS_AS_CALL */
#endif /* CACHE_FUNCTION_WRAPPERS */
#endif #endif

View file

@ -34,8 +34,6 @@ extern unsigned char plugin_end_addr[];
extern enum codec_status codec_main(void); extern enum codec_status codec_main(void);
CACHE_FUNCTION_WRAPPERS(ci);
enum codec_status codec_start(void) enum codec_status codec_start(void)
{ {
#ifndef SIMULATOR #ifndef SIMULATOR
@ -47,7 +45,7 @@ enum codec_status codec_start(void)
#endif #endif
#if NUM_CORES > 1 #if NUM_CORES > 1
/* writeback cleared iedata and bss areas */ /* writeback cleared iedata and bss areas */
flush_icache(); ci->cpucache_flush();
#endif #endif
return codec_main(); return codec_main();
} }

View file

@ -268,7 +268,7 @@ static void mad_synth_thread_quit(void)
die=1; die=1;
ci->semaphore_release(&synth_pending_sem); ci->semaphore_release(&synth_pending_sem);
ci->thread_wait(mad_synth_thread_id); ci->thread_wait(mad_synth_thread_id);
invalidate_icache(); ci->cpucache_invalidate();
} }
#else #else
static inline void mad_synth_thread_ready(void) static inline void mad_synth_thread_ready(void)

View file

@ -302,7 +302,7 @@ static bool emu_thread_process_msg(struct sample_queue_chunk *chunk)
if (id == SPC_EMU_LOAD) if (id == SPC_EMU_LOAD)
{ {
struct spc_load *ld = (struct spc_load *)chunk->data; struct spc_load *ld = (struct spc_load *)chunk->data;
invalidate_icache(); ci->cpucache_invalidate();
SPC_Init(&spc_emu); SPC_Init(&spc_emu);
sample_queue.retval = SPC_load_spc(&spc_emu, ld->buf, ld->size); sample_queue.retval = SPC_load_spc(&spc_emu, ld->buf, ld->size);
@ -376,7 +376,7 @@ static bool spc_emu_start(void)
static inline int load_spc_buffer(uint8_t *buf, size_t size) static inline int load_spc_buffer(uint8_t *buf, size_t size)
{ {
struct spc_load ld = { buf, size }; struct spc_load ld = { buf, size };
flush_icache(); ci->cpucache_flush();
return emu_thread_send_msg(SPC_EMU_LOAD, (intptr_t)&ld); return emu_thread_send_msg(SPC_EMU_LOAD, (intptr_t)&ld);
} }
@ -386,7 +386,7 @@ static inline void spc_emu_quit(void)
emu_thread_send_msg(SPC_EMU_QUIT, 0); emu_thread_send_msg(SPC_EMU_QUIT, 0);
/* Wait for emu thread to be killed */ /* Wait for emu thread to be killed */
ci->thread_wait(emu_thread_id); ci->thread_wait(emu_thread_id);
invalidate_icache(); ci->cpucache_invalidate();
} }
} }

View file

@ -1317,9 +1317,9 @@ static void codec_thread(void)
queue_reply(&codec_queue, 1); queue_reply(&codec_queue, 1);
if ((void*)ev.data != NULL) if ((void*)ev.data != NULL)
{ {
invalidate_icache(); cpucache_invalidate();
((void (*)(void))ev.data)(); ((void (*)(void))ev.data)();
flush_icache(); cpucache_flush();
} }
break; break;

View file

@ -327,9 +327,9 @@ static const struct plugin_api rockbox_api = {
trigger_cpu_boost, trigger_cpu_boost,
cancel_cpu_boost, cancel_cpu_boost,
#endif #endif
#ifdef CACHE_FUNCTIONS_AS_CALL #if NUM_CORES > 1
flush_icache, cpucache_flush,
invalidate_icache, cpucache_invalidate,
#endif #endif
timer_register, timer_register,
timer_unregister, timer_unregister,
@ -694,7 +694,7 @@ int plugin_load(const char* plugin, const void* parameter)
#if NUM_CORES > 1 #if NUM_CORES > 1
/* Make sure COP cache is flushed and invalidated before loading */ /* Make sure COP cache is flushed and invalidated before loading */
my_core = switch_core(CURRENT_CORE ^ 1); my_core = switch_core(CURRENT_CORE ^ 1);
invalidate_icache(); cpucache_invalidate();
switch_core(my_core); switch_core(my_core);
#endif #endif
@ -742,7 +742,7 @@ int plugin_load(const char* plugin, const void* parameter)
lcd_remote_update(); lcd_remote_update();
#endif #endif
invalidate_icache(); cpucache_invalidate();
oldbars = viewportmanager_set_statusbar(VP_SB_HIDE_ALL); oldbars = viewportmanager_set_statusbar(VP_SB_HIDE_ALL);
rc = hdr->entry_point(parameter); rc = hdr->entry_point(parameter);
@ -854,7 +854,7 @@ void plugin_iram_init(char *iramstart, char *iramcopy, size_t iram_size,
memset(iramcopy, 0, iram_size); memset(iramcopy, 0, iram_size);
#if NUM_CORES > 1 #if NUM_CORES > 1
/* writeback cleared iedata and iramcopy areas */ /* writeback cleared iedata and iramcopy areas */
flush_icache(); cpucache_flush();
#endif #endif
} }
#endif /* PLUGIN_USE_IRAM */ #endif /* PLUGIN_USE_IRAM */

View file

@ -438,9 +438,9 @@ struct plugin_api {
void (*trigger_cpu_boost)(void); void (*trigger_cpu_boost)(void);
void (*cancel_cpu_boost)(void); void (*cancel_cpu_boost)(void);
#endif #endif
#ifdef CACHE_FUNCTIONS_AS_CALL #if NUM_CORES > 1
void (*flush_icache)(void); void (*cpucache_flush)(void);
void (*invalidate_icache)(void); void (*cpucache_invalidate)(void);
#endif #endif
bool (*timer_register)(int reg_prio, void (*unregister_callback)(void), bool (*timer_register)(int reg_prio, void (*unregister_callback)(void),
long cycles, int int_prio, long cycles, int int_prio,
@ -854,20 +854,5 @@ extern const struct plugin_api *rb;
enum plugin_status plugin_start(const void* parameter) enum plugin_status plugin_start(const void* parameter)
NO_PROF_ATTR; NO_PROF_ATTR;
#undef CACHE_FUNCTION_WRAPPERS
#ifdef CACHE_FUNCTIONS_AS_CALL
#define CACHE_FUNCTION_WRAPPERS \
void flush_icache(void) \
{ \
rb->flush_icache(); \
} \
void invalidate_icache(void) \
{ \
rb->invalidate_icache(); \
}
#else
#define CACHE_FUNCTION_WRAPPERS
#endif /* CACHE_FUNCTIONS_AS_CALL */
#endif /* __PCTOOL__ */ #endif /* __PCTOOL__ */
#endif #endif

View file

@ -149,7 +149,7 @@ bool mpeg_alloc_init(unsigned char *buf, size_t mallocsize)
return false; return false;
} }
IF_COP(invalidate_icache()); IF_COP(rb->cpucache_invalidate());
return true; return true;
} }

View file

@ -296,8 +296,6 @@ CONFIG_KEYPAD == SANSA_M200_PAD
#endif #endif
#endif #endif
CACHE_FUNCTION_WRAPPERS;
/* One thing we can do here for targets with remotes is having a display /* One thing we can do here for targets with remotes is having a display
* always on the remote instead of always forcing a popup on the main display */ * always on the remote instead of always forcing a popup on the main display */

View file

@ -524,7 +524,7 @@ static void video_thread_msg(struct video_thread_data *td)
} }
else else
{ {
IF_COP(invalidate_icache()); IF_COP(rb->cpucache_invalidate());
vo_lock(); vo_lock();
rb->lcd_update(); rb->lcd_update();
vo_unlock(); vo_unlock();
@ -996,7 +996,7 @@ bool video_thread_init(void)
{ {
intptr_t rep; intptr_t rep;
IF_COP(flush_icache()); IF_COP(rb->cpucache_flush());
video_str.hdr.q = &video_str_queue; video_str.hdr.q = &video_str_queue;
rb->queue_init(video_str.hdr.q, false); rb->queue_init(video_str.hdr.q, false);
@ -1014,7 +1014,7 @@ bool video_thread_init(void)
/* Wait for thread to initialize */ /* Wait for thread to initialize */
rep = str_send_msg(&video_str, STREAM_NULL, 0); rep = str_send_msg(&video_str, STREAM_NULL, 0);
IF_COP(invalidate_icache()); IF_COP(rb->cpucache_invalidate());
return rep == 0; /* Normally STREAM_NULL should be ignored */ return rep == 0; /* Normally STREAM_NULL should be ignored */
} }
@ -1026,7 +1026,7 @@ void video_thread_exit(void)
{ {
str_post_msg(&video_str, STREAM_QUIT, 0); str_post_msg(&video_str, STREAM_QUIT, 0);
rb->thread_wait(video_str.thread); rb->thread_wait(video_str.thread);
IF_COP(invalidate_icache()); IF_COP(rb->cpucache_invalidate());
video_str.thread = 0; video_str.thread = 0;
} }
} }

View file

@ -1905,7 +1905,7 @@ void dynamic_recompile (struct dynarec_block *newblock)
PC=oldpc; PC=oldpc;
setmallocpos(dynapointer); setmallocpos(dynapointer);
newblock->length=dynapointer-newblock->block; newblock->length=dynapointer-newblock->block;
invalidate_icache(); IF_COP(rb->cpucache_invalidate());
snprintf(meow,499,"/dyna_0x%x_code.rb",PC); snprintf(meow,499,"/dyna_0x%x_code.rb",PC);
fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC);
if(fd>=0) if(fd>=0)

View file

@ -480,9 +480,9 @@ static void init_ci(void)
ci.profile_func_exit = rb->profile_func_exit; ci.profile_func_exit = rb->profile_func_exit;
#endif #endif
#ifdef CACHE_FUNCTIONS_AS_CALL #if NUM_CORES > 1
ci.invalidate_icache = invalidate_icache; ci.cpucache_invalidate = rb->cpucache_invalidate;
ci.flush_icache = flush_icache; ci.cpucache_flush = rb->cpucache_flush;
#endif #endif
#if NUM_CORES > 1 #if NUM_CORES > 1

View file

@ -311,7 +311,7 @@ static void __attribute__((noreturn)) handle_firmware_load(void)
if (rc == EOK) if (rc == EOK)
{ {
invalidate_icache(); cpucache_invalidate();
asm volatile ("bx %0": : "r"(start_addr)); asm volatile ("bx %0": : "r"(start_addr));
} }
@ -332,7 +332,7 @@ void main(void)
int rc; int rc;
/* Flush and invalidate all caches (because vectors were written) */ /* Flush and invalidate all caches (because vectors were written) */
invalidate_icache(); cpucache_invalidate();
system_init(); system_init();
kernel_init(); kernel_init();

View file

@ -196,7 +196,7 @@ void main(void)
printf("Loading firmware"); printf("Loading firmware");
/* Flush out anything pending first */ /* Flush out anything pending first */
invalidate_icache(); cpucache_invalidate();
loadbuffer = (unsigned char*) 0x31000000; loadbuffer = (unsigned char*) 0x31000000;
buffer_size = (unsigned char*)0x31400000 - loadbuffer; buffer_size = (unsigned char*)0x31400000 - loadbuffer;
@ -210,7 +210,7 @@ void main(void)
if (rc == EOK) if (rc == EOK)
{ {
invalidate_icache(); cpucache_invalidate();
kernel_entry = (void*) loadbuffer; kernel_entry = (void*) loadbuffer;
rc = kernel_entry(); rc = kernel_entry();
} }

View file

@ -272,12 +272,20 @@ static inline uint32_t swap_odd_even32(uint32_t value)
#endif #endif
/* Just define these as empty if not declared */ /* Just define these as empty if not declared */
#ifndef HAVE_INVALIDATE_ICACHE #ifdef HAVE_CPUCACHE_INVALIDATE
#define invalidate_icache() void cpucache_invalidate(void);
#else
static inline void cpucache_invalidate(void)
{
}
#endif #endif
#ifndef HAVE_FLUSH_ICACHE #ifdef HAVE_CPUCACHE_FLUSH
#define flush_icache() void cpucache_flush(void);
#else
static inline void cpucache_flush(void)
{
}
#endif #endif
#ifdef PROC_NEEDS_CACHEALIGN #ifdef PROC_NEEDS_CACHEALIGN

View file

@ -75,7 +75,7 @@ void rolo_restart_cop(void)
COP_INT_DIS = -1; COP_INT_DIS = -1;
/* Invalidate cache */ /* Invalidate cache */
invalidate_icache(); cpucache_invalidate();
/* Disable cache */ /* Disable cache */
CACHE_CTL = CACHE_CTL_DISABLE; CACHE_CTL = CACHE_CTL_DISABLE;
@ -147,7 +147,7 @@ void rolo_restart(const unsigned char* source, unsigned char* dest,
CPU_INT_DIS = -1; CPU_INT_DIS = -1;
/* Flush cache */ /* Flush cache */
flush_icache(); cpucache_flush();
/* Disable cache */ /* Disable cache */
CACHE_CTL = CACHE_CTL_DISABLE; CACHE_CTL = CACHE_CTL_DISABLE;
@ -174,7 +174,7 @@ void rolo_restart(const unsigned char* source, unsigned char* dest,
#elif defined(CPU_TCC780X) || (CONFIG_CPU == S3C2440) #elif defined(CPU_TCC780X) || (CONFIG_CPU == S3C2440)
/* Flush and invalidate caches */ /* Flush and invalidate caches */
invalidate_icache(); cpucache_invalidate();
asm volatile( asm volatile(
"mov pc, %0 \n" "mov pc, %0 \n"

View file

@ -57,34 +57,12 @@ void imx31_regclr32(volatile uint32_t *reg_p, uint32_t mask);
#define KDEV_INIT #define KDEV_INIT
#define HAVE_INVALIDATE_ICACHE #define HAVE_CPUCACHE_INVALIDATE
static inline void invalidate_icache(void) #define HAVE_CPUCACHE_FLUSH
{
asm volatile(
/* Clean and invalidate entire data cache */
"mcr p15, 0, %0, c7, c14, 0 \n"
/* Invalidate entire instruction cache
* Also flushes the branch target cache */
"mcr p15, 0, %0, c7, c5, 0 \n"
/* Data synchronization barrier */
"mcr p15, 0, %0, c7, c10, 4 \n"
/* Flush prefetch buffer */
"mcr p15, 0, %0, c7, c5, 4 \n"
: : "r"(0)
);
}
#define HAVE_FLUSH_ICACHE /* Different internal names */
static inline void flush_icache(void) #define cpucache_flush clean_dcache
{ #define cpucache_invalidate invalidate_idcache
asm volatile (
/* Clean entire data cache */
"mcr p15, 0, %0, c7, c10, 0 \n"
/* Data synchronization barrier */
"mcr p15, 0, %0, c7, c10, 4 \n"
: : "r"(0)
);
}
struct ARM_REGS { struct ARM_REGS {
int r0; int r0;

View file

@ -265,6 +265,8 @@ void __attribute__((naked)) clean_dcache(void)
/* Clean entire data cache */ /* Clean entire data cache */
"mov r0, #0 \n" "mov r0, #0 \n"
"mcr p15, 0, r0, c7, c10, 0 \n" "mcr p15, 0, r0, c7, c10, 0 \n"
/* Data synchronization barrier */
"mcr p15, 0, r0, c7, c10, 4 \n"
"bx lr \n" "bx lr \n"
); );
} }
@ -290,3 +292,31 @@ void clean_dcache(void)
} }
#endif #endif
#if CONFIG_CPU == IMX31L
void invalidate_idcache(void)
{
asm volatile(
/* Clean and invalidate entire data cache */
"mcr p15, 0, %0, c7, c14, 0 \n"
/* Invalidate entire instruction cache
* Also flushes the branch target cache */
"mcr p15, 0, %0, c7, c5, 0 \n"
/* Data synchronization barrier */
"mcr p15, 0, %0, c7, c10, 4 \n"
/* Flush prefetch buffer */
"mcr p15, 0, %0, c7, c5, 4 \n"
: : "r"(0)
);
}
#else
void invalidate_idcache(void)
{
clean_dcache();
asm volatile(
"mov r0, #0 \n"
"mcr p15, 0, r0, c7, c5, 0 \n"
: : : "r0"
);
}
#endif

View file

@ -41,15 +41,9 @@ void s3c_regset32(volatile unsigned long *reg, unsigned long bits);
/* Clear register bits */ /* Clear register bits */
void s3c_regclr32(volatile unsigned long *reg, unsigned long bits); void s3c_regclr32(volatile unsigned long *reg, unsigned long bits);
#define HAVE_INVALIDATE_ICACHE #define HAVE_CPUCACHE_FLUSH
static inline void invalidate_icache(void) #define HAVE_CPUCACHE_INVALIDATE
{ #define cpucache_flush clean_dcache
clean_dcache(); #define cpucache_invalidate invalidate_idcache
asm volatile(
"mov r0, #0 \n"
"mcr p15, 0, r0, c7, c5, 0 \n"
: : : "r0"
);
}
#endif /* SYSTEM_TARGET_H */ #endif /* SYSTEM_TARGET_H */

View file

@ -62,8 +62,7 @@ void __attribute__((interrupt("IRQ"))) irq_handler(void)
some other CPU frequency scaling. */ some other CPU frequency scaling. */
#ifndef BOOTLOADER #ifndef BOOTLOADER
void flush_icache(void) ICODE_ATTR; void ICODE_ATTR cpucache_flush(void)
void flush_icache(void)
{ {
intptr_t b, e; intptr_t b, e;
@ -73,8 +72,7 @@ void flush_icache(void)
} }
} }
void invalidate_icache(void) ICODE_ATTR; void ICODE_ATTR cpucache_invalidate(void)
void invalidate_icache(void)
{ {
intptr_t b, e; intptr_t b, e;

View file

@ -163,8 +163,7 @@ void __attribute__((interrupt("IRQ"))) irq_handler(void)
to extend the funtions to do alternate cache configurations. */ to extend the funtions to do alternate cache configurations. */
#ifndef BOOTLOADER #ifndef BOOTLOADER
void flush_icache(void) ICODE_ATTR; void ICODE_ATTR cpucache_flush(void)
void flush_icache(void)
{ {
if (CACHE_CTL & CACHE_CTL_ENABLE) if (CACHE_CTL & CACHE_CTL_ENABLE)
{ {
@ -173,8 +172,7 @@ void flush_icache(void)
} }
} }
void invalidate_icache(void) ICODE_ATTR; void ICODE_ATTR cpucache_invalidate(void)
void invalidate_icache(void)
{ {
if (CACHE_CTL & CACHE_CTL_ENABLE) if (CACHE_CTL & CACHE_CTL_ENABLE)
{ {

View file

@ -168,13 +168,8 @@ static inline void wake_core(int core)
/** cache functions **/ /** cache functions **/
#ifndef BOOTLOADER #ifndef BOOTLOADER
#define CACHE_FUNCTIONS_AS_CALL #define HAVE_CPUCACHE_INVALIDATE
#define HAVE_CPUCACHE_FLUSH
#define HAVE_INVALIDATE_ICACHE
void invalidate_icache(void);
#define HAVE_FLUSH_ICACHE
void flush_icache(void);
#endif #endif
#endif /* CPU_PP */ #endif /* CPU_PP */

View file

@ -358,3 +358,11 @@ void coldfire_set_dataincontrol(unsigned long value)
DATAINCONTROL = (DATAINCONTROL & (1 << 9)) | value; DATAINCONTROL = (DATAINCONTROL & (1 << 9)) | value;
restore_irq(level); restore_irq(level);
} }
void cpucache_invalidate(void)
{
asm volatile ("move.l #0x01000000,%d0\n"
"movec.l %d0,%cacr\n"
"move.l #0x80000000,%d0\n"
"movec.l %d0,%cacr");
}

View file

@ -194,14 +194,7 @@ static inline uint32_t swap_odd_even32(uint32_t value)
return value; return value;
} }
#define HAVE_INVALIDATE_ICACHE #define HAVE_CPUCACHE_INVALIDATE
static inline void invalidate_icache(void)
{
asm volatile ("move.l #0x01000000,%d0\n"
"movec.l %d0,%cacr\n"
"move.l #0x80000000,%d0\n"
"movec.l %d0,%cacr");
}
#define DEFAULT_PLLCR_AUDIO_BITS 0x10400000 #define DEFAULT_PLLCR_AUDIO_BITS 0x10400000
void coldfire_set_pllcr_audio_bits(long bits); void coldfire_set_pllcr_audio_bits(long bits);

View file

@ -126,6 +126,4 @@ static inline uint32_t swap_odd_even32(uint32_t value)
return value; return value;
} }
#define invalidate_icache()
#endif /* SYSTEM_TARGET_H */ #endif /* SYSTEM_TARGET_H */

View file

@ -184,7 +184,7 @@ static void __attribute__((naked,used)) start_thread(void)
"mov r1, #0 \n" /* Mark thread as running */ "mov r1, #0 \n" /* Mark thread as running */
"str r1, [r0, #40] \n" "str r1, [r0, #40] \n"
#if NUM_CORES > 1 #if NUM_CORES > 1
"ldr r0, =invalidate_icache \n" /* Invalidate this core's cache. */ "ldr r0, =cpucache_invalidate \n" /* Invalidate this core's cache. */
"mov lr, pc \n" /* This could be the first entry into */ "mov lr, pc \n" /* This could be the first entry into */
"bx r0 \n" /* plugin or codec code for this core. */ "bx r0 \n" /* plugin or codec code for this core. */
#endif #endif
@ -668,7 +668,7 @@ static inline void switch_to_idle_stack(const unsigned int core)
static void core_switch_blk_op(unsigned int core, struct thread_entry *thread) static void core_switch_blk_op(unsigned int core, struct thread_entry *thread)
{ {
/* Flush our data to ram */ /* Flush our data to ram */
flush_icache(); cpucache_flush();
/* Stash thread in r4 slot */ /* Stash thread in r4 slot */
thread->context.r[0] = (uint32_t)thread; thread->context.r[0] = (uint32_t)thread;
/* Stash restart address in r5 slot */ /* Stash restart address in r5 slot */
@ -709,7 +709,7 @@ static void __attribute__((naked))
"ldr sp, [r0, #32] \n" /* Reload original sp from context structure */ "ldr sp, [r0, #32] \n" /* Reload original sp from context structure */
"mov r1, #0 \n" /* Clear start address */ "mov r1, #0 \n" /* Clear start address */
"str r1, [r0, #40] \n" "str r1, [r0, #40] \n"
"ldr r0, =invalidate_icache \n" /* Invalidate new core's cache */ "ldr r0, =cpucache_invalidate \n" /* Invalidate new core's cache */
"mov lr, pc \n" "mov lr, pc \n"
"bx r0 \n" "bx r0 \n"
"ldmfd sp!, { r4-r12, pc } \n" /* Restore non-volatile context to new core and return */ "ldmfd sp!, { r4-r12, pc } \n" /* Restore non-volatile context to new core and return */
@ -2457,7 +2457,7 @@ unsigned int create_thread(void (*function)(void),
/* Writeback stack munging or anything else before starting */ /* Writeback stack munging or anything else before starting */
if (core != CURRENT_CORE) if (core != CURRENT_CORE)
{ {
flush_icache(); cpucache_flush();
} }
#endif #endif
@ -2597,7 +2597,7 @@ void thread_exit(void)
switch_to_idle_stack(core); switch_to_idle_stack(core);
} }
flush_icache(); cpucache_flush();
/* At this point, this thread isn't using resources allocated for /* At this point, this thread isn't using resources allocated for
* execution except the slot itself. */ * execution except the slot itself. */

View file

@ -415,7 +415,7 @@ void usb_storage_init_connection(void)
audio_buffer = audio_get_buffer(false,&bufsize); audio_buffer = audio_get_buffer(false,&bufsize);
tb.transfer_buffer = tb.transfer_buffer =
(void *)UNCACHED_ADDR((unsigned int)(audio_buffer + 31) & 0xffffffe0); (void *)UNCACHED_ADDR((unsigned int)(audio_buffer + 31) & 0xffffffe0);
invalidate_icache(); cpucache_invalidate();
#ifdef USB_USE_RAMDISK #ifdef USB_USE_RAMDISK
ramdisk_buffer = tb.transfer_buffer + BUFFER_SIZE*2; ramdisk_buffer = tb.transfer_buffer + BUFFER_SIZE*2;
#endif #endif