static void me_loop(volatile struct me_struct *mei) { unsigned int k1; k1 = pspSdkSetK1(0); while (mei->init) // ME runs this loop until killed { while (mei->start == 0); // wait for function mei->start = 0; if (mei->precache_len) { if (mei->precache_len < 0) dcache_inv_all(); else dcache_inv_range(mei->precache_addr, mei->precache_len); } mei->result = mei->func(mei->param); // run function if (mei->postcache_len) { if (mei->postcache_len < 0) dcache_wbinv_all(); else dcache_wbinv_range(mei->postcache_addr, mei->postcache_len); } mei->done = 1; } pspSdkSetK1(k1); while (1); // loop forever until ME reset }
void dcache_disable(void) { /* turn off D-cache */ dcache_stop(); /* clear and invalidate d-cache */ dcache_flush_all(); /* drain write buffer */ asm("mcr p15, 0, %0, c7, c10, 4": :"r"(0)); /* invalidate d-cache */ dcache_inv_all(); /* disable mmu, d-cache */ mmu_turnoff(); }