memtest/multi_tred.h

128 lines
4.6 KiB
C

#pragma once
#include <time.h>
int one_percent_chance(){
static int initialized = 0;
if (!initialized) {
srand((unsigned int)time(NULL));
initialized = 1;
}
return (rand() % 1000000) == 0;
}
void error_simulet(size_t i, struct tred_pizdec* meta){
if (args.simulate_errors && i % 1000 == 0 && one_percent_chance()) {
meta->mem[i] = 45345345;
}
}
void* fill_pattern_multi_tred(void *arg) {
struct tred_pizdec* meta = (struct tred_pizdec*) arg;
DEBUG_PRINT("id: 0x%08X\n", test_patterns[meta->id]);
switch (meta->test_tip){
case 1:
for (size_t i = meta->words_start; i < meta->words_stop; i++){
meta->mem[i] = test_patterns[meta->id];
error_simulet(i, meta);
}
break;
case 2:
for (size_t i = meta->words_start; i < meta->words_stop; i++){
meta->mem[i] = (uint32_t)i;
error_simulet(i, meta);
}
break;
case 3:
for (size_t i = meta->words_start; i < meta->words_stop; i++){
meta->mem[i] = 1U << (i % 32);
error_simulet(i, meta);
}
break;
case 4:
for (size_t i = meta->words_start; i < meta->words_stop; i++){
meta->mem[i] = ~(1U << (i % 32));
error_simulet(i, meta);
}
break;
}
return NULL;
}
void error_write_info(size_t i, struct tred_pizdec* meta, uint32_t expected){
int id = meta->id;
if (meta->test_tip != 1){
id = 2 + meta->test_tip;
}
if (args.json){
struct error_info* error_str = malloc(sizeof(struct error_info));
error_str->expected = expected;
error_str->actual = meta->mem[i];
if (!meta->test_stats->test_local_stats[id]->error_int){
if (meta->test_stats->test_local_stats[id] != NULL){
}
meta->test_stats->test_local_stats[id]->error_info = error_str;
}
else
meta->test_stats->test_local_stats[id]->error_info_end->error_info_next = error_str;
meta->test_stats->test_local_stats[id]->error_info_end = error_str;
}
else{
if (meta->test_tip == 1)
printf("\nОшибка в тесте 0x%08X: должен быть: 0x%08X, фактический: 0x%08X\n", test_patterns[id], expected, meta->mem[i]);
else
printf("\nОшибка в тесте %s: должен быть: 0x%08X, фактический: 0x%08X\n", test_name[meta->test_tip-2], expected, meta->mem[i]);
}
meta->test_stats->test_local_stats[id]->error_int++;
}
void* check_pattern_multi_tred(void *arg) {
struct tred_pizdec* meta = (struct tred_pizdec*) arg;
//meta->return_error = 0;
switch (meta->test_tip){
case 1:
for (size_t i = meta->words_start; i < meta->words_stop; i++){
if (meta->mem[i] != test_patterns[meta->id]){
error_write_info(i, meta, test_patterns[meta->id]);
meta->return_error++;
//if (meta->return_error > 10) break;
}
}
break;
case 2:
for (size_t i = meta->words_start; i < meta->words_stop; i++) {
if (meta->mem[i] != (uint32_t)i) {
error_write_info(i, meta, (uint32_t)i);
meta->return_error++;
//if (meta->return_error > 10) break;
}
//printf("Адрес памяти: %p\n", (void*)meta->mem[i]);
}
break;
case 3:
for (size_t i = meta->words_start; i < meta->words_stop; i++) {
if (meta->mem[i] != 1U << (i % 32)){
error_write_info(i, meta, 1U << (i % 32));
meta->return_error++;
//if (meta->return_error > 10) break;
}
}
break;
case 4:
for (size_t i = meta->words_start; i < meta->words_stop; i++) {
//printf("\rTEST: 0x%08X ", ~(1U << (i % 32)));
if (meta->mem[i] != ~(1U << (i % 32))){
DEBUG_PRINT("\n\nTEST: %p \n", (void*)&meta->mem[i]);
DEBUG_PRINT("TEST: 0x%08X \n", meta->mem[i]);
DEBUG_PRINT("TEST: 0x%08X \n\n", ~(1U << (i % 32)));
error_write_info(i, meta, ~(1U << (i % 32)));
meta->return_error++;
//if (meta->return_error > 10) break;
}
}
break;
}
return NULL;
}