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