large page morecore: add command line options to test
[barrelfish] / usr / tests / large_page / malloc_test.c
1 /**
2  * \file
3  * \brief Test program for large page code
4  */
5
6 /*
7  * Copyright (c) 2014, HP Labs.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #include <barrelfish/barrelfish.h>
16 #include <barrelfish/sys_debug.h>
17
18 #define DEFAULT_RUNS 2
19 // 128MB buffer
20 #define DEFAULT_BUFSIZE (128UL*1024*1024)
21
22 int main(int argc, char *argv[])
23 {
24     unsigned long BUFSIZE = DEFAULT_BUFSIZE;
25     unsigned RUNS = DEFAULT_RUNS;
26     if (argc == 2) {
27         if (strcmp(argv[1], "-h") == 0) {
28             debug_printf("usage: %s <bufsize> <runs>\n", argv[0]);
29             debug_printf("  both arguments are optional, defaults are:\n");
30             debug_printf("    BUFSIZE = %lu\n", DEFAULT_BUFSIZE);
31             debug_printf("    RUNS = %u\n", DEFAULT_RUNS);
32             return 0;
33         }
34         BUFSIZE = strtol(argv[1], NULL, 0);
35     }
36     if (argc == 3) {
37         RUNS = strtol(argv[1], NULL, 0);
38     }
39     debug_printf("running malloc test with BUFSIZE = %lu, runs = %u\n", BUFSIZE, RUNS);
40     void *bufs[RUNS];
41     for (int k = 0; k < RUNS; k++) {
42         // touch every 4k page in region
43         bufs[k] = malloc(BUFSIZE);
44         if (!bufs[k]) {
45             debug_printf("malloc %d FAILED\n", k);
46             break;
47         }
48         uint8_t *buf = bufs[k];
49         for (int i = 0; i < BUFSIZE / BASE_PAGE_SIZE; i++) {
50             buf[i*BASE_PAGE_SIZE] = i % 256;
51         }
52         // clear out caches
53         sys_debug_flush_cache();
54         int errors = 0;
55         for (int i = 0; i < BUFSIZE / BASE_PAGE_SIZE; i++) {
56             if (buf[i*BASE_PAGE_SIZE] != i % 256) {
57                 debug_printf("mismatch in page %d: expected %d, was %d\n",
58                         i, i % 256, buf[i*BASE_PAGE_SIZE]);
59                 errors++;
60             }
61         }
62         debug_printf("test %s\n", errors ? "FAILED" : "PASSED");
63         if (errors) {
64             debug_printf("  %d errors\n", errors);
65         }
66     }
67     for (int k = 0; k < RUNS; k++) {
68         debug_printf("bufs[%d] = %p\n", k, bufs[k]);
69     }
70     debug_dump_hw_ptables();
71     for (int k = 0; k < RUNS; k++) {
72         free(bufs[k]);
73     }
74     return 0;
75 }