Main Page | Directories | File List | Globals

memtests_core.c File Reference

#include <agnix/agnix.h>
#include <agnix/init.h>
#include <agnix/memory.h>
#include <agnix/linkage.h>
#include <asm/memtests.h>
#include <agnix/console.h>

Include dependency graph for memtests_core.c:

Go to the source code of this file.

Defines

#define MOD_NAME   "MEMTEST: "

Functions

u32 memaddr_next_1 (u32 addr)
u32 memdata_next_1 (u32 data)
int memcheck_type_1 (u32 addr_check, u32 data_check)
int memtests_init (void)
u32 do_memtest_next_addr (u32 addr_cur, int memaddr_pattern_type)
u32 do_memtest_next_data (u32 data_cur, int memdata_pattern_type)
int do_memtest_checks (u32 addr_check, u32 data_check, int memtest_check_type)
int do_memtest_check (u32 addr_start, u32 addr_end, u32 data_start, int memaddr_pattern_type, int memdata_pattern_type, int memtest_check_type)
int do_memtest (u32 addr_start, u32 addr_end, int memaddr_pattern_type, int memdata_pattern_type, int memtest_check_type, int check_rate)
int do_memtests (void)

Variables

main_memory_s main_memory
memtest_addr_pattern_s memaddr_patterns [MEMTEST_MAX_ADDR_PATTERNS]
memtest_data_pattern_s memdata_patterns [MEMTEST_MAX_DATA_PATTERNS]
memtest_check_type_s memcheck_types [MEMTEST_MAX_CHECK_TYPES]


Define Documentation

#define MOD_NAME   "MEMTEST: "
 

Definition at line 21 of file memtests_core.c.


Function Documentation

int do_memtest u32  addr_start,
u32  addr_end,
int  memaddr_pattern_type,
int  memdata_pattern_type,
int  memtest_check_type,
int  check_rate
 

Definition at line 160 of file memtests_core.c.

References __asm__(), do_memtest_check(), do_memtest_next_addr(), do_memtest_next_data(), and printk().

Referenced by do_memtests().

00161 {
00162     u32 addr_cur = addr_start;
00163     u32 data_cur = 0xA5A5A5A5;
00164     u32 addr_last_check = addr_cur;
00165     u32 data_last_check = data_cur;
00166     int check_rate_cur = 0;
00167     int check_ret = 0;
00168     int bar_progress = 0;
00169     int bar_next_progress;
00170     u32 bar_max_progress = (addr_end - addr_start);
00171     int i;
00172 
00173     do {
00174         
00175         check_rate_cur++;
00176         
00177         if (check_rate == check_rate_cur) {
00178             check_rate_cur = 0;
00179             check_ret = do_memtest_check(addr_last_check, addr_cur, data_last_check,
00180                              memaddr_pattern_type, memdata_pattern_type, memtest_check_type);
00181 
00182             if (check_ret < 0) {
00183                 printk(" failed\n");
00184                 return check_ret;
00185             }
00186 
00187             addr_last_check = addr_cur;
00188             data_last_check = data_cur;
00189             
00190             bar_next_progress = ((addr_cur - addr_start) * 10) / bar_max_progress;
00191             if (bar_next_progress != bar_progress) {
00192                 for (i = bar_progress; i < bar_next_progress; i++) {
00193                     printk(".");
00194                 }
00195                 bar_progress = bar_next_progress;
00196             }
00197         }
00198 
00199         __asm__ __volatile (
00200         "movl %%eax, (%%edi)"
00201         :
00202         :"D"(addr_cur), "a"(data_cur)
00203         );
00204 
00205         addr_cur = do_memtest_next_addr(addr_cur, memaddr_pattern_type);
00206         data_cur = do_memtest_next_data(data_cur, memdata_pattern_type);
00207 
00208     } while (addr_cur < addr_end);
00209 
00210     printk(" ok\n");
00211 
00212     return 0;
00213 }

Here is the call graph for this function:

int do_memtest_check u32  addr_start,
u32  addr_end,
u32  data_start,
int  memaddr_pattern_type,
int  memdata_pattern_type,
int  memtest_check_type
 

Definition at line 133 of file memtests_core.c.

References __asm__(), do_memtest_checks(), do_memtest_next_addr(), do_memtest_next_data(), MOD_NAME, and printk().

Referenced by do_memtest().

00135 {
00136     u32 addr_check_cur = addr_start;
00137     u32 data_check_cur = data_start;
00138 
00139     do {
00140 
00141         if (addr_check_cur == do_memtest_checks(addr_check_cur, data_check_cur, memtest_check_type) < 0) {
00142             printk(MOD_NAME "check failed at address %08x with data %08x\n", addr_check_cur, data_check_cur);
00143             return -1;
00144         }
00145 
00146         __asm__ __volatile (
00147         "movl %%eax, (%%edi)"
00148         :
00149         :"D"(addr_check_cur), "a"(0)
00150         );
00151 
00152         addr_check_cur = do_memtest_next_addr(addr_check_cur, memaddr_pattern_type);
00153         data_check_cur = do_memtest_next_data(data_check_cur, memdata_pattern_type);
00154 
00155     } while(addr_check_cur < addr_end);
00156     
00157     return 0;
00158 }

Here is the call graph for this function:

int do_memtest_checks u32  addr_check,
u32  data_check,
int  memtest_check_type
 

