📄 devtest.c
字号:
/* Copyright (C) 2005 David Decotigny This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */#include <crt.h>#include <libc.h>#include <stdarg.h>#include <string.h>#include <debug.h>#include "fstest_utils.h"/** * @file devtest.c * * Block/character devices tests */int main(){ int fd, len; unsigned int sum, mem_size; char buff[256]; char *uaddr; bochs_printf("Hi from devtest\n"); /* Make things more complicated */ fork(); fork(); /* * /dev/zero */ TEST_EXPECT_CONDITION(fd = open("/dev/zero", O_RDWR), RETVAL == 3); /* Make things more complicated: spawn and stay in child */ if (fork() > 0) return 0; strzcpy(buff, "Garbage", sizeof(buff)); TEST_EXPECT_CONDITION(len = read(fd, buff, sizeof(buff)), RETVAL == sizeof(buff)); /* Make sure it is full with 0 */ for (len = 0 ; len < sizeof(buff) ; len ++) if (buff[len]) break; TEST_EXPECT_CONDITION(len, RETVAL == sizeof(buff)); TEST_EXPECT_CONDITION(len = write(fd, 0, 123456789), RETVAL == 123456789); TEST_EXPECT_CONDITION(len = lseek(fd, 1234, SEEK_SET), RETVAL == 1234); /* Map it once */ TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192, PROT_READ | PROT_WRITE, 0, fd, 4096), RETVAL != (int)NULL); /* Make sure it is full with 0 */ for (len = 0 ; len < 8192 ; len ++) if (uaddr[len]) break; TEST_EXPECT_CONDITION(len, RETVAL == 8192); strzcpy(uaddr, "Hello /dev/zero", 8192); TEST_EXPECT_CONDITION(strcmp(uaddr, "Hello /dev/zero"), RETVAL == 0); /* Map it again */ TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192, PROT_READ | PROT_WRITE, 0, fd, 4096), RETVAL != (int)NULL); /* Make sure it is full with 0 */ for (len = 0 ; len < 8192 ; len ++) if (uaddr[len]) break; TEST_EXPECT_CONDITION(len, RETVAL == 8192); strzcpy(uaddr, "Hello /dev/zero", 8192); TEST_EXPECT_CONDITION(strcmp(uaddr, "Hello /dev/zero"), RETVAL == 0); TEST_EXPECT_CONDITION(close(fd), RETVAL == 0); /* * /dev/null */ TEST_EXPECT_CONDITION(fd = open("/dev/null", O_RDWR), RETVAL == 3); /* Make things more complicated: spawn and stay in child */ if (fork() > 0) return 0; strzcpy(buff, "Garbage", sizeof(buff)); TEST_EXPECT_CONDITION(len = read(fd, buff, sizeof(buff)), RETVAL == 0); /* Make sure buffer did not change */ TEST_EXPECT_CONDITION(strcmp("Garbage", buff), RETVAL == 0); TEST_EXPECT_CONDITION(len = write(fd, 0, 123456789), RETVAL == 123456789); TEST_EXPECT_CONDITION(len = lseek(fd, 1234, SEEK_SET), RETVAL == 1234); /* Map it once */ TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192, PROT_READ | PROT_WRITE, 0, fd, 4096), RETVAL != (int)NULL); /* Make sure it is full with 0 */ for (len = 0 ; len < 8192 ; len ++) if (uaddr[len]) break; TEST_EXPECT_CONDITION(len, RETVAL == 8192); strzcpy(uaddr, "Hello /dev/null", 8192); TEST_EXPECT_CONDITION(strcmp(uaddr, "Hello /dev/null"), RETVAL == 0); /* Map it again */ TEST_EXPECT_CONDITION(uaddr = mmap(NULL, 8192, PROT_READ | PROT_WRITE, 0, fd, 4096), RETVAL != (int)NULL); /* Make sure it is full with 0 */ for (len = 0 ; len < 8192 ; len ++) if (uaddr[len]) break; TEST_EXPECT_CONDITION(len, RETVAL == 8192); strzcpy(uaddr, "Hello /dev/null", 8192); TEST_EXPECT_CONDITION(strcmp(uaddr, "Hello /dev/null"), RETVAL == 0); TEST_EXPECT_CONDITION(close(fd), RETVAL == 0); /* * Invalid device instance of zero.c */ TEST_EXPECT_CONDITION(mknod("/dev/invalid_zero", S_IRUSR | S_IWUSR, S_IFCHR, 1, 42), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(fd = open("/dev/invalid_zero", O_RDWR), RETVAL < 0); TEST_EXPECT_CONDITION(unlink("/dev/invalid_zero"), RETVAL == 0); /* * Invalid device class / device instance */ TEST_EXPECT_CONDITION(mknod("/dev/invalid_devclass", S_IRUSR | S_IWUSR, S_IFCHR, 54654, 476576), RETVAL == 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(fd = open("/dev/invalid_devclass", O_RDWR), RETVAL < 0); TEST_EXPECT_CONDITION(unlink("/dev/invalid_devclass"), RETVAL == 0); /* * Test Block devices */ TEST_EXPECT_CONDITION(fd = open("/dev/hda", O_RDONLY), RETVAL < 0); ls("/", 1, 1); TEST_EXPECT_CONDITION(close(fd), RETVAL < 0); /* * Make a checksum of all physical memory (/dev/mem) */ TEST_EXPECT_CONDITION(fd = open("/dev/mem", O_RDONLY), RETVAL == 3); /* Make things more complicated: spawn and stay in child */ if (fork() > 0) return 0; for (mem_size = 0, sum = 0 ; len = read(fd, buff, sizeof(buff)), len > 0 ; mem_size += len) { char *c; if (((mem_size / sizeof(buff)) % 4000) == 0) printf("Read %d MB of physical memory\n", mem_size >> 20); for (c = buff ; c - buff < len ; c++) sum += *c; } TEST_EXPECT_CONDITION(mem_size, RETVAL > 0); printf("Checkum of RAM (%d MB) is %x\n", mem_size >> 20, sum); TEST_EXPECT_CONDITION(len = lseek(fd, 0, SEEK_SET), len == 0); TEST_EXPECT_CONDITION(len = lseek(fd, 0, SEEK_END), len == mem_size); TEST_EXPECT_CONDITION(close(fd), RETVAL == 0); /* * Make a checksum of main kernel memory (/dev/kmem) */ TEST_EXPECT_CONDITION(fd = open("/dev/kmem", O_RDONLY), RETVAL == 3); /* Make things more complicated: spawn and stay in child */ if (fork() > 0) return 0; /* Seek to beginning of main .text section */ TEST_EXPECT_CONDITION(lseek(fd, 0x201000, SEEK_SET), RETVAL == 0x201000); for (mem_size = 0, sum = 0 ; len = read(fd, buff, sizeof(buff)), len > 0 ; mem_size += len) { char *c; if (((mem_size / sizeof(buff)) % 400) == 0) printf("Read %d kB of kernel memory\n", mem_size >> 10); for (c = buff ; c - buff < len ; c++) sum += *c; } TEST_EXPECT_CONDITION(mem_size, RETVAL > 0); printf("Checkum of main kernel area (%d kB) is %x\n", mem_size >> 10, sum); TEST_EXPECT_CONDITION(len = lseek(fd, 0, SEEK_SET), len == 0); TEST_EXPECT_CONDITION(len = lseek(fd, 0, SEEK_END), len == 0x40000000); TEST_EXPECT_CONDITION(close(fd), RETVAL == 0); printf("Bye from devtest\n"); ls("/", 1, 1); /* Crash the whole kernel */ bochs_printf("[31;1mNOW Crashing the whole thing !...[m\n"); { int i; for (i = 5 ; i >= 0 ; i --) { printf("Crashing the whole thing in %ds !... \r", i); sleep(1); } } printf("\nGO !\n"); TEST_EXPECT_CONDITION(fd = open("/dev/mem", O_WRONLY), RETVAL == 3); memset(buff, 0xcc, sizeof(buff)); while (write(fd, buff, sizeof(buff))) continue; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -