memtest/multi_tred.h

102 lines
4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}
int a =1;
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++){
if (a && i % 1000 == 0 && one_percent_chance()) {
meta->mem[i] = 45345345;
}
else
meta->mem[i] = test_patterns[meta->id];
}
break;
case 2:
for (size_t i = meta->words_start; i < meta->words_stop; i++)
meta->mem[i] = (uint32_t)i;
break;
case 3:
for (size_t i = meta->words_start; i < meta->words_stop; i++)
meta->mem[i] = 1U << (i % 32);
break;
case 4:
for (size_t i = meta->words_start; i < meta->words_stop; i++)
meta->mem[i] = ~(1U << (i % 32));
break;
}
return NULL;
}
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]) {
if (args.json){
struct error_info* error_str = malloc(sizeof(struct error_info));
error_str->expected = test_patterns[meta->id];
error_str->actual = meta->mem[i];
error_str->error_adres = meta->mem[i];
if (!meta->test_stats->test_local_stats[meta->id]->error_int){
if (meta->test_stats->test_local_stats[meta->id] != NULL){
}
meta->test_stats->test_local_stats[meta->id]->error_info = error_str;
}
else
meta->test_stats->test_local_stats[meta->id]->error_info_end->error_info_next = error_str;
meta->test_stats->test_local_stats[meta->id]->error_info_end = error_str;
}
else{
printf("\nОшибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, test_patterns[meta->id], meta->mem[i]);
}
meta->test_stats->test_local_stats[meta->id]->error_int++;
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) {
printf("\nОшибка в тесте %zu: должен быть: 0x%08X, фактический: 0x%08X\n", i, (uint32_t)i, meta->mem[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)){
printf("\nПиздец_3\n");
meta->return_error++;
}
}
break;
case 4:
for (size_t i = meta->words_start; i < meta->words_stop; i++) {
if (meta->mem[i] != ~(1U << (i % 32))){
printf("\nПиздец_4\n");
meta->return_error++;
}
}
break;
}
return NULL;
}