extern "C" void STARTUP INTERRUPT __attribute__((naked)) HardFault_Handler(void) { //according to the ARM ARMv7-M A.R.M sec. B1-22, the NVIC stores the following // values in these places when vectoring to a handler: // // $sp[0] = $r0 // $sp[1] = $r1 // $sp[2] = $r2 // $sp[3] = $r3 // $sp[4] = $r12 // $sp[5] = $lr // $sp[6] = (returnAddress) <- in "precise" cases, the faulting address, else one instruction past it* // $sp[7] = $cpsr //*(im)precision due to the nature of the instruction, execution pipeline and bus activity //moreover, these values are important: // $sp = ($sp_at_fault - 32) // $cpsr & 0xFF = (fault code) // $lr = 0xFFFFFFF9, or in some cases 0xFFFFFFF1 or 0xFFFFFFFD //a fault occurred at or near $sp[6] unsigned int volatile register faultPC; unsigned int volatile register faultLR; __asm__ volatile ( "ldr %0, [sp, #24] \n" "ldr %1, [sp, #20] \n" : "=r" (faultPC), "=r" (faultLR) : : ); writeSync("\nHardFault: pc="); writeSync(faultPC); writeSync(", lr="); writeSync(faultLR); writeSync("\nhalt."); while(1); /*__asm__ volatile ( "bx lr \n" );*/ }
int main(int argc, char **argv) { eb_t eb; ep_t ep; uint64_t networkpid; int myproc; int numprocs; int k; int iters = 0; int errs = 0; TEST_STARTUP(argc, argv, networkpid, eb, ep, 1, 1, "iters"); /* setup handlers */ setupUtilHandlers(ep, eb); /* get SPMD info */ myproc = AMX_SPMDMyProc(); numprocs = AMX_SPMDNumProcs(); if (argc > 1) iters = atoi(argv[1]); if (!iters) iters = 1; if (myproc == 0) { printf("Running %i iterations of read/write test...\n", iters); fflush(stdout); } /* gather pointers to static data, to handle non-uniform address spaces */ AM_Safe(AMX_SPMDAllGather(&myvals, pvals, sizeof(myvals))); for (k=0;k < iters; k++) { /* set left neighbor's array */ int i; int leftP = myproc-1; if (leftP == -1) leftP = numprocs-1; for (i=0;i<MAX_PROCS;i++) writeWord(leftP, pvals[leftP]+i, k); writeSync(); AM_Safe(AMX_SPMDBarrier()); /* barrier */ { /* read right neighbor's array */ int i; int rightP = myproc+1; if (rightP == numprocs) rightP = 0; for (i=0;i<MAX_PROCS;i++) readWord(&readarray[i], rightP, pvals[rightP]+i); readSync(); /* verify */ for (i=0;i<MAX_PROCS;i++) { if (((int)readarray[i]) != k) { printf("ERROR: Proc %i READ/WRITE TEST FAILED : readarray[%i] = %i k = %i\n", myproc, i, (int)readarray[i], k); fflush(stdout); errs++; break; } } } AM_Safe(AMX_SPMDBarrier()); /* barrier */ } if (!errs) { printf("Proc %i verified.\n", myproc); fflush(stdout); } /* dump stats */ AM_Safe(AMX_SPMDBarrier()); printGlobalStats(); AM_Safe(AMX_SPMDBarrier()); /* exit */ AM_Safe(AMX_SPMDExit(0)); return 0; }
bool Writeback::writeSync() { mWbMem.useNextBuffer(); return writeSync(mWbMem.getDstFd(), mWbMem.getOffset()); }