/** * Inject errors using the hardware fault injection functionality, and write * random data and read it back using the indicated location. * * @param InstancePtr is a pointer to the XBram instance to * be worked on. * @param The Addr is the indicated memory location to use * @param The Index1 is the bit location of the first injected error * @param The Index2 is the bit location of the second injected error * @param The ActualData is filled in with expected data for checking * @param The ActualEcc is filled in with expected ECC for checking * * @return None * * @note None. * ******************************************************************************/ static void InjectErrors(XBram * InstancePtr, u32 Addr, int Index1, int Index2, u32 *ActualData, u32 *ActualEcc) { u32 InjectedData = 0; u32 InjectedEcc = 0; u32 RandomData = PrngData(&PrngResult); if (Index1 < 32) { InjectedData = 1 << Index1; } else { InjectedEcc = 1 << (Index1 - 32); } if (Index2 < 32) { InjectedData |= (1 << Index2); } else { InjectedEcc |= 1 << (Index2 - 32); } WR(FI_D_0_OFFSET, InjectedData); WR(FI_ECC_0_OFFSET, InjectedEcc); XBram_Out32(Addr, RandomData); (void) XBram_In32(Addr); *ActualData = InjectedData ^ RandomData; *ActualEcc = InjectedEcc ^ CalculateEcc(RandomData); }
/** * Inject errors using the hardware fault injection functionality, and write * random data and read it back using the indicated location. * * @param InstancePtr is a pointer to the XBram instance to * be worked on. * @param The Addr is the indicated memory location to use * @param The Index1 is the bit location of the first injected error * @param The Index2 is the bit location of the second injected error * @param The Width is the data byte width * @param The ActualData is filled in with expected data for checking * @param The ActualEcc is filled in with expected ECC for checking * * @return None * * @note None. * ******************************************************************************/ static void InjectErrors(XBram * InstancePtr, u32 Addr, int Index1, int Index2, int Width, u32 *ActualData, u32 *ActualEcc) { u32 InjectedData = 0; u32 InjectedEcc = 0; u32 RandomData = PrngData(&PrngResult); if (Index1 < 32) { InjectedData = 1 << Index1; } else { InjectedEcc = 1 << (Index1 - 32); } if (Index2 < 32) { InjectedData |= (1 << Index2); } else { InjectedEcc |= 1 << (Index2 - 32); } WR(FI_D_0_OFFSET, InjectedData); WR(FI_ECC_0_OFFSET, InjectedEcc); XBram_Out32(Addr, RandomData); Xil_DCacheFlushRange(Addr, 4); switch (Width) { case 1: /* Byte - Write to do Read-Modify-Write */ XBram_Out8(Addr, PrngData(&PrngResult) & 0xFF); break; case 2: /* Halfword - Write to do Read-Modify-Write */ XBram_Out16(Addr, PrngData(&PrngResult) & 0xFFFF); break; case 4: /* Word - Read */ (void) XBram_In32(Addr); break; } *ActualData = InjectedData ^ RandomData; *ActualEcc = InjectedEcc ^ CalculateEcc(RandomData); }