diff --git a/Makefile b/Makefile index f29b99c..82d300d 100644 --- a/Makefile +++ b/Makefile @@ -71,3 +71,7 @@ initrd: umount $(INITRD_MOUNT) rm -rf $(INITRD_MOUNT) + +wordcount: + find . -regex '\(.*\.[ch]\)\|\(.*\.asm\)\|\(.*\.inc\)\|\(.*\.cpp\)' | xargs cat | wc -l + diff --git a/kernel/fs/ext2.c b/kernel/fs/ext2.c index 18808fc..cdacdfa 100644 --- a/kernel/fs/ext2.c +++ b/kernel/fs/ext2.c @@ -63,29 +63,35 @@ int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat) u32_t inode_number = ext2_get_inode_number(mount, file); if (!inode_number) return -1; - ext2_inode_t inode = ext2_get_inode(mount, inode_number); + ext2_inode_t *inode = New(ext2_inode_t); + if ( ext2_read_inode(mount, inode_number, inode) ) + { + kfree(inode); + return -2; + } stat->dev = 0; - switch(inode.i_mode & EXT2_I_MODE_TYPE_MASK) + switch(inode->i_mode & EXT2_I_MODE_TYPE_MASK) { case EXT2_I_MODE_FIFO: stat->type = VFS_FT_FIFO; break; - case EXT2_I_MODE_CHAR: stat->type = VFS_FT_CHAR; stat->dev = inode.i_block[0]; break; + case EXT2_I_MODE_CHAR: stat->type = VFS_FT_CHAR; stat->dev = inode->i_block[0]; break; case EXT2_I_MODE_DIR: stat->type = VFS_FT_DIR; break; - case EXT2_I_MODE_BLOCK: stat->type = VFS_FT_BLOCK; stat->dev = inode.i_block[0]; break; + case EXT2_I_MODE_BLOCK: stat->type = VFS_FT_BLOCK; stat->dev = inode->i_block[0]; break; case EXT2_I_MODE_FILE: stat->type = VFS_FT_FILE; break; case EXT2_I_MODE_SYM: stat->type = VFS_FT_SYMLINK; break; case EXT2_I_MODE_SOCK: stat->type = VFS_FT_SOCK; break; default: stat->type = VFS_FT_UNKNOWN; break; } - stat->size = inode.i_size; + stat->size = inode->i_size; stat->inode = inode_number; - stat->permissions = inode.i_mode & EXT2_I_MODE_ATTR_MASK; - stat->uid = inode.i_uid; - stat->gid = inode.i_gid; - stat->atime = inode.i_atime; - stat->mtime = inode.i_mtime; - stat->ctime = inode.i_ctime; - stat->links = inode.i_links_count; + stat->permissions = inode->i_mode & EXT2_I_MODE_ATTR_MASK; + stat->uid = inode->i_uid; + stat->gid = inode->i_gid; + stat->atime = inode->i_atime; + stat->mtime = inode->i_mtime; + stat->ctime = inode->i_ctime; + stat->links = inode->i_links_count; + kfree(inode); return 0; } @@ -195,11 +201,12 @@ int ext2_close_dir(vfs_mount_t *mount, ext2_open_dir_t *open_dir) // open an inode for reading ext2_open_inode_t *ext2_open_inode(vfs_mount_t *mount, u32_t inode_number) { - if (ext2_inode_status(mount, inode_number) != 1) - return NULL; - ext2_inode_t inode = ext2_get_inode(mount, inode_number); ext2_open_inode_t *open_inode = New(ext2_open_inode_t); - open_inode->inode = inode; + if ( ext2_read_inode(mount, inode_number, &(open_inode->inode)) ) + { + kfree(open_inode); + return NULL; + } open_inode->block = 0; open_inode->block_pointers = NULL; open_inode->block_pointers_start = 0; @@ -342,8 +349,10 @@ u32_t ext2_block_number(vfs_mount_t *mount, ext2_open_inode_t *open_inode) // read the inode structure from the device and return it -ext2_inode_t ext2_get_inode(vfs_mount_t *mount, u32_t inode) +int ext2_read_inode(vfs_mount_t *mount, u32_t inode, ext2_inode_t *dat) { + if (ext2_inode_status(mount, inode) != 1) + return -1; // free or invalid inode number ext2_super_block_t *super = mount->super; inode--; // turn inode into a 0-based index u32_t group = inode / super->s_inodes_per_group; @@ -352,9 +361,9 @@ ext2_inode_t ext2_get_inode(vfs_mount_t *mount, u32_t inode) (10 + super->s_log_block_size)) + (index << 7); void *block = kmalloc(512); block_read(mount->major, mount->minor, inodeAddr >> 9, 1, block); - ext2_inode_t in = *(ext2_inode_t *)(block + (inodeAddr & 0x1FF)); + memcpy(dat, (block + (inodeAddr & 0x1FF)), sizeof(ext2_inode_t)); kfree(block); - return in; + return 0; } // read the group descriptor structure from the device and return it @@ -370,6 +379,18 @@ ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group) } +// TODO: finish allocating an inode +u32_t ext2_alloc_inode(vfs_mount_t *mount) +{ + ext2_super_block_t *super = mount->super; + if (!super->s_free_inodes_count) + return 0; // no free inodes + +} + +/***************** VFS INTERFACE FUNCTIONS *******************/ + + // VFS interface function to open a directory int ext2__open_dir(vfs_mount_t *mount, char *file, vfs_open_file_t *dir) { @@ -402,16 +423,19 @@ int ext2__close_dir(vfs_mount_t *mount, vfs_open_file_t *dir) } +// VFS interface function to open a file for reading a byte at a time int ext2__open_file(vfs_mount_t *mount, char *file, vfs_open_file_t *open_file) { return 0; } +// VFS interface function to read a byte from an open file int ext2__read_file(vfs_mount_t *mount, vfs_open_file_t *open_file) { return 0; } +// VFS interface function to close a byte-file int ext2__close_file(vfs_mount_t *mount, vfs_open_file_t *open_file) { return 0; diff --git a/kernel/fs/ext2.h b/kernel/fs/ext2.h index 16995aa..09bc164 100644 --- a/kernel/fs/ext2.h +++ b/kernel/fs/ext2.h @@ -184,7 +184,7 @@ static inline u32_t ext2_FSToDiskBlock(u32_t block, ext2_super_block_t *super) int ext2_init(int fsID); void *ext2_mount_super(major_t major, minor_t minor); int ext2_umount_super(vfs_mount_t *mount); -ext2_inode_t ext2_get_inode(vfs_mount_t *mount, u32_t inode); +int ext2_read_inode(vfs_mount_t *mount, u32_t inode, ext2_inode_t *dat); ext2_group_desc_t ext2_get_group_desc(vfs_mount_t *mount, u32_t group); int ext2_stat(vfs_mount_t *mount, char *file, vfs_stat_t *stat); ext2_open_inode_t *ext2_open_inode(vfs_mount_t *mount, u32_t inode_number); @@ -195,6 +195,8 @@ u32_t ext2_get_inode_number(vfs_mount_t *mount, char *file); int ext2_inode_seek(vfs_mount_t *mount, ext2_open_inode_t *open_inode, u32_t block_number); int ext2_inode_status(vfs_mount_t *mount, u32_t inode_number); int ext2_block_status(vfs_mount_t *mount, u32_t block_number); +u32_t ext2_alloc_inode(vfs_mount_t *mount); + ext2_open_dir_t *ext2_open_dir(vfs_mount_t *mount, u32_t inode_number); int ext2_dir_read_entry(vfs_mount_t *mount, ext2_open_dir_t *open_dir, ext2_dir_entry_t *dentry); diff --git a/make.grc b/make.grc new file mode 100644 index 0000000..b8a9385 --- /dev/null +++ b/make.grc @@ -0,0 +1,18 @@ +regexp=.*In.function.* +colours=green +- +regexp=.*warning\:.* +colours=yellow +- +regexp=In.file.included.* +colours=green +- +regexp=\s*from.*\:\s* +colours=green +- +regexp=.*error\:.* +colours=red +- +regexp=.*\*\*\*.* +colours=red + diff --git a/rmmod/rmmod.asm b/rmmod/rmmod.asm index f93d146..957a799 100644 --- a/rmmod/rmmod.asm +++ b/rmmod/rmmod.asm @@ -34,11 +34,7 @@ start_refreshed: call con_clear - mov ax, 0x4F00 - mov di, vbe_info_block - int 0x10 - cmp ax, 0x004F - jz vesa_present +; ccall vesa_get_info, es, vbe_info_block jmp no_vesa vesa_present: @@ -165,3 +161,5 @@ OemVendorName: dd 0 OemProductName: dd 0 OemProductRev: dd 0 Reserved: times 478 db 0 + + diff --git a/rmmod/vesa.inc b/rmmod/vesa.inc new file mode 100644 index 0000000..76bee2d --- /dev/null +++ b/rmmod/vesa.inc @@ -0,0 +1,33 @@ +; vesa.inc +; Author: Josh Holtrop +; Date: 01/04/05 +; Modified: 01/04/05 +; real mode vesa functions + +vesa_get_info: ;vesa_get_info(word seg, word offset) + push bp + mov bp, sp + pusha + + mov ax, [bp + 4] + mov es, ax + mov di, [bp + 6] + mov ax, 0x4F00 + int 0x10 + cmp ax, 0x004F + jz vesa_got_info + + mov [vesa_return], word 1 + jmp vesa_get_info_done + +vesa_got_info: + mov [vesa_return], word 0 + +vesa_got_info_done: + popa + pop bp + mov ax, [vesa_return] + ret + + +vesa_return: dw 0