/**
 * 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);
}
Esempio n. 3
0
 uint32_t getRandomUInt(uint32_t end)
 {
     return getRandomUInt(0, end);
 }
Esempio n. 4
0
 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);
//	}

}