//========= Copyright © 1996-2004, Valve LLC, All rights reserved. ============ // // This common file serves as redirection to make minimal SPU-only preparation // of a job and call into its Main function. The Main function is hidden behind // the unique namespace, just like all global symbols, so that multiple similar // jobs can easily compile into and link with the vjobs.prx module that can call // them on PPU either for debugging, for fallback case, or for main processing // on Xbox360 // //#include #include #include #include #ifdef USE_LSGUARD #include #endif #ifndef VJOB #error "Please define VJOB to the project name in SPU job project. This will isolate it from other jobs when they compile into the common elf, prx or dll" #endif namespace VJOB { extern void Main( CellSpursJobContext2* stInfo, CellSpursJob256 *job ); } CellSpursJobContext2* g_stInfo = 0; uint32_t g_InterlockedBuffer[32] __attribute__((aligned(128))); #ifdef VJOB_JOBCHAIN_JOB // JobChain job: the symbol is "job" extern "C" void cellSpursJobMain2(CellSpursJobContext2* stInfo, CellSpursJob256 *job) { extern CellSpursJobContext2* g_stInfo; g_stInfo = stInfo; VJOB::Main( stInfo, job ); } #else // JobQueue job: the symbol is "jqjob" void cellSpursJobQueueMain( CellSpursJobContext2 *pContext, CellSpursJob256 *pJob ) { extern CellSpursJobContext2* g_stInfo; g_stInfo = pContext; VJOB::Main( pContext, pJob ); } #endif void CheckBufferOverflow_Impl() { uint16_t nCause; int nResult; nResult = cellSpursJobMemoryCheckTest( &nCause ); if ( nResult != CELL_OK ) { spu_printf( "cellSpursJobMemoryCheckTest() failed = %08X\n", nResult ); __asm volatile ("stopd $0,$0,$0"); } #ifdef USE_LSGUARD nResult = cellLsGuardCheckCorruption(); if ( nResult != CELL_OK ) { spu_printf( "cellLsGuardCheckCorruption() failed = %08X\n", nResult ); __asm volatile ("stopd $0,$0,$0"); cellLsGuardRehash(); // We rehash to detect the next corruption } #endif } void CheckDmaGet_Impl( const void * pBuffer, size_t nSize ) { #ifdef USE_LSGUARD int nResult; nResult = cellLsGuardCheckWriteAccess( pBuffer, nSize ); if ( nResult != CELL_OK ) { spu_printf( "cellLsGuardCheckWriteAccess() failed = %08X\n", nResult ); spu_printf( "Address: %08X - Size: %d\n", (int)pBuffer, (int)nSize ); __asm volatile ("stopd $0,$0,$0"); } #endif }