root/user/uw-testbin/vm-mix2/vm-mix2.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. write_data
  2. read_data
  3. print_data
  4. do_work
  5. main

   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 #include <string.h>
   4 #include <unistd.h>
   5 
   6 /* This is creating a program that has
   7  * a few more text pages than the average
   8  * program we usually have.
   9  */
  10 
  11 // #define DEBUG
  12 
  13 extern void     call_all_loop(int count);
  14 void write_data(unsigned int array[], unsigned int start);
  15 void read_data(unsigned int array[], unsigned int start, const char *array_name);
  16 void print_data(unsigned int array[]);
  17 void do_work(unsigned int start);
  18 
  19 #define PAGE_SIZE           (4096)
  20 #define DATA_BYTES          (3 * 1024 * 1024)
  21 #define PAGES               (DATA_BYTES / PAGE_SIZE)
  22 #define ELEM_SIZE           (sizeof(unsigned int))
  23 #define ELEMS               ((PAGE_SIZE * PAGES / sizeof(unsigned int)) / 2)
  24 #define ELEMS_PER_PAGE      (PAGE_SIZE / ELEM_SIZE)
  25 
  26 #define TLB_SIZE            (64)
  27 #define LOCAL_REFS          (TLB_SIZE - 6)    /* leave a few pages for code and stack */
  28 
  29 #define STACK_PAGES_USED    (9)
  30 #define STACK_ARRAY_ELEMS   (PAGE_SIZE * STACK_PAGES_USED / sizeof(unsigned int))
  31 
  32 #define MIN(a,b)            ((a < b) ? a : b)
  33 
  34 unsigned int init[] = {
  35   0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
  36  10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
  37  20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
  38  30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
  39  40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
  40  50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  41 };
  42 
  43 #define INIT_ARRAY_ELEMS     (sizeof(init) / sizeof(int))
  44 
  45 unsigned int array1[ELEMS];
  46 unsigned int array2[ELEMS];
  47 
  48 void
  49 write_data(unsigned int array[], unsigned int start)
  50 {
  51         unsigned int i = 0;
  52   unsigned int k = 0;
  53   unsigned int end = 0;
  54 
  55         for (k=0; k<ELEMS; k += PAGE_SIZE) {
  56                 end = MIN(ELEMS, (k + (LOCAL_REFS * ELEMS_PER_PAGE)));
  57                 for (i=k; i<end; i++) {
  58                         array[i] = start + (i / ELEMS_PER_PAGE);
  59                 }
  60 #ifdef DEBUG
  61                 printf("from k = %d to i = %d end %d\n", i, k, end);
  62 #endif
  63         }
  64 }
  65 
  66 void
  67 read_data(unsigned int array[], unsigned int start, const char *array_name)
  68 {
  69         unsigned int i = 0;
  70         unsigned int j = start;
  71 
  72         j = start;
  73         for (i=0; i<ELEMS; i++) {
  74           if (array[i] != (start + (i / ELEMS_PER_PAGE))) {
  75                         printf("FAILED in file %s at line %d %s[%d] = %u != %u\n", 
  76                                                         __FILE__, __LINE__, array_name, i, array[i], i);
  77                         exit(1);
  78                 }
  79         }
  80 }
  81 
  82 void
  83 print_data(unsigned int array[])
  84 {
  85         unsigned int i = 0;
  86   unsigned int count = 0;
  87 
  88         for (i=0; i<ELEMS; i+= (ELEMS_PER_PAGE)) {
  89                 printf("[%10u] = %10u ", i, array[i]);
  90     if (((count+1) % 4) == 0) {
  91       printf("\n");
  92     }
  93     count++;
  94         }
  95   printf("\n");
  96 }
  97 
  98 void
  99 do_work(unsigned int start)
 100 {
 101         unsigned int stack_array[STACK_ARRAY_ELEMS];
 102         unsigned int i = 0;
 103   unsigned int array1_start = start;
 104   unsigned int array2_start = start + (ELEMS / (ELEMS_PER_PAGE)) + 10;
 105 
 106   printf("Checking uninitialized array1\n");
 107         /* check the uninitialized array1 before initialization */
 108         for (i=0; i<ELEMS; i++) {
 109                 if (array1[i] != 0) {
 110                         printf("FAILED in file %s at line %d: array1[%d] = %u != %d\n", __FILE__, __LINE__, i, array1[i], 0);
 111                         exit(1);
 112                 }
 113         }
 114 
 115   printf("Checking uninitialized array2\n");
 116         /* check the uninitialized array2 before initialization */
 117         for (i=0; i<ELEMS; i++) {
 118                 if (array2[i] != 0) {
 119                         printf("FAILED in file %s at line %d: array2[%d] = %u != %d\n", __FILE__, __LINE__, i, array2[i], 0);
 120                         exit(1);
 121                 }
 122         }
 123 
 124         for (i=0; i<STACK_ARRAY_ELEMS; i++) {
 125                 stack_array[i] = i * 1000;
 126         }
 127 
 128         for (i=0; i<2; i++) {
 129           call_all_loop(1);
 130           write_data(array1, array1_start);
 131           call_all_loop(1);
 132     printf("Checking initialized array1\n");
 133           read_data(array1, array1_start, "array1");
 134         }
 135 
 136         /* check the uninitialized array2 again before initialization */
 137   printf("Checking initialized array2 again\n");
 138         for (i=0; i<ELEMS; i++) {
 139                 if (array2[i] != 0) {
 140                         printf("FAILED in file %s at line %d: array2[%d] = %u != %d\n", __FILE__, __LINE__, i, array2[i], 0);
 141                         exit(1);
 142                 }
 143         }
 144 
 145   printf("Checking initialized stack_array\n");
 146         for (i=0; i<STACK_ARRAY_ELEMS; i++) {
 147                 if (stack_array[i] != i * 1000) {
 148                         printf("FAILED in file %s at line %d: stack_array[%d] = %u != %d\n", __FILE__, __LINE__, i, stack_array[i], i);
 149                         exit(1);
 150                 }
 151         }
 152 
 153   printf("Checking initialized init\n");
 154         /* check the initialized array */
 155         for (i=0; i<INIT_ARRAY_ELEMS; i++) {
 156                 if (init[i] != i) {
 157                         printf("FAILED in file %s at line %d: init[%d] = %u != %d\n", __FILE__, __LINE__, i, init[i], i);
 158                         exit(1);
 159                 }
 160         }
 161 
 162         for (i=0; i<2; i++) {
 163           call_all_loop(20);
 164           write_data(array2, array2_start);
 165           call_all_loop(20);
 166     printf("Checking initialized array2\n");
 167           read_data(array2, array2_start, "array2");
 168         }
 169 
 170   printf("Checking initialized stack_array\n");
 171         for (i=0; i<STACK_ARRAY_ELEMS; i++) {
 172                 if (stack_array[i] != i * 1000) {
 173                         printf("FAILED in file %s at line %d: stack_array[%d] = %u != %d\n", __FILE__, __LINE__, i, stack_array[i], i);
 174                         exit(1);
 175                 }
 176         }
 177 
 178         /* check the initialized array */
 179   printf("Checking initialized init\n");
 180         for (i=0; i<INIT_ARRAY_ELEMS; i++) {
 181                 if (init[i] != i) {
 182                         printf("FAILED in file %s at line %d: init[%d] = %u != %d\n", __FILE__, __LINE__, i, init[i], i);
 183                         exit(1);
 184                 }
 185         }
 186 
 187 
 188   printf("Checking initialized array1 for the last time\n");
 189         read_data(array1, array1_start, "array1");
 190   printf("Checking initialized array2 for the last time\n");
 191         read_data(array2, array2_start, "array2");
 192 
 193 
 194         printf("SUCCEEDED\n");
 195 }
 196 
 197 int
 198 main()
 199 {
 200 
 201 #ifdef DEBUG
 202   printf("PAGE_SIZE = %d\n", PAGE_SIZE);
 203   printf("DATA_BYTES = %d\n", DATA_BYTES);
 204   printf("ELEMS = %d\n", ELEMS);
 205   printf("ELEMS_PER_PAGE = %d\n", ELEMS_PER_PAGE);
 206   printf("PAGES = %d\n", PAGES);
 207   printf("Array elements = %d\n", ELEMS);
 208   printf("Pages per array = %d\n", ((ELEMS * sizeof(unsigned int)) / PAGE_SIZE));
 209 #endif
 210 
 211   do_work(1);
 212 #ifdef DEBUG
 213         printf("array 1\n");
 214         print_data(array1);
 215         printf("array 2\n");
 216         print_data(array2);
 217 #endif
 218   exit(0);
 219 }
 220 

/* [<][>][^][v][top][bottom][index][help] */