SimpleOS

LXR

Navigation



Site hébergé par : enix

The LXR Cross Referencer for SOS

source navigation ]
diff markup ]
identifier search ]
general search ]
 
 
Article:1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 6.5 ] [ 7 ] [ 7.5 ] [ 8 ] [ 9 ] [ 9.5 ]

001 /* Copyright (C) 2005 David Decotigny
002 
003    This program is free software; you can redistribute it and/or
004    modify it under the terms of the GNU General Public License
005    as published by the Free Software Foundation; either version 2
006    of the License, or (at your option) any later version.
007    
008    This program is distributed in the hope that it will be useful,
009    but WITHOUT ANY WARRANTY; without even the implied warranty of
010    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
011    GNU General Public License for more details.
012    
013    You should have received a copy of the GNU General Public License
014    along with this program; if not, write to the Free Software
015    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
016    USA. 
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  * @file devtest.c
029  *
030  * Block/character devices tests
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   /* Make things more complicated */
043   fork();
044   fork();
045 
046   /*
047    * /dev/zero
048    */
049 
050   TEST_EXPECT_CONDITION(fd = open("/dev/zero", O_RDWR), RETVAL == 3);
051 
052   /* Make things more complicated: spawn and stay in child */
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   /* Make sure it is full with 0 */
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   /* Map it once */
070   TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192,
071                                      PROT_READ | PROT_WRITE, 0,
072                                      fd, 4096), RETVAL != (int)NULL);
073 
074   /* Make sure it is full with 0 */
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   /* Map it again */
084   TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192,
085                                      PROT_READ | PROT_WRITE, 0,
086                                      fd, 4096), RETVAL != (int)NULL);
087   /* Make sure it is full with 0 */
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    * /dev/null
101    */
102 
103   TEST_EXPECT_CONDITION(fd = open("/dev/null", O_RDWR), RETVAL == 3);
104 
105   /* Make things more complicated: spawn and stay in child */
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   /* Make sure buffer did not change */
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   /* Map it once */
120   TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192,
121                                      PROT_READ | PROT_WRITE, 0,
122                                      fd, 4096), RETVAL != (int)NULL);
123   /* Make sure it is full with 0 */
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   /* Map it again */
133   TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192,
134                                      PROT_READ | PROT_WRITE, 0,
135                                      fd, 4096), RETVAL != (int)NULL);
136   /* Make sure it is full with 0 */
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    * Invalid device instance of zero.c
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    * Invalid device class / device instance
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    * Test Block devices
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    * Make a checksum of all physical memory (/dev/mem)
177    */
178   TEST_EXPECT_CONDITION(fd = open("/dev/mem", O_RDONLY), RETVAL == 3);
179 
180   /* Make things more complicated: spawn and stay in child */
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    * Make a checksum of main kernel memory (/dev/kmem)
203    */
204   TEST_EXPECT_CONDITION(fd = open("/dev/kmem", O_RDONLY), RETVAL == 3);
205 
206   /* Make things more complicated: spawn and stay in child */
207   if (fork() > 0)
208     return 0;
209 
210   /* Seek to beginning of main .text section */
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   /* Crash the whole kernel */
234   bochs_printf("NOW Crashing the whole thing !...\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 }

source navigation ] diff markup ] identifier search ] general search ]