diff --git a/init/init.c b/init/init.c index 7bc1a3c..55f0d5d 100644 --- a/init/init.c +++ b/init/init.c @@ -8,6 +8,23 @@ int main(int argc, char **argv) (void) argv; + FILE *fp = fopen("/dev/sda", "r+"); + char *buffer = malloc(512); + + fread(buffer, 512, 1, fp); + printf("Read: %hhx %hhx %hhx %hhx\n", buffer[0], buffer[1], buffer[510], buffer[511]); + + buffer[511] ^= 0x1; + fseek(fp, 0, SEEK_SET); + fwrite(buffer, 512, 1, fp); + fclose(fp); + + fp = fopen("/dev/sda", "r"); + fread(buffer, 512, 1, fp); + printf("Read: %hhx %hhx %hhx %hhx\n", buffer[0], buffer[1], buffer[510], buffer[511]); + fclose(fp); + + for(;;); return 0; } diff --git a/kernel/boot/kmain.c b/kernel/boot/kmain.c index 29cabad..ba5f59c 100644 --- a/kernel/boot/kmain.c +++ b/kernel/boot/kmain.c @@ -34,7 +34,7 @@ int kmain(uint64_t multiboot_magic, void *multiboot_data) fs_mount(0, "/"); fs_mount(&debug_file, "/dev/debug"); - ata_init(); + ata_fs_init(); fs_write(&debug_file, "TESTING DEBUG FILE", 18, 0); diff --git a/kernel/fs/ata_fs.c b/kernel/fs/ata_fs.c new file mode 100644 index 0000000..8ebbfed --- /dev/null +++ b/kernel/fs/ata_fs.c @@ -0,0 +1,88 @@ +#include +#include +#include +#include +#include + +size_t ata_read(file_t *file, void *buffer, size_t nbyte, size_t offset) +{ + ata_drive *drv = file->data; + if(!drv->exists) + return 0; + + uint64_t blocksize = 512; + char blk_buf[blocksize]; + char *out_buf = buffer; + + size_t count = 0; + while(count < nbyte) + { + uint64_t block = offset/blocksize; + uint64_t bloff = offset%blocksize; + uint64_t len = (nbyte-count > blocksize-bloff)?blocksize-bloff:nbyte-count; + + if(len == blocksize) + { + ata_read_block(drv, block, &out_buf[count]); + } else { + ata_read_block(drv, block, blk_buf); + memcpy(&out_buf[count], &blk_buf[bloff], len); + } + + count += len; + offset += len; + } + return count; +} + +size_t ata_write(file_t *file, void *buffer, size_t nbyte, size_t offset) +{ + ata_drive *drv = file->data; + if(!drv->exists) + return 0; + + uint64_t blocksize = 512; + char blk_buf[blocksize]; + char *in_buf = buffer; + + size_t count = 0; + while(count < nbyte) + { + uint64_t block = offset/blocksize; + uint64_t bloff = offset%blocksize; + uint64_t len = (nbyte-count > blocksize-bloff)?blocksize-bloff:nbyte-count; + + if(len == blocksize) + { + ata_write_block(drv, block, &in_buf[count]); + } else { + ata_read_block(drv, block, blk_buf); + memcpy(&blk_buf[bloff], &in_buf[count], len); + ata_write_block(drv, block, blk_buf); + } + + count += len; + offset += len; + } + return count; +} + +fs_driver_t ata_fs = { + .read = ata_read, + .write = ata_write, +}; + +void ata_fs_init() +{ + ata_init(); + file_t *files = kcalloc(4, sizeof(file_t)); + char path[] = "/dev/sdX"; + for(int i=0; i<4; i++) + { + files[i].type = FS_FILE; + files[i].driver = &ata_fs; + files[i].data = &drives[i]; + path[strlen(path)-1] = 'a' + i; + fs_mount(&files[i], path); + } +} diff --git a/kernel/include/vfs.h b/kernel/include/vfs.h index 11f0402..508baf2 100644 --- a/kernel/include/vfs.h +++ b/kernel/include/vfs.h @@ -60,3 +60,5 @@ file_t *fs_namef(const char *path); file_t debug_file; int pipe(file_t **reader, file_t **writer); + +void ata_fs_init();