SyterKit 0.4.0.x
SyterKit is a bare-metal framework
Loading...
Searching...
No Matches
memtester.c
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-2.0 */
2
3#include <stdbool.h>
4#include <stddef.h>
5#include <stdint.h>
6#include <types.h>
7
8#include <log.h>
9#include <mmu.h>
10
11#include <common.h>
12
13#define rand_ul() rand32()
14#define UL_ONEBITS 0xffffffff
15#define UL_LEN 32
16#define CHECKERBOARD1 0x55555555
17#define CHECKERBOARD2 0xaaaaaaaa
18#define UL_BYTE(x) ((x | x << 8 | x << 16 | x << 24))
19
20typedef unsigned int ul;
21typedef unsigned long long ull;
22typedef unsigned int volatile ulv;
23typedef unsigned char volatile u8v;
24typedef unsigned short volatile u16v;
25
26struct test {
27 char *name;
28 int (*fp)(ulv *bufa, ulv *bufb, size_t count);
29};
30
31union {
32 unsigned char bytes[UL_LEN / 8];
35
36union {
37 unsigned short u16s[UL_LEN / 16];
38 ul val;
40
42 return time_ms();
43}
44
45char progress[] = "-\\|/";
46#define PROGRESSLEN 4
47#define PROGRESSOFTEN 2500
48#define ONE 0x00000001L
49
50/* Function definitions. */
51
52int compare_regions(ulv *bufa, ulv *bufb, size_t count) {
53 int r = 0;
54 size_t i;
55 ulv *p1 = bufa;
56 ulv *p2 = bufb;
57
58 for (i = 0; i < count; i++, p1++, p2++) {
59 if (*p1 != *p2) {
61 "FAILURE: 0x%x != 0x%x at physical address "
62 "0x%x 0x%x.\n",
63 *p1, *p2, p1, p2);
64 r = -1;
65 break;
66 }
67 }
68 return r;
69}
70
71int test_stuck_address(ulv *bufa, size_t count) {
72 ulv *p1 = bufa;
73 unsigned int j;
74 size_t i;
75
77 for (j = 0; j < 16; j++) {
78 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
79 p1 = (ulv *) bufa;
80 printk(LOG_LEVEL_MUTE, "setting %3u", j);
81 for (i = 0; i < count; i++) {
82 *p1 = ((j + i) % 2) == 0 ? (ul) p1 : ~((ul) p1);
83 *p1++;
84 }
85 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
86 printk(LOG_LEVEL_MUTE, "testing %3u", j);
87 p1 = (ulv *) bufa;
88 for (i = 0; i < count; i++, p1++) {
89 if (*p1 != (((j + i) % 2) == 0 ? (ul) p1 : ~((ul) p1))) {
91 "FAILURE: possible bad address line at physical "
92 "address 0x%x.\n",
93 p1);
94
95 printk(LOG_LEVEL_MUTE, "address 0x%x value is 0x%x, should be 0x%x\n", p1, *p1, (((j + i) % 2) == 0 ? (ul) p1 : ~((ul) p1)));
96
97 printk(LOG_LEVEL_MUTE, "Skipping to next test...\n");
98 return -1;
99 }
100 }
101 }
102 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b");
103 return 0;
104}
105
106int test_random_value(ulv *bufa, ulv *bufb, size_t count) {
107 ulv *p1 = bufa;
108 ulv *p2 = bufb;
109 ul j = 0;
110 size_t i;
111
112 uart_putchar(' ');
113 for (i = 0; i < count; i++) {
114 *p1++ = *p2++ = rand_ul();
115 if (!(i % PROGRESSOFTEN)) {
116 uart_putchar('\b');
118 }
119 }
120 printk(LOG_LEVEL_MUTE, "\b \b");
121 return compare_regions(bufa, bufb, count);
122}
123
124int test_xor_comparison(ulv *bufa, ulv *bufb, size_t count) {
125 ulv *p1 = bufa;
126 ulv *p2 = bufb;
127 size_t i;
128 ul q = rand_ul();
129
130 for (i = 0; i < count; i++) {
131 *p1++ ^= q;
132 *p2++ ^= q;
133 }
134 return compare_regions(bufa, bufb, count);
135}
136
137int test_sub_comparison(ulv *bufa, ulv *bufb, size_t count) {
138 ulv *p1 = bufa;
139 ulv *p2 = bufb;
140 size_t i;
141 ul q = rand_ul();
142
143 for (i = 0; i < count; i++) {
144 *p1++ -= q;
145 *p2++ -= q;
146 }
147 return compare_regions(bufa, bufb, count);
148}
149
150int test_mul_comparison(ulv *bufa, ulv *bufb, size_t count) {
151 ulv *p1 = bufa;
152 ulv *p2 = bufb;
153 size_t i;
154 ul q = rand_ul();
155
156 for (i = 0; i < count; i++) {
157 *p1++ *= q;
158 *p2++ *= q;
159 }
160 return compare_regions(bufa, bufb, count);
161}
162
163int test_div_comparison(ulv *bufa, ulv *bufb, size_t count) {
164 ulv *p1 = bufa;
165 ulv *p2 = bufb;
166 size_t i;
167 ul q = rand_ul();
168
169 for (i = 0; i < count; i++) {
170 if (!q) {
171 q++;
172 }
173 *p1++ /= q;
174 *p2++ /= q;
175 }
176 return compare_regions(bufa, bufb, count);
177}
178
179int test_or_comparison(ulv *bufa, ulv *bufb, size_t count) {
180 ulv *p1 = bufa;
181 ulv *p2 = bufb;
182 size_t i;
183 ul q = rand_ul();
184
185 for (i = 0; i < count; i++) {
186 *p1++ |= q;
187 *p2++ |= q;
188 }
189 return compare_regions(bufa, bufb, count);
190}
191
192int test_and_comparison(ulv *bufa, ulv *bufb, size_t count) {
193 ulv *p1 = bufa;
194 ulv *p2 = bufb;
195 size_t i;
196 ul q = rand_ul();
197
198 for (i = 0; i < count; i++) {
199 *p1++ &= q;
200 *p2++ &= q;
201 }
202 return compare_regions(bufa, bufb, count);
203}
204
205int test_seqinc_comparison(ulv *bufa, ulv *bufb, size_t count) {
206 ulv *p1 = bufa;
207 ulv *p2 = bufb;
208 size_t i;
209 ul q = rand_ul();
210
211 for (i = 0; i < count; i++) { *p1++ = *p2++ = (i + q); }
212 return compare_regions(bufa, bufb, count);
213}
214
215int test_solidbits_comparison(ulv *bufa, ulv *bufb, size_t count) {
216 ulv *p1 = bufa;
217 ulv *p2 = bufb;
218 unsigned int j;
219 ul q;
220 size_t i;
221
223 for (j = 0; j < 64; j++) {
224 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
225 q = (j % 2) == 0 ? UL_ONEBITS : 0;
226 printk(LOG_LEVEL_MUTE, "setting %3u", j);
227 p1 = (ulv *) bufa;
228 p2 = (ulv *) bufb;
229 for (i = 0; i < count; i++) { *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; }
230 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
231 printk(LOG_LEVEL_MUTE, "testing %3u", j);
232 if (compare_regions(bufa, bufb, count)) {
233 return -1;
234 }
235 }
236 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b");
237 return 0;
238}
239
240int test_checkerboard_comparison(ulv *bufa, ulv *bufb, size_t count) {
241 ulv *p1 = bufa;
242 ulv *p2 = bufb;
243 unsigned int j;
244 ul q;
245 size_t i;
246
248 for (j = 0; j < 64; j++) {
249 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
250 q = (j % 2) == 0 ? CHECKERBOARD1 : CHECKERBOARD2;
251 printk(LOG_LEVEL_MUTE, "setting %3u", j);
252 p1 = (ulv *) bufa;
253 p2 = (ulv *) bufb;
254 for (i = 0; i < count; i++) { *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; }
255 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
256 printk(LOG_LEVEL_MUTE, "testing %3u", j);
257 if (compare_regions(bufa, bufb, count)) {
258 return -1;
259 }
260 }
261 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b");
262 return 0;
263}
264
265int test_blockseq_comparison(ulv *bufa, ulv *bufb, size_t count) {
266 ulv *p1 = bufa;
267 ulv *p2 = bufb;
268 unsigned int j;
269 size_t i;
270
272 for (j = 0; j < 256; j++) {
273 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
274 p1 = (ulv *) bufa;
275 p2 = (ulv *) bufb;
276 printk(LOG_LEVEL_MUTE, "setting %3u", j);
277 for (i = 0; i < count; i++) { *p1++ = *p2++ = (ul) UL_BYTE(j); }
278 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
279 printk(LOG_LEVEL_MUTE, "testing %3u", j);
280 if (compare_regions(bufa, bufb, count)) {
281 return -1;
282 }
283 }
284 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b");
285 return 0;
286}
287
288int test_walkbits0_comparison(ulv *bufa, ulv *bufb, size_t count) {
289 ulv *p1 = bufa;
290 ulv *p2 = bufb;
291 unsigned int j;
292 size_t i;
293
295 for (j = 0; j < UL_LEN * 2; j++) {
296 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
297 p1 = (ulv *) bufa;
298 p2 = (ulv *) bufb;
299 printk(LOG_LEVEL_MUTE, "setting %3u", j);
300 for (i = 0; i < count; i++) {
301 if (j < UL_LEN) { /* Walk it up. */
302 *p1++ = *p2++ = ONE << j;
303 } else { /* Walk it back down. */
304 *p1++ = *p2++ = ONE << (UL_LEN * 2 - j - 1);
305 }
306 }
307 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
308 printk(LOG_LEVEL_MUTE, "testing %3u", j);
309 if (compare_regions(bufa, bufb, count)) {
310 return -1;
311 }
312 }
313 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b");
314 return 0;
315}
316
317int test_walkbits1_comparison(ulv *bufa, ulv *bufb, size_t count) {
318 ulv *p1 = bufa;
319 ulv *p2 = bufb;
320 unsigned int j;
321 size_t i;
322
324 for (j = 0; j < UL_LEN * 2; j++) {
325 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
326 p1 = (ulv *) bufa;
327 p2 = (ulv *) bufb;
328 printk(LOG_LEVEL_MUTE, "setting %3u", j);
329 for (i = 0; i < count; i++) {
330 if (j < UL_LEN) { /* Walk it up. */
331 *p1++ = *p2++ = UL_ONEBITS ^ (ONE << j);
332 } else { /* Walk it back down. */
333 *p1++ = *p2++ = UL_ONEBITS ^ (ONE << (UL_LEN * 2 - j - 1));
334 }
335 }
336 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
337 printk(LOG_LEVEL_MUTE, "testing %3u", j);
338 if (compare_regions(bufa, bufb, count)) {
339 return -1;
340 }
341 }
342 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b");
343 return 0;
344}
345
346int test_bitspread_comparison(ulv *bufa, ulv *bufb, size_t count) {
347 ulv *p1 = bufa;
348 ulv *p2 = bufb;
349 unsigned int j;
350 size_t i;
351
353 for (j = 0; j < UL_LEN * 2; j++) {
354 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
355 p1 = (ulv *) bufa;
356 p2 = (ulv *) bufb;
357 printk(LOG_LEVEL_MUTE, "setting %3u", j);
358 for (i = 0; i < count; i++) {
359 if (j < UL_LEN) { /* Walk it up. */
360 *p1++ = *p2++ = (i % 2 == 0) ? (ONE << j) | (ONE << (j + 2)) : UL_ONEBITS ^ ((ONE << j) | (ONE << (j + 2)));
361 } else { /* Walk it back down. */
362 *p1++ = *p2++ =
363 (i % 2 == 0) ? (ONE << (UL_LEN * 2 - 1 - j)) | (ONE << (UL_LEN * 2 + 1 - j)) : UL_ONEBITS ^ (ONE << (UL_LEN * 2 - 1 - j) | (ONE << (UL_LEN * 2 + 1 - j)));
364 }
365 }
366 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
367 printk(LOG_LEVEL_MUTE, "testing %3u", j);
368 if (compare_regions(bufa, bufb, count)) {
369 return -1;
370 }
371 }
372 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b");
373 return 0;
374}
375
376int test_bitflip_comparison(ulv *bufa, ulv *bufb, size_t count) {
377 ulv *p1 = bufa;
378 ulv *p2 = bufb;
379 unsigned int j, k;
380 ul q;
381 size_t i;
382
384 for (k = 0; k < UL_LEN; k++) {
385 q = ONE << k;
386 for (j = 0; j < 8; j++) {
387 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
388 q = ~q;
389 printk(LOG_LEVEL_MUTE, "setting %3u", k * 8 + j);
390 p1 = (ulv *) bufa;
391 p2 = (ulv *) bufb;
392 for (i = 0; i < count; i++) { *p1++ = *p2++ = (i % 2) == 0 ? q : ~q; }
393 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b");
394 printk(LOG_LEVEL_MUTE, "testing %3u", k * 8 + j);
395 if (compare_regions(bufa, bufb, count)) {
396 return -1;
397 }
398 }
399 }
400 printk(LOG_LEVEL_MUTE, "\b\b\b\b\b\b\b\b\b\b\b \b\b\b\b\b\b\b\b\b\b\b");
401 return 0;
402}
403
404int test_8bit_wide_random(ulv *bufa, ulv *bufb, size_t count) {
405 u8v *p1, *t;
406 ulv *p2;
407 int attempt;
408 unsigned int b, j = 0;
409 size_t i;
410
411 uart_putchar(' ');
412 for (attempt = 0; attempt < 2; attempt++) {
413 if (attempt & 1) {
414 p1 = (u8v *) bufa;
415 p2 = bufb;
416 } else {
417 p1 = (u8v *) bufb;
418 p2 = bufa;
419 }
420 for (i = 0; i < count; i++) {
421 t = mword8.bytes;
422 *p2++ = mword8.val = rand_ul();
423 for (b = 0; b < UL_LEN / 8; b++) { *p1++ = *t++; }
424 if (!(i % PROGRESSOFTEN)) {
425 uart_putchar('\b');
427 }
428 }
429 if (compare_regions(bufa, bufb, count)) {
430 return -1;
431 }
432 }
433 printk(LOG_LEVEL_MUTE, "\b \b");
434 return 0;
435}
436
437int test_16bit_wide_random(ulv *bufa, ulv *bufb, size_t count) {
438 u16v *p1, *t;
439 ulv *p2;
440 int attempt;
441 unsigned int b, j = 0;
442 size_t i;
443
444 uart_putchar(' ');
445 for (attempt = 0; attempt < 2; attempt++) {
446 if (attempt & 1) {
447 p1 = (u16v *) bufa;
448 p2 = bufb;
449 } else {
450 p1 = (u16v *) bufb;
451 p2 = bufa;
452 }
453 for (i = 0; i < count; i++) {
454 t = mword16.u16s;
455 *p2++ = mword16.val = rand_ul();
456 for (b = 0; b < UL_LEN / 16; b++) { *p1++ = *t++; }
457 if (!(i % PROGRESSOFTEN)) {
458 uart_putchar('\b');
460 }
461 }
462 if (compare_regions(bufa, bufb, count)) {
463 return -1;
464 }
465 }
466 printk(LOG_LEVEL_MUTE, "\b \b");
467 return 0;
468}
469
470static struct test tests[] = {{"Random Value", test_random_value},
471 {"Compare XOR", test_xor_comparison},
472 {"Compare SUB", test_sub_comparison},
473 {"Compare MUL", test_mul_comparison},
474 {"Compare DIV", test_div_comparison},
475 {"Compare OR", test_or_comparison},
476 {"Compare AND", test_and_comparison},
477 {"Sequential Increment", test_seqinc_comparison},
478 {"Solid Bits", test_solidbits_comparison},
479 {"Block Sequential", test_blockseq_comparison},
480 {"Checkerboard", test_checkerboard_comparison},
481 {"Bit Spread", test_bitspread_comparison},
482 {"Bit Flip", test_bitflip_comparison},
483 {"Walking Ones", test_walkbits1_comparison},
484 {"Walking Zeroes", test_walkbits0_comparison},
485 {"8-bit Writes", test_8bit_wide_random},
486 {"16-bit Writes", test_16bit_wide_random},
487 {NULL, NULL}};
488
489/* Function declarations */
490static int do_memtester(uint64_t start_addr, uint32_t dram_size, uint64_t test_size, uint32_t loops) {
491 ul loop, i;
492 uint64_t bufsize, wantbytes, wantmb, halflen, count;
493 char *memsuffix;
494 int memshift;
495 ulv *bufa, *bufb;
496
497 wantbytes = test_size;
498 wantmb = (wantbytes >> 20);
499 halflen = wantbytes / 2;
500 count = halflen / sizeof(ul);
501 bufa = (uint32_t *) start_addr;
502 bufb = (ulv *) ((size_t) bufa + test_size);
503
504 printk(LOG_LEVEL_MUTE, "Memtester Want %dMB (%llu bytes)\n", wantmb, wantbytes);
505 printk(LOG_LEVEL_MUTE, "bufa 0x%x, bufb 0x%x, loops %d, count %d\n", bufa, bufb, loops, count);
506 printk(LOG_LEVEL_MUTE, "Loop %lu", loops);
507 printk(LOG_LEVEL_MUTE, ":\n");
508 printk(LOG_LEVEL_MUTE, " %-20s: ", "Stuck Address");
509 if (!test_stuck_address(bufa, wantbytes / sizeof(ul))) {
510 printk(LOG_LEVEL_MUTE, "ok\n");
511 } else {
512 printk(LOG_LEVEL_MUTE, "bad\n");
513 }
514 for (i = 0;; i++) {
515 if (!tests[i].name)
516 break;
517
518 printk(LOG_LEVEL_MUTE, " %-20s: ", tests[i].name);
519
520 if (!tests[i].fp(bufa, bufb, count)) {
521 printk(LOG_LEVEL_MUTE, "ok\n");
522 } else {
523 printk(LOG_LEVEL_MUTE, "bad\n");
524 }
525 }
526 printk(LOG_LEVEL_MUTE, "\n");
527
528 printk(LOG_LEVEL_MUTE, "Done.\n");
529 return 0;
530}
uint32_t time_ms(void)
Get the current time in milliseconds.
Definition timer.c:36
int test_bitspread_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:346
int test_stuck_address(ulv *bufa, size_t count)
Definition memtester.c:71
unsigned char bytes[UL_LEN/8]
Definition memtester.c:32
#define PROGRESSLEN
Definition memtester.c:46
#define UL_BYTE(x)
Definition memtester.c:18
static struct test tests[]
Definition memtester.c:470
#define CHECKERBOARD1
Definition memtester.c:16
#define ONE
Definition memtester.c:48
int compare_regions(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:52
unsigned int volatile ulv
Definition memtester.c:22
int test_walkbits1_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:317
int test_solidbits_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:215
#define UL_LEN
Definition memtester.c:15
char progress[]
Definition memtester.c:45
uint32_t rand32()
Definition memtester.c:41
int test_or_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:179
union @2 mword16
int test_mul_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:150
int test_bitflip_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:376
int test_walkbits0_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:288
#define CHECKERBOARD2
Definition memtester.c:17
int test_seqinc_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:205
#define PROGRESSOFTEN
Definition memtester.c:47
int test_and_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:192
int test_16bit_wide_random(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:437
unsigned long long ull
Definition memtester.c:21
int test_random_value(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:106
int test_checkerboard_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:240
unsigned short volatile u16v
Definition memtester.c:24
ul val
Definition memtester.c:33
unsigned int ul
Definition memtester.c:20
int test_8bit_wide_random(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:404
static int do_memtester(uint64_t start_addr, uint32_t dram_size, uint64_t test_size, uint32_t loops)
Definition memtester.c:490
int test_div_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:163
#define UL_ONEBITS
Definition memtester.c:14
#define rand_ul()
Definition memtester.c:13
unsigned char volatile u8v
Definition memtester.c:23
int test_xor_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:124
unsigned short u16s[UL_LEN/16]
Definition memtester.c:37
int test_sub_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:137
int test_blockseq_comparison(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:265
union @1 mword8
char name[ANDR_BOOT_NAME_SIZE]
Definition bimage.c:76
#define NULL
Definition stddef.h:7
u64_t uint64_t
Definition stdint.h:16
u32_t uint32_t
Definition stdint.h:13
static uint32_t dram_size
Definition sys-dram.c:22
int uart_putchar(int c)
Writes a single character 'c' to the UART output.
Definition uart.c:27
void printk(int level, const char *fmt,...)
Print message to kernel log.
Definition log.c:13
#define LOG_LEVEL_MUTE
Definition log.h:21
Definition memtester.c:26
char * name
Definition memtester.c:27
int(* fp)(ulv *bufa, ulv *bufb, size_t count)
Definition memtester.c:28