/* [<][>][^][v][top][bottom][index][help] */
DEFINITIONS
This source file includes following definitions.
- write_data
- read_data
- print_data
- do_work
- 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