Definition at line 114 of file memtests_core.c.

References memcheck_types.

Referenced by do_memtest_check().

00115 {
00116     int i;
00117     int check_ret;
00118         
00119     for (i = 0; i < MEMTEST_MAX_CHECK_TYPES; i++) {
00120         if (!memcheck_types[i].memtest_check_type)
00121             return 0;
00122         
00123         if (!(memcheck_types[i].memtest_check_type & memtest_check_type))
00124             continue;
00125         
00126         if ((check_ret = memcheck_types[i].check_mem(addr_check, data_check)) < 0)
00127             return check_ret;
00128     }
00129     
00130     return 0;
00131 }

u32 do_memtest_next_addr u32  addr_cur,
int  memaddr_pattern_type
 

Definition at line 78 of file memtests_core.c.

References memaddr_patterns.

Referenced by do_memtest(), and do_memtest_check().

00079 {
00080     u32 addr_next = addr_cur;
00081     int i;
00082         
00083     for (i = 0; i < MEMTEST_MAX_ADDR_PATTERNS; i++) {
00084         if (!memaddr_patterns[i].memtest_addr_pattern_type)
00085             return addr_next;
00086         
00087         if (!(memaddr_patterns[i].memtest_addr_pattern_type & memaddr_pattern_type))
00088             continue;
00089         
00090         addr_next = memaddr_patterns[i].next_addr(addr_next);
00091     }
00092     
00093     return addr_next;
00094 }

u32 do_memtest_next_data u32  data_cur,
int  memdata_pattern_type
 

Definition at line 96 of file memtests_core.c.

References memdata_patterns.

Referenced by do_memtest(), and do_memtest_check().

00097 {
00098     u32 data_next = data_cur;
00099     int i;
00100         
00101     for (i = 0; i < MEMTEST_MAX_DATA_PATTERNS; i++) {
00102         if (!memdata_patterns[i].memtest_data_pattern_type)
00103             return data_next;
00104         
00105         if (!(memdata_patterns[i].memtest_data_pattern_type & memdata_pattern_type))
00106             continue;
00107         
00108         data_next = memdata_patterns[i].next_data(data_next);
00109     }
00110     
00111     return data_next;
00112 }

int do_memtests void   ) 
 

Definition at line 215 of file memtests_core.c.

References do_memtest(), main_memory, MOD_NAME, and printk().

Referenced by bootmem_init_dh().

00216 {       
00217     printk(MOD_NAME "upper memory tests....\n");
00218     
00219     printk(MOD_NAME "RW test (from 0xc0200000 to 0x%08x) ", 0xc0000000 + (main_memory.mem_size << 10));
00220 
00221     do_memtest(0xc0200000, 0xc0000000 + (main_memory.mem_size << 10), MEMTEST_ADDR_PATTERN_ALL, 
00222                MEMTEST_DATA_PATTERN_BINARY, MEMTEST_CHECK_RW, 32);
00223     
00224     return 0;
00225 }

Here is the call graph for this function:

u32 memaddr_next_1 u32  addr  ) 
 

Definition at line 25 of file memtests_core.c.

00026 {
00027     return addr + 16;
00028 }

int memcheck_type_1 u32  addr_check,
u32  data_check
 

Definition at line 35 of file memtests_core.c.

References __asm__().

00036 {
00037     __asm__ __volatile (
00038     "movl (%%edi), %%eax\n\t"
00039     "subl %%ebx, %%eax"
00040     :
00041     :"D"(addr_check), "b"(data_check)
00042     );
00043 
00044 // return value is in eax
00045 }

Here is the call graph for this function:

u32 memdata_next_1 u32  data  ) 
 

Definition at line 30 of file memtests_core.c.

00031 {
00032     return 0xA5A5A5A5;
00033 }

int memtests_init void   ) 
 

Definition at line 71 of file memtests_core.c.

References MOD_NAME, and printk().

00072 {
00073     printk(MOD_NAME "initializing memory tests\n");
00074     
00075     return 0;
00076 }

Here is the call graph for this function:


Variable Documentation

struct main_memory_s main_memory
 

Definition at line 23 of file memory.c.

struct memtest_addr_pattern_s memaddr_patterns[MEMTEST_MAX_ADDR_PATTERNS]
 

Initial value:

 {
    {
    .memtest_addr_pattern_type          = MEMTEST_ADDR_PATTERN_ALL,
    .next_addr                          = memaddr_next_1
    },
    { 0 }
}

Definition at line 47 of file memtests_core.c.

Referenced by do_memtest_next_addr().

struct memtest_check_type_s memcheck_types[MEMTEST_MAX_CHECK_TYPES]
 

Initial value:

 {
    {
    .memtest_check_type                 = MEMTEST_CHECK_RW,
    .check_mem                          = memcheck_type_1
    },
    { 0 }
}

Definition at line 63 of file memtests_core.c.

Referenced by do_memtest_checks().

struct memtest_data_pattern_s memdata_patterns[MEMTEST_MAX_DATA_PATTERNS]
 

Initial value:

 {
    {
    .memtest_data_pattern_type          = MEMTEST_DATA_PATTERN_BINARY,
    .next_data                          = memdata_next_1
    },
    { 0 }
}

Definition at line 55 of file memtests_core.c.

Referenced by do_memtest_next_data().

Dokumentacje wygenerowano programem Doxygen 1.4.2 dla projektu Agnix