17 printf("segtool [<command> <arg>]* \n"
19 " create <size_in_bytes>\n"
22 " map <offset> <size_in_bytes>\n"
23 " unmap <size_in_bytes>\n"
24 " dump <offset> <size_in_bytes>\n"
26 " fill <offset> <size_in_bytes> <char_in_hex>\n"
34 #define ALLOC_MIN 4096
35 #define ALLOC_MAX 1048576
37 void inputbuf(FILE *fp, char **retbuf, uint64_t *retsize)
39 static uint64_t alloc_size;
45 if (alloc_size < ALLOC_MIN)
46 alloc_size = ALLOC_MIN;
48 if (alloc_size > ALLOC_MAX)
49 alloc_size = ALLOC_MAX;
51 p = realloc(buf, alloc_size);
62 r = fread(buf + size, 1, alloc_size - size, fp);
66 if (size >= alloc_size) {
67 p = realloc(buf, alloc_size * 2);
85 static int opendev(void)
87 int fd = open("/dev/segdev", O_RDWR);
89 perror("/dev/segdev");
94 static unsigned long mapped_size;
96 int cmd_create(uint64_t size)
98 int r, fd = opendev();
102 r = ioctl(fd, SEGDEV_IOC_CREATESEG, size);
110 int cmd_destroy(void)
112 int r, fd = opendev();
116 r = ioctl(fd, SEGDEV_IOC_DESTROYSEG, 0);
118 perror("DESTROYSEG");
126 long r, fd = opendev();
130 r = ioctl(fd, SEGDEV_IOC_SEGSIZE, 0);
134 printf("Segment size: %lu bytes\n", r);
139 int cmd_map(uint64_t offset, uint64_t size)
142 long r = -1, fd = opendev();
151 r = ioctl(fd, SEGDEV_IOC_SEGSIZE, 0);
159 if (offset + size > r) {
160 printf("segment size would be exceeded\n");
165 //seg = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, offset);
166 seg = mmap( (void*) 0x37fd0000, size,
167 PROT_READ | PROT_WRITE,
168 MAP_SHARED | MAP_FIXED,
170 if (seg == MAP_FAILED) {
182 int cmd_unmap(uint64_t size)
184 long r = -1, fd = opendev();
195 r = munmap(segment, size);
210 int c, fd = open("/dev/tty", O_RDONLY);
216 int cmd_dump(uint64_t offset, uint64_t size)
218 long r = -1, fd = opendev();
223 printf("segment not mapped\n");
228 size = mapped_size - offset;
230 if (offset + size > mapped_size) {
231 printf("mapped segment size would be exceeded\n");
235 for (r = offset; r < offset + size; r++)
236 if (fputc(segment[r], stdout) == EOF)
246 int cmd_load(uint64_t offset)
248 long r = -1, fd = opendev();
255 printf("segment not mapped\n");
259 for (pos = offset; pos < mapped_size; pos++) {
260 int c = fgetc(stdin);
270 int cmd_fill(uint64_t offset, uint64_t size, int fill)
272 long r = -1, fd = opendev();
273 uint64_t misscount = 0;
279 printf("segment not mapped\n");
284 size = mapped_size - offset;
286 if (offset + size > mapped_size) {
287 printf("mapped segment size would be exceeded\n");
291 memset(segment + offset, fill, size);
292 for (size += offset; offset < size; offset++)
293 if (segment[offset] != (char)fill)
297 printf("fill misscount(!) %lu\n", misscount);
305 unsigned long i, count;
306 unsigned long *longs;
309 printf("segment not mapped\n");
313 longs = (void *)segment;
314 count = mapped_size / sizeof(long);
315 for (i = 0; i < count; i++)
321 int cmd_checkmark(void)
323 unsigned long i, count;
324 unsigned long *longs;
327 printf("segment not mapped\n");
331 longs = (void *)segment;
332 count = mapped_size / sizeof(long);
333 for (i = 0; i < count; i++)
335 printf("%lu != %lu\n", i, longs[i]);
339 int main(int argc, char **argv) {
346 for (i = 1; i < argc; i++) {
348 if (!strcmp(argv[i], "info")) {
353 if (!strcmp(argv[i], "create") && (i + 1 < argc)) {
354 ret = cmd_create(atol(argv[i+1]));
359 if (!strcmp(argv[i], "destroy")) {
364 if (!strcmp(argv[i], "wait")) {
369 if (!strcmp(argv[i], "mark")) {
374 if (!strcmp(argv[i], "checkmark")) {
375 ret = cmd_checkmark();
379 if (!strcmp(argv[i], "map") && (i + 2 < argc)) {
380 ret = cmd_map(atol(argv[i+1]), atol(argv[i+2]));
385 if (!strcmp(argv[i], "unmap") && (i + 1 < argc)) {
386 ret = cmd_unmap(atol(argv[i+1]));
391 if (!strcmp(argv[i], "fill") && (i + 3 < argc)) {
392 ret = cmd_fill( atol(argv[i+1]),
394 strtoul(argv[i+3], NULL, 16));
399 if (!strcmp(argv[i], "dump") && (i + 2 < argc)) {
400 ret = cmd_dump(atol(argv[i+1]), atol(argv[i+2]));
405 if (!strcmp(argv[i], "load") && (i + 1 < argc)) {
406 ret = cmd_load(atol(argv[i+1]));