diff --git a/kernel/drivers/atapi/ata.c b/kernel/drivers/ide/ide.c similarity index 76% rename from kernel/drivers/atapi/ata.c rename to kernel/drivers/ide/ide.c index c6b5f39..300316e 100644 --- a/kernel/drivers/atapi/ata.c +++ b/kernel/drivers/ide/ide.c @@ -1,4 +1,4 @@ -#include "drivers/atapi/ata.h" +#include "ide.h" #include "lib/print.h" @@ -60,18 +60,7 @@ static int wait_not_bsy_drq(uint16_t bus) { return 0; } -static int ide_irq_invoked = 0; -static void ide_irq_wait() { - while (!ide_irq_invoked) - ; - ide_irq_invoked = 0; -} - -void ide_invoke_irq() { - ide_irq_invoked = 1; -} - -int select_drive(uint16_t bus, uint8_t drive) { +static int select_drive(uint16_t bus, uint8_t drive) { if (bus == IDE_PRIMARY_IO_BASE && selected_drive_primary == drive) { return 1; } @@ -105,7 +94,7 @@ int select_drive(uint16_t bus, uint8_t drive) { return 1; } -void ident_device(uint16_t bus, uint8_t drive, uint32_t slot) { +static void ident_device(uint16_t bus, uint8_t drive, uint32_t slot) { ide_dev_type type = NO_DEVICE; uint8_t stat = inb(bus + IO_STATUS_REG); @@ -176,24 +165,10 @@ void ident_device(uint16_t bus, uint8_t drive, uint32_t slot) { } else { ide_devices[slot].size = *(uint32_t*)(ide_info_buffer + ATA_IDENT_MAX_LBA); } - - char* serial_buf = (char*)(ide_info_buffer + ATA_IDENT_SERIAL); - fix_ata_string(serial_buf, 8); - // ide_devices[slot].serial = serial_buf; - - char* model_buf = (char*)(ide_info_buffer + ATA_IDENT_MODEL); - fix_ata_string(model_buf, ATA_IDENT_MODEL_SZ); - // ide_devices[slot].model = model_buf; - - kprintf("Found device 0x%x on bus 0x%x:\n", drive, bus); - kprintf("\tModel Number: %s\n", model_buf); - kprintf("\tSerial Number: %s\n", serial_buf); - kprintf("\tSize %dB\n", *(uint32_t*)(ide_info_buffer + ATA_IDENT_MAX_LBA)); } -uint8_t temp_sector_buf[2048]; -void atapi_read_sector(uint8_t drive_num, uint32_t lba, uint32_t sectors, void* buf) { - ide_device_t drive = ide_devices[drive_num]; +static int atapi_read_sector(ide_device_t* dev, uint32_t lba, uint32_t sectors, void* buf) { + ide_device_t drive = *dev; // enable irqs uint16_t ctrl_reg = fetch_ctrl_reg(drive.bus); @@ -214,7 +189,7 @@ void atapi_read_sector(uint8_t drive_num, uint32_t lba, uint32_t sectors, void* pkt[11] = 0x0; if (!select_drive(drive.bus, drive.device)) { - return; + return 0; } outb(drive.bus + IO_FEATURE_REG, 0x00); // PIO mode @@ -224,42 +199,41 @@ void atapi_read_sector(uint8_t drive_num, uint32_t lba, uint32_t sectors, void* outb(drive.bus + IO_LBA_HI_REG, (words * 2) >> 8); outb(drive.bus + IO_CMD_REG, ATA_CMD_PACKET); + // poll for drq int err = wait_not_bsy_drq(drive.bus); if (err) { - kprintf("failed sending ata packet command\n"); - return; + return 0; } + outsw(drive.bus + IO_DATA_REG, pkt, 6); uint32_t ptr = (uint32_t)buf; for (int i = 0; i < sectors; i++) { - ide_irq_wait(); err = wait_not_bsy_drq(drive.bus); if (err) { - kprintf("failed reading atapi sector\n"); - return; + return 0; } insw(drive.bus + IO_DATA_REG, (void*)ptr, 1024); ptr += 2048; } - ide_irq_wait(); - while(inb(drive.bus + IO_STATUS_REG) & (STATUS_REG_BSY | STATUS_REG_DRQ)); - - kprintf("read %d sectors from drive %d\n", sectors, drive_num); + return 1; } void scan_drives() { ident_device(IDE_SECONDARY_IO_BASE, IDE_DRIVE_MASTER, 0); - - ide_device_t boot_drive = ide_devices[0]; +} - if (!(boot_drive.capabilities & 0x200)) { - kprintf("boot drive does not support LBA addressing"); - return; +ide_device_t* get_device(uint8_t slot) { + if (slot > 3) return NULL; + return &ide_devices[slot]; +} + +int ide_read_blks(ide_device_t* dev, uint32_t lba, uint32_t sectors, void* buf) { + if (dev->type == ATAPI) { + return atapi_read_sector(dev, lba, sectors, buf); } - - atapi_read_sector(0, 16, 1, temp_sector_buf); + return 0; } \ No newline at end of file diff --git a/kernel/drivers/atapi/ata.h b/kernel/drivers/ide/ide.h similarity index 95% rename from kernel/drivers/atapi/ata.h rename to kernel/drivers/ide/ide.h index 97674fb..9829246 100644 --- a/kernel/drivers/atapi/ata.h +++ b/kernel/drivers/ide/ide.h @@ -114,11 +114,9 @@ typedef struct __attribute__((packed)) { uint32_t size; } ide_device_t; -int select_drive(uint16_t bus, uint8_t drive); -void ident_device(uint16_t bus, uint8_t drive, uint32_t slot); void scan_drives(); - -void ide_invoke_irq(); +ide_device_t* get_device(uint8_t slot); +int ide_read_blks(ide_device_t* dev, uint32_t lba, uint32_t sectors, void* buf); #endif diff --git a/kernel/drivers/iso/iso.c b/kernel/drivers/iso/iso.c new file mode 100644 index 0000000..104747b --- /dev/null +++ b/kernel/drivers/iso/iso.c @@ -0,0 +1,40 @@ +#include "iso.h" + +#include "drivers/ide/ide.h" + +#include "lib/print.h" +#include "lib/memory.h" + +uint8_t sector_buf[2048]; +void read_iso(ide_device_t* dev) { + kprintf("Reading ISO Filesystem from CDROM Disk\n"); + + ide_read_blks(dev, 16, 1, sector_buf); + if (sector_buf[0] != 1) { + kprintf("Couldn't find PVD\n"); + return; + } + + iso_pvd_t pvd = *(iso_pvd_t*)sector_buf; + + char pvd_identifier[6]; + memcpy(pvd.header.identifier, pvd_identifier, 5); + pvd_identifier[5] = 0; + + if (strcmp(pvd_identifier, "CD001") > 0) { + kprintf("Invalid PVD identifier\n"); + return; + } + + char system_identifier[33]; + memcpy(&pvd.sys_ident[0], system_identifier, 32); + system_identifier[32] = 0; + if (strlen(system_identifier) > 0) { + kprintf("System Identifier: %s\n", system_identifier); + } + + char volume_identifier[33]; + memcpy(&pvd.volume_ident[0], volume_identifier, 32); + volume_identifier[32] = 0; + kprintf("Volume Identifier: %s\n", volume_identifier); +} \ No newline at end of file diff --git a/kernel/drivers/iso/iso.h b/kernel/drivers/iso/iso.h new file mode 100644 index 0000000..07125ac --- /dev/null +++ b/kernel/drivers/iso/iso.h @@ -0,0 +1,33 @@ +#ifndef KISO_H +#define KISO_H + +#include "drivers/ide/ide.h" + +typedef struct __attribute__((packed)) { + uint8_t type; + char identifier[5]; + uint8_t version; +} vd_header_t; + +typedef struct __attribute__((packed)) { + vd_header_t header; + uint8_t unused; + uint8_t sys_ident[32]; + uint8_t volume_ident[32]; + uint8_t unused_1[8]; + uint32_t volume_space_sz_le; + uint32_t volume_space_sz_be; + uint8_t unused_2[32]; + uint16_t vol_set_sz_le; + uint16_t vol_set_sz_be; + uint16_t vol_seq_num_le; + uint16_t vol_seq_num_be; + uint16_t logical_blk_sz_le; + uint16_t logical_blk_sz_be; + uint32_t path_table_sz_le; + uint32_t path_table_sz_be; +} iso_pvd_t; + +void read_iso(ide_device_t* dev); + +#endif \ No newline at end of file diff --git a/kernel/interrupts.c b/kernel/interrupts.c index 74c871d..cae5f95 100644 --- a/kernel/interrupts.c +++ b/kernel/interrupts.c @@ -1,8 +1,6 @@ #include "lib/print.h" #include -#include "drivers/atapi/ata.h" - extern void send_eoi_master(void); extern void send_eoi_slave(void); extern uint8_t read_isr_master(void); @@ -71,14 +69,10 @@ void common_interrupt_handler(struct registers *args) { break; } case 46: { // IDE PRIMARY - kprintf("got interrupt\n"); - ide_invoke_irq(); send_eoi_slave(); break; } case 47: { // IDE SLAVE - kprintf("got interrupt\n"); - ide_invoke_irq(); send_eoi_slave(); break; } diff --git a/kernel/lib/memory.c b/kernel/lib/memory.c new file mode 100644 index 0000000..d51209c --- /dev/null +++ b/kernel/lib/memory.c @@ -0,0 +1,24 @@ +#include "memory.h" + +void memcpy(const void* src, void* dst, size_t sz) { + for (size_t i = 0; i < sz; i++) { + ((uint8_t*)dst)[i] = ((uint8_t*)src)[i]; + } +} + +int strcmp(const char* s1, const char* s2) { + while (*s1 && (*s1 == *s2)) { + s1++; + s2++; + } + return *(const uint8_t*)s1 - *(const uint8_t*)s2; +} + +int strlen(const char* str) { + int len = 0; + while(*str != 0) { + str++; + len++; + } + return len; +} \ No newline at end of file diff --git a/kernel/lib/memory.h b/kernel/lib/memory.h new file mode 100644 index 0000000..df8a8f5 --- /dev/null +++ b/kernel/lib/memory.h @@ -0,0 +1,13 @@ +#ifndef KMEMORY_H +#define KMEMORY_H + +#include +#include + +void memcpy(const void* src, void* dst, size_t sz); +void memset(const void* dst, uint8_t val, size_t sz); + +int strcmp(const char *s1, const char *s2); +int strlen(const char* str); + +#endif \ No newline at end of file