/** * main - entry point for SPU-side context restore. * * This code deviates from the documented sequence in the * following aspects: * * 1. The EA for LSCSA is passed from PPE in the * signal notification channels. * 2. The register spill area is pulled by SPU * into LS, rather than pushed by PPE. * 3. All 128 registers are restored by exit(). * 4. The exit() function is modified at run * time in order to properly restore the * SPU_Status register. */ int main() { addr64 lscsa_ea; lscsa_ea.ui[0] = spu_readch(SPU_RdSigNotify1); lscsa_ea.ui[1] = spu_readch(SPU_RdSigNotify2); fetch_regs_from_mem(lscsa_ea); set_event_mask(); /* Step 1. */ set_tag_mask(); /* Step 2. */ build_dma_list(lscsa_ea); /* Step 3. */ restore_upper_240kb(lscsa_ea); /* Step 4. */ /* Step 5: done by 'exit'. */ enqueue_putllc(lscsa_ea); /* Step 7. */ set_tag_update(); /* Step 8. */ read_tag_status(); /* Step 9. */ restore_decr(); /* moved Step 6. */ read_llar_status(); /* Step 10. */ write_ppu_mb(); /* Step 11. */ write_ppuint_mb(); /* Step 12. */ restore_fpcr(); /* Step 13. */ restore_srr0(); /* Step 14. */ restore_event_mask(); /* Step 15. */ restore_tag_mask(); /* Step 16. */ /* Step 17. done by 'exit'. */ restore_complete(); /* Step 18. */ return 0; }
/** * main - entry point for SPU-side context save. * * This code deviates from the documented sequence as follows: * * 1. The EA for LSCSA is passed from PPE in the * signal notification channels. * 2. All 128 registers are saved by crt0.o. */ int main() { addr64 lscsa_ea; lscsa_ea.ui[0] = spu_readch(SPU_RdSigNotify1); lscsa_ea.ui[1] = spu_readch(SPU_RdSigNotify2); /* Step 1: done by exit(). */ save_event_mask(); /* Step 2. */ save_tag_mask(); /* Step 3. */ set_event_mask(); /* Step 4. */ set_tag_mask(); /* Step 5. */ build_dma_list(lscsa_ea); /* Step 6. */ save_upper_240kb(lscsa_ea); /* Step 7. */ /* Step 8: done by exit(). */ save_fpcr(); /* Step 9. */ save_decr(); /* Step 10. */ save_srr0(); /* Step 11. */ enqueue_putllc(lscsa_ea); /* Step 12. */ spill_regs_to_mem(lscsa_ea); /* Step 13. */ enqueue_sync(lscsa_ea); /* Step 14. */ set_tag_update(); /* Step 15. */ read_tag_status(); /* Step 16. */ read_llar_status(); /* Step 17. */ save_complete(); /* Step 18. */ return 0; }