/** * Inject faults in the system. * * @param changedBytes - number of bytes changed in within the address range * @param changedBits - number of bits changed (0 (auto)... 8) */ void FaultInjector::injectFaults(unsigned long changedBytes, uint8_t changedBits) { unsigned long addrStart, addrEnd; addrStart = getRandomUInt(0, memorySize - 1); addrEnd = getRandomUInt(addrStart, memorySize - 1); logger.log(" inicial %lu final %lu\t", addrStart, addrEnd); injectFaults(addrStart, addrEnd, changedBytes, changedBits); }
unsigned long FaultInjector::getByteMemory(unsigned long startAddr, unsigned long endAddr) { unsigned long number, limit; int i = 0; number = getRandomUInt(startAddr, endAddr); limit = memoryRegions[0]->getSize() - 1; logger.log("radomUInt %lu\t", limit); while (number > limit) { limit += memoryRegions[i]->getSize(); i++; } logger.log("limit depois do while %lu", limit); return memoryRegions[i]->getStartAddr() + (number - limit); }
uint32_t getRandomUInt(uint32_t end) { return getRandomUInt(0, end); }
int getRandomInt(int end) { return getRandomUInt(0, end); }
/** * Inject faults in the system. * * @param startAddr - start address * @param endAddr - end address * @param changedBytes - number of bytes changed in within the address range * @param changedBits - number of bits changed (0 (auto)... 8) */ void FaultInjector::injectFaults(unsigned long startAddr, unsigned long endAddr, unsigned long changedBytes, uint8_t changedBits) { int count, temp, position; unsigned char *addr; // char buffer[32]; bool drawn[8]; // bits sorteados (para não alterar o mesmo bit mais de uma vez). if (changedBytes < 1 || changedBytes > (endAddr - startAddr)) changedBytes = DEFAULT_CHANGED_BYTES; if (changedBits > 8) // 0 para automático, 8 para alterar todos os bits changedBits = DEFAULT_CHANGED_BITS; temp = changedBits; // Logger l = Logger("/local/log.txt", true); // LocalFileSystem local("local"); // FILE *fp = fopen("/local/falhas.txt", "a"); // if (fp != NULL) { // time_t seconds = time(NULL); // strftime(buffer, 32, "%d/%m/%Y %H:%M:%S", localtime(&seconds)); // fprintf(fp, "start address: %d\n", startAddr); // fprintf(fp, "end address: %d\n", endAddr); // fprintf(fp, "changed bytes: %d\n", changedBytes); // fprintf(fp, "changed bits: %d\n\n", changedBits); for (unsigned long i = 0; i < changedBytes; i++) { DigitalOut led4(LED4); led4 = 1; wait(0.5); led4 = 0; char value[9]; //addr = (unsigned char *) getByteMemory(startAddr, endAddr); addr = (unsigned char *) getRandomUInt(startAddr, endAddr); itoa(value, *addr, 2); logger.log("%lu\n\tAddress: %p\n\tCorrect value: %s\t", i + 1, addr, value); // l.log("%lu\n\tAddress: %p\n\tCorrect value: %s", i + 1, addr, value); if (changedBits == 0) temp = getRandomUInt(1, 8); // Valor 0 altera n bits automaticamente. for (count = 0; count < 8; count++) drawn[count] = false; count = 0; while (count < temp) { position = getRandomUInt(0, 7); if (drawn[position] != true) { drawn[position] = true; count++; (*addr) ^= (1 << position); // Altera um bit de um endereço (byte) de memória. } } itoa(value, *addr, 2); // fprintf(fp, "Valor alterado: %s\n\n", value); logger.log("\tChanged value: %s\r", value); // l.log("\tChanged value: %s\n", value); } // fclose(fp); // } }