001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019 #include <crt.h>
020 #include <libc.h>
021 #include <stdarg.h>
022 #include <string.h>
023 #include <debug.h>
024
025 #include "fstest_utils.h"
026
027
028
029
030
031
032
033 int main()
034 {
035 int fd, len;
036 unsigned int sum, mem_size;
037 char buff[256];
038 char *uaddr;
039
040 bochs_printf("Hi from devtest\n");
041
042
043 fork();
044 fork();
045
046
047
048
049
050 TEST_EXPECT_CONDITION(fd = open("/dev/zero", O_RDWR), RETVAL == 3);
051
052
053 if (fork() > 0)
054 return 0;
055
056 strzcpy(buff, "Garbage", sizeof(buff));
057 TEST_EXPECT_CONDITION(len = read(fd, buff, sizeof(buff)),
058 RETVAL == sizeof(buff));
059
060
061 for (len = 0 ; len < sizeof(buff) ; len ++)
062 if (buff[len])
063 break;
064 TEST_EXPECT_CONDITION(len, RETVAL == sizeof(buff));
065
066 TEST_EXPECT_CONDITION(len = write(fd, 0, 123456789), RETVAL == 123456789);
067 TEST_EXPECT_CONDITION(len = lseek(fd, 1234, SEEK_SET), RETVAL == 1234);
068
069
070 TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192,
071 PROT_READ | PROT_WRITE, 0,
072 fd, 4096), RETVAL != (int)NULL);
073
074
075 for (len = 0 ; len < 8192 ; len ++)
076 if (uaddr[len])
077 break;
078 TEST_EXPECT_CONDITION(len, RETVAL == 8192);
079
080 strzcpy(uaddr, "Hello /dev/zero", 8192);
081 TEST_EXPECT_CONDITION(strcmp(uaddr, "Hello /dev/zero"), RETVAL == 0);
082
083
084 TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192,
085 PROT_READ | PROT_WRITE, 0,
086 fd, 4096), RETVAL != (int)NULL);
087
088 for (len = 0 ; len < 8192 ; len ++)
089 if (uaddr[len])
090 break;
091 TEST_EXPECT_CONDITION(len, RETVAL == 8192);
092
093 strzcpy(uaddr, "Hello /dev/zero", 8192);
094 TEST_EXPECT_CONDITION(strcmp(uaddr, "Hello /dev/zero"), RETVAL == 0);
095
096 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
097
098
099
100
101
102
103 TEST_EXPECT_CONDITION(fd = open("/dev/null", O_RDWR), RETVAL == 3);
104
105
106 if (fork() > 0)
107 return 0;
108
109 strzcpy(buff, "Garbage", sizeof(buff));
110 TEST_EXPECT_CONDITION(len = read(fd, buff, sizeof(buff)),
111 RETVAL == 0);
112
113
114 TEST_EXPECT_CONDITION(strcmp("Garbage", buff), RETVAL == 0);
115
116 TEST_EXPECT_CONDITION(len = write(fd, 0, 123456789), RETVAL == 123456789);
117 TEST_EXPECT_CONDITION(len = lseek(fd, 1234, SEEK_SET), RETVAL == 1234);
118
119
120 TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192,
121 PROT_READ | PROT_WRITE, 0,
122 fd, 4096), RETVAL != (int)NULL);
123
124 for (len = 0 ; len < 8192 ; len ++)
125 if (uaddr[len])
126 break;
127 TEST_EXPECT_CONDITION(len, RETVAL == 8192);
128
129 strzcpy(uaddr, "Hello /dev/null", 8192);
130 TEST_EXPECT_CONDITION(strcmp(uaddr, "Hello /dev/null"), RETVAL == 0);
131
132
133 TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192,
134 PROT_READ | PROT_WRITE, 0,
135 fd, 4096), RETVAL != (int)NULL);
136
137 for (len = 0 ; len < 8192 ; len ++)
138 if (uaddr[len])
139 break;
140 TEST_EXPECT_CONDITION(len, RETVAL == 8192);
141
142 strzcpy(uaddr, "Hello /dev/null", 8192);
143 TEST_EXPECT_CONDITION(strcmp(uaddr, "Hello /dev/null"), RETVAL == 0);
144
145 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
146
147
148
149
150 TEST_EXPECT_CONDITION(mknod("/dev/invalid_zero", S_IRUSR | S_IWUSR,
151 S_IFCHR, 1, 42), RETVAL == 0);
152 ls("/", 1, 1);
153 TEST_EXPECT_CONDITION(fd = open("/dev/invalid_zero", O_RDWR), RETVAL < 0);
154 TEST_EXPECT_CONDITION(unlink("/dev/invalid_zero"), RETVAL == 0);
155
156
157
158
159
160 TEST_EXPECT_CONDITION(mknod("/dev/invalid_devclass", S_IRUSR | S_IWUSR,
161 S_IFCHR, 54654, 476576), RETVAL == 0);
162 ls("/", 1, 1);
163 TEST_EXPECT_CONDITION(fd = open("/dev/invalid_devclass",
164 O_RDWR), RETVAL < 0);
165 TEST_EXPECT_CONDITION(unlink("/dev/invalid_devclass"), RETVAL == 0);
166
167
168
169
170
171 TEST_EXPECT_CONDITION(fd = open("/dev/hda", O_RDONLY), RETVAL < 0);
172 ls("/", 1, 1);
173 TEST_EXPECT_CONDITION(close(fd), RETVAL < 0);
174
175
176
177
178 TEST_EXPECT_CONDITION(fd = open("/dev/mem", O_RDONLY), RETVAL == 3);
179
180
181 if (fork() > 0)
182 return 0;
183
184 for (mem_size = 0, sum = 0 ;
185 len = read(fd, buff, sizeof(buff)), len > 0 ;
186 mem_size += len)
187 {
188 char *c;
189 if (((mem_size / sizeof(buff)) % 4000) == 0)
190 printf("Read %d MB of physical memory\n", mem_size >> 20);
191
192 for (c = buff ; c - buff < len ; c++)
193 sum += *c;
194 }
195 TEST_EXPECT_CONDITION(mem_size, RETVAL > 0);
196 printf("Checkum of RAM (%d MB) is %x\n", mem_size >> 20, sum);
197 TEST_EXPECT_CONDITION(len = lseek(fd, 0, SEEK_SET), len == 0);
198 TEST_EXPECT_CONDITION(len = lseek(fd, 0, SEEK_END), len == mem_size);
199 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
200
201
202
203
204 TEST_EXPECT_CONDITION(fd = open("/dev/kmem", O_RDONLY), RETVAL == 3);
205
206
207 if (fork() > 0)
208 return 0;
209
210
211 TEST_EXPECT_CONDITION(lseek(fd, 0x201000, SEEK_SET), RETVAL == 0x201000);
212 for (mem_size = 0, sum = 0 ;
213 len = read(fd, buff, sizeof(buff)), len > 0 ;
214 mem_size += len)
215 {
216 char *c;
217 if (((mem_size / sizeof(buff)) % 400) == 0)
218 printf("Read %d kB of kernel memory\n", mem_size >> 10);
219
220 for (c = buff ; c - buff < len ; c++)
221 sum += *c;
222 }
223 TEST_EXPECT_CONDITION(mem_size, RETVAL > 0);
224 printf("Checkum of main kernel area (%d kB) is %x\n",
225 mem_size >> 10, sum);
226 TEST_EXPECT_CONDITION(len = lseek(fd, 0, SEEK_SET), len == 0);
227 TEST_EXPECT_CONDITION(len = lseek(fd, 0, SEEK_END), len == 0x40000000);
228 TEST_EXPECT_CONDITION(close(fd), RETVAL == 0);
229
230 printf("Bye from devtest\n");
231 ls("/", 1, 1);
232
233
234 bochs_printf("[31;1mNOW Crashing the whole thing !...[m\n");
235
236 {
237 int i;
238 for (i = 5 ; i >= 0 ; i --)
239 {
240 printf("Crashing the whole thing in %ds !... \r", i);
241 sleep(1);
242 }
243 }
244 printf("\nGO !\n");
245 TEST_EXPECT_CONDITION(fd = open("/dev/mem", O_WRONLY), RETVAL == 3);
246 memset(buff, 0xcc, sizeof(buff));
247 while (write(fd, buff, sizeof(buff)))
248 continue;
249
250 return 0;
251 }