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 #include <drivers/devices.h>
025
026 #include "fstest_utils.h"
027
028
029
030
031
032
033 static int test_device(char const* path, char magic)
034 {
035 char wrbuff[32767];
036 char rdbuff[32767];
037 int fd, fdcheck, i;
038 char * mem;
039
040 fd = open(path, O_RDWR);
041 if (fd < 0)
042 {
043 bochs_printf("Cannot open %s: error %d\n", path, fd);
044 return -1;
045 }
046
047 bochs_printf("Testing %s...\n", path);
048
049
050 TEST_EXPECT_CONDITION(lseek(fd, 2*512, SEEK_SET), RETVAL == 2*512);
051 TEST_EXPECT_CONDITION(write(fd, wrbuff, 1), RETVAL == 1);
052 TEST_EXPECT_CONDITION(lseek(fd, 4*512, SEEK_SET), RETVAL == 4*512);
053 TEST_EXPECT_CONDITION(read(fd, rdbuff, 1), RETVAL == 1);
054
055
056 for (i = 0 ; i < sizeof(wrbuff) ; i ++)
057 wrbuff[i] = magic + i;
058 memset(rdbuff, 0xaa, sizeof(wrbuff));
059 TEST_EXPECT_CONDITION(lseek(fd, 3*512 + 43, SEEK_SET), RETVAL == 3*512 + 43);
060 TEST_EXPECT_CONDITION(write(fd, wrbuff, sizeof(wrbuff)),
061 RETVAL == sizeof(wrbuff));
062 TEST_EXPECT_CONDITION(write(fd, rdbuff, sizeof(rdbuff)),
063 RETVAL == sizeof(rdbuff));
064
065 memset(rdbuff, 0xbb, sizeof(rdbuff));
066 TEST_EXPECT_CONDITION(lseek(fd, 3*512 + 47, SEEK_SET), RETVAL == 3*512 + 47);
067 TEST_EXPECT_CONDITION(read(fd, rdbuff, sizeof(wrbuff)),
068 RETVAL == sizeof(wrbuff));
069 TEST_EXPECT_CONDITION(memcmp(rdbuff, wrbuff+4, sizeof(wrbuff)-4),
070 RETVAL == 0);
071
072 fdcheck = open(path, O_RDONLY);
073
074 #define MAPOFFS (50*4096)
075
076
077 TEST_EXPECT_CONDITION(mem = mmap(NULL, sizeof(wrbuff), PROT_READ,
078 MAP_PRIVATE, fd, MAPOFFS + 3),
079 (void*)RETVAL == NULL);
080 TEST_EXPECT_CONDITION(mem = mmap(NULL, sizeof(wrbuff),
081 PROT_READ | PROT_WRITE, MAP_PRIVATE,
082 fd, MAPOFFS),
083 (void*)RETVAL != NULL);
084
085 for (i = 0 ; i < sizeof(wrbuff) ; i ++)
086 wrbuff[i] = magic + i;
087 TEST_EXPECT_CONDITION(1, 1);
088
089 memset(rdbuff, 0xaa, sizeof(wrbuff));
090 TEST_EXPECT_CONDITION(lseek(fd, MAPOFFS, SEEK_SET), RETVAL == MAPOFFS);
091 TEST_EXPECT_CONDITION(write(fd, wrbuff, sizeof(wrbuff)),
092 RETVAL == sizeof(wrbuff));
093 TEST_EXPECT_CONDITION(memcmp(wrbuff, mem, sizeof(wrbuff)),
094 RETVAL == 0);
095
096 for (i = 0 ; i < sizeof(wrbuff) ; i ++)
097 mem[i] = wrbuff[i]*i;
098 TEST_EXPECT_CONDITION(1, 1);
099
100 memset(rdbuff, 0xaa, sizeof(rdbuff));
101 TEST_EXPECT_CONDITION(lseek(fdcheck, MAPOFFS, SEEK_SET), RETVAL == MAPOFFS);
102 TEST_EXPECT_CONDITION(read(fdcheck, rdbuff, sizeof(wrbuff)),
103 RETVAL == sizeof(wrbuff));
104 TEST_EXPECT_CONDITION(memcmp(wrbuff, rdbuff, sizeof(wrbuff)), RETVAL == 0);
105
106 TEST_EXPECT_CONDITION(msync(mem, sizeof(wrbuff), MS_SYNC), RETVAL == 0);
107 TEST_EXPECT_CONDITION(munmap(mem, sizeof(wrbuff)), RETVAL == 0);
108
109
110 TEST_EXPECT_CONDITION(mem = mmap(mem, sizeof(wrbuff), PROT_READ,
111 MAP_SHARED, fd, MAPOFFS + 3),
112 (void*)RETVAL == NULL);
113 TEST_EXPECT_CONDITION(mem = mmap(mem, sizeof(wrbuff),
114 PROT_READ | PROT_WRITE, MAP_SHARED,
115 fd, MAPOFFS),
116 (void*)RETVAL != NULL);
117 for (i = 0 ; i < sizeof(wrbuff) ; i ++)
118 wrbuff[i] = magic + i;
119 memset(rdbuff, 0xaa, sizeof(rdbuff));
120 TEST_EXPECT_CONDITION(lseek(fd, MAPOFFS, SEEK_SET), RETVAL == MAPOFFS);
121 TEST_EXPECT_CONDITION(write(fd, wrbuff, sizeof(wrbuff)),
122 RETVAL == sizeof(wrbuff));
123 TEST_EXPECT_CONDITION(memcmp(wrbuff, mem, sizeof(wrbuff)), RETVAL == 0);
124
125 for (i = 0 ; i < sizeof(wrbuff) ; i ++)
126 mem[i] = wrbuff[i]*i;
127 memset(rdbuff, 0xaa, sizeof(rdbuff));
128 TEST_EXPECT_CONDITION(lseek(fdcheck, MAPOFFS, SEEK_SET), RETVAL == MAPOFFS);
129 TEST_EXPECT_CONDITION(read(fdcheck, rdbuff, sizeof(wrbuff)),
130 RETVAL == sizeof(wrbuff));
131 TEST_EXPECT_CONDITION(memcmp(wrbuff, rdbuff, sizeof(wrbuff)), RETVAL != 0);
132 TEST_EXPECT_CONDITION(memcmp(mem, rdbuff, sizeof(wrbuff)), RETVAL == 0);
133
134 TEST_EXPECT_CONDITION(msync(mem, sizeof(wrbuff), MS_SYNC), RETVAL == 0);
135 TEST_EXPECT_CONDITION(munmap(mem, sizeof(wrbuff)), RETVAL == 0);
136
137 #define STARTOFFS (3*512 + 43 + sizeof(wrbuff) + sizeof(rdbuff))
138
139 TEST_EXPECT_CONDITION(lseek(fd, STARTOFFS, SEEK_SET), RETVAL == STARTOFFS);
140 TEST_EXPECT_CONDITION(lseek(fdcheck, STARTOFFS, SEEK_SET),
141 RETVAL == STARTOFFS);
142 int wrlen = 0;
143 while (1)
144 {
145 int sz;
146 for (i = 0 ; i < sizeof(wrbuff) ; i ++)
147 wrbuff[i] = magic*magic*i + wrlen*wrlen + i;
148
149 TEST_EXPECT_CONDITION(sz = write(fd, wrbuff, sizeof(wrbuff)),
150 (RETVAL >= 0) && (RETVAL <= sizeof(wrbuff)));
151 if (sz <= 0)
152 break;
153 wrlen += sz;
154
155 memset(rdbuff, 0xcc, sizeof(wrbuff));
156 TEST_EXPECT_CONDITION(read(fdcheck, rdbuff, sizeof(wrbuff)), RETVAL == sz);
157 TEST_EXPECT_CONDITION(memcmp(rdbuff, wrbuff, sz), RETVAL == 0);
158 }
159
160
161 TEST_EXPECT_CONDITION(lseek(fd, STARTOFFS, SEEK_SET), RETVAL == STARTOFFS);
162 int rdlen = 0;
163 while (1)
164 {
165 int sz;
166 for (i = 0 ; i < sizeof(wrbuff) ; i ++)
167 wrbuff[i] = magic*magic*i + rdlen*rdlen + i;
168
169 memset(rdbuff, 0xdd, sizeof(wrbuff));
170 TEST_EXPECT_CONDITION(sz = read(fd, rdbuff, sizeof(wrbuff)),
171 (RETVAL >= 0) && (RETVAL <= sizeof(wrbuff)));
172 if (sz <= 0)
173 break;
174 rdlen += sz;
175 TEST_EXPECT_CONDITION(memcmp(rdbuff, wrbuff, sz), RETVAL == 0);
176 }
177 TEST_EXPECT_CONDITION(rdlen, wrlen == rdlen);
178
179 bochs_printf("Synching %s...\n", path);
180 ioctl(fd, SOS_IOCTL_BLOCKDEV_SYNC, 0);
181
182 close(fd);
183 bochs_printf("End of test for %s.\n", path);
184
185 return 0;
186 }
187
188
189 int main(void)
190 {
191 int i;
192 bochs_printf("Hi from blktest\n");
193
194
195 for (i = 1 ; i <= 15 ; i ++)
196 {
197 char path[64];
198 snprintf(path, sizeof(path), "/dev/hda%d", i);
199 if (fork() == 0)
200 {
201 test_device(path, i);
202 return 0;
203 }
204 }
205
206 bochs_printf("Bye from blktest\n");
207 return 0;
208 }