diff --git a/src/kernel/kmain.c b/src/kernel/kmain.c index abd717c..af17ff3 100644 --- a/src/kernel/kmain.c +++ b/src/kernel/kmain.c @@ -40,7 +40,6 @@ extern void kmain(kernel_info_t *kernel_info){ mlog("KERNEL", "Initializing IDT\n", MLOG_PRINT); idt_load(); pic_init(0x20); - pic_disable(); pic_setmask(0x0, PIC1_DATA); pic_setmask(0x0, PIC2_DATA); diff --git a/src/kernel/system/modules.c b/src/kernel/system/modules.c index 8bd73fa..9669baa 100644 --- a/src/kernel/system/modules.c +++ b/src/kernel/system/modules.c @@ -67,7 +67,8 @@ uint32_t module_api(uint32_t func, ...){ case MODULE_API_READ: vfile_t *file = va_arg(vars, vfile_t *); char *buffer = va_arg(vars, char *); - uint32_t offset = va_arg(vars, uint32_t), count = va_arg(vars, uint32_t); + uint32_t offset = va_arg(vars, uint32_t); + uint32_t count = va_arg(vars, uint32_t); return_value = fread(file, buffer, offset, count); break; case MODULE_API_WRITE: diff --git a/src/kmodules/disk_driver.c b/src/kmodules/disk_driver.c index fbb6626..85bc970 100644 --- a/src/kmodules/disk_driver.c +++ b/src/kmodules/disk_driver.c @@ -201,17 +201,17 @@ int ata_write(vfile_t *file, void *ptr, uint32_t offset, uint32_t count){ uint32_t pages = (count + 4095) / 4096; uint32_t sector_count = pages*8; - api(MODULE_API_PRINT, MODULE_NAME, "pages: %x, scount: %x\n", pages, sector_count); + // api(MODULE_API_PRINT, MODULE_NAME, "pages: %x, scount: %x\n", pages, sector_count); if (sector_count == 0) return -1; for (uint32_t i = 0; i < pages; i++) { prdt[i].address = api(MODULE_API_PADDR, ptr + (i << 12)); // api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x", ptr + (i << 12), api(MODULE_API_PADDR, prdt)); prdt[i].byte_count = 4096; - api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x\n", prdt[i].address, prdt[i].byte_count); + // api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x\n", prdt[i].address, prdt[i].byte_count); prdt[i].reserved = 0; if(i == pages - 1){ prdt[i].reserved = 0x8000; - api(MODULE_API_PRINT, MODULE_NAME, "Reserved: %x\n", prdt[i].reserved); + // api(MODULE_API_PRINT, MODULE_NAME, "Reserved: %x\n", prdt[i].reserved); } } @@ -219,7 +219,7 @@ int ata_write(vfile_t *file, void *ptr, uint32_t offset, uint32_t count){ outb(bm_base + 2, 0x06); outl(bm_base + 4, api(MODULE_API_PADDR, prdt)); uint32_t test = inl(bm_base + 4); - api(MODULE_API_PRINT, MODULE_NAME, "PRDT (Read back from busmaster): %x\n", test); + // api(MODULE_API_PRINT, MODULE_NAME, "PRDT (Read back from busmaster): %x\n", test); outb(bm_base, 0x00); while(!ata_ready(io_base, ctrl_base, drive.flags.slave << 4)); @@ -260,7 +260,7 @@ int ata_write(vfile_t *file, void *ptr, uint32_t offset, uint32_t count){ uint8_t status = inb(ctrl_base); uint8_t bm_status = inb(bm_base + 2); - api(MODULE_API_PRINT, MODULE_NAME, "Status: (ATA)%x, (Busmaster)%x\n", status, bm_status); + // api(MODULE_API_PRINT, MODULE_NAME, "Status: (ATA)%x, (Busmaster)%x\n", status, bm_status); // if(ATA_ABRT(status)){ // puts(api, MODULE_NAME, "Command aborted\n"); // return -1; @@ -288,17 +288,17 @@ int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count) { uint32_t pages = (count + 4095) / 4096; uint32_t sector_count = pages*8; - api(MODULE_API_PRINT, MODULE_NAME, "pages: %x, scount: %x\n", pages, sector_count); + // api(MODULE_API_PRINT, MODULE_NAME, "pages: %x, scount: %x\n", pages, sector_count); if (sector_count == 0) return -1; for (uint32_t i = 0; i < pages; i++) { prdt[i].address = api(MODULE_API_PADDR, ptr + (i << 12)); // api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x", ptr + (i << 12), api(MODULE_API_PADDR, prdt)); prdt[i].byte_count = 4096; - api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x\n", prdt[i].address, prdt[i].byte_count); + // api(MODULE_API_PRINT, MODULE_NAME, "ADDR: %x, Count: %x\n", prdt[i].address, prdt[i].byte_count); prdt[i].reserved = 0; if(i == pages - 1){ prdt[i].reserved = 0x8000; - api(MODULE_API_PRINT, MODULE_NAME, "Reserved: %x\n", prdt[i].reserved); + // api(MODULE_API_PRINT, MODULE_NAME, "Reserved: %x\n", prdt[i].reserved); } } @@ -306,7 +306,7 @@ int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count) { outb(bm_base + 2, 0x06); outl(bm_base + 4, api(MODULE_API_PADDR, prdt)); uint32_t test = inl(bm_base + 4); - api(MODULE_API_PRINT, MODULE_NAME, "PRDT (Read back from busmaster): %x\n", test); + // api(MODULE_API_PRINT, MODULE_NAME, "PRDT (Read back from busmaster): %x\n", test); outb(bm_base, 0x08); while(!ata_ready(io_base, ctrl_base, drive.flags.slave << 4)); @@ -347,7 +347,7 @@ int ata_read(vfile_t *file, uint8_t *ptr, uint32_t offset, uint32_t count) { uint8_t status = inb(ctrl_base); uint8_t bm_status = inb(bm_base + 2); - api(MODULE_API_PRINT, MODULE_NAME, "Status: (ATA)%x, (Busmaster)%x\n", status, bm_status); + // api(MODULE_API_PRINT, MODULE_NAME, "Status: (ATA)%x, (Busmaster)%x\n", status, bm_status); // if(ATA_ABRT(status)){ // puts(api, MODULE_NAME, "Command aborted\n"); // return -1; @@ -368,7 +368,7 @@ cpu_registers_t *int_handler(cpu_registers_t * regs){ uint32_t status = inb(dmabar + 2); outb(dmabar + 2, 0x4); recieved_ints++; - api(MODULE_API_PRINT, MODULE_NAME, "Interrupt called, %x\n", status); + // api(MODULE_API_PRINT, MODULE_NAME, "Interrupt called, %x\n", status); if(status & 2){ api(MODULE_API_PRINT, MODULE_NAME, "Error\n"); @@ -459,7 +459,7 @@ uint8_t ata_identify(uint32_t index, uint16_t disk){ } uint16_t udma_mode = identify[88] & 0xff; uint16_t mdma_mode = identify[63] & 0xff; - api(MODULE_API_PRINT, MODULE_NAME, "DMA Modes\nUDMA: %x\nMDMA: %x\n", udma_mode, mdma_mode); + // api(MODULE_API_PRINT, MODULE_NAME, "DMA Modes\nUDMA: %x\nMDMA: %x\n", udma_mode, mdma_mode); int highest = 0; uint8_t dma = udma_mode != 0 ? udma_mode : mdma_mode; while(dma){ diff --git a/src/kmodules/fs_driver.c b/src/kmodules/fs_driver.c index 2aed643..f7398de 100644 --- a/src/kmodules/fs_driver.c +++ b/src/kmodules/fs_driver.c @@ -1,14 +1,31 @@ #include #include "modlib.h" - +#include "fs_driver.h" #define MODULE_NAME "KIFSM" KOS_MAPI_FP api; +void detect_partitions(vfile_t *file){ + char *buffer = malloc(api, 1); + // buffer[0] = 5; + fread(api, file, buffer, 0, 512); + mbr_t *mbr = buffer; + api(MODULE_API_PRINT, MODULE_NAME, "Magic: %x\n", mbr->magic); + return; +} + void init(KOS_MAPI_FP module_api, uint32_t api_version){ api = module_api; - api(MODULE_API_PRINT, MODULE_NAME, "KIFSM Filesystem Driver Module v0.1.0\nSupported Filesystems:\n"); + vfile_t *disk_dir = fopen(api, "/dev/disk"); + if(disk_dir == 0){ + puts(api, MODULE_NAME, "Could not find /dev/disk\n"); + } + vfile_t **dir_data = disk_dir->access.data.ptr; + for(uint32_t i = 0; dir_data[i]; i++){ + detect_partitions(dir_data[i]); + } + return; } \ No newline at end of file diff --git a/src/kmodules/fs_driver.h b/src/kmodules/fs_driver.h index e69de29..823ba42 100644 --- a/src/kmodules/fs_driver.h +++ b/src/kmodules/fs_driver.h @@ -0,0 +1,21 @@ +#pragma once +#include + +typedef struct partition{ + uint8_t attributes; + uint8_t chs_start[3]; + uint8_t type; + uint8_t chs_end[3]; + uint32_t lba_start; + uint32_t lba_size; +}__attribute__((packed))partition_t; + +#define MBR_MAGIC 0xaa55 + +typedef struct mbr{ + char code[440]; + char id[4]; + char res[2]; + partition_t partitions[4]; + uint16_t magic; +}__attribute__((packed)) mbr_t; \ No newline at end of file