From 050434982244c09918bdfe9e7765774f75e7853e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Lov=C3=A9n?= Date: Sat, 1 Apr 2017 23:18:51 +0200 Subject: [PATCH] WIP - ATA fixes --- kernel/boot/kmain.c | 2 +- kernel/drivers/ata.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/kernel/boot/kmain.c b/kernel/boot/kmain.c index ba5f59c..cb9845c 100644 --- a/kernel/boot/kmain.c +++ b/kernel/boot/kmain.c @@ -28,6 +28,7 @@ int kmain(uint64_t multiboot_magic, void *multiboot_data) pmm_init(); cpu_init(); pit_init(); + asm("sti"); debug_info("Syscall enabled:%d\n", CPUID_FEATURE_SYSCALL); @@ -45,7 +46,6 @@ int kmain(uint64_t multiboot_magic, void *multiboot_data) thread_t *th = exec_elf(p1, mboot_data.init, args, env); scheduler_insert(th); - asm("sti"); debug_info("BOOT COMPLETE\n"); schedule(); debug_error("PANIC - This line should be unreachable (%s:%d)\n", __FILE__, __LINE__); diff --git a/kernel/drivers/ata.c b/kernel/drivers/ata.c index b6606d2..5885063 100644 --- a/kernel/drivers/ata.c +++ b/kernel/drivers/ata.c @@ -19,9 +19,8 @@ int ata_wait_status(int bus) return inb(ATA_STATUS(bus)); } -int ata_send_command(ata_cmd_t *cmd, int wait) +int ata_send_command(ata_cmd_t *cmd) { - (void)wait; outb(ATA_DEVICE(cmd->bus), cmd->device | (cmd->lba_sep[3] & 0xF)); ata_wait_status(cmd->bus); @@ -82,7 +81,7 @@ void init_drive(ata_drive *drive) drive->atapi = 1; command.command = ATA_CMD_IDENTIFY_PACKET; } - if(!ata_send_command(&command, 1)) + if(!ata_send_command(&command)) return; // Read IDENTIFY information @@ -109,7 +108,7 @@ int ata_read_block(ata_drive *drive, uint64_t lba, void *buffer) .command = ATA_CMD_READ_SECTORS, }; - int status = ata_send_command(&command,0); + int status = ata_send_command(&command); if(status & (ATA_DF | ATA_ERR) || !(status & ATA_DRQ)) { retries--; @@ -136,7 +135,11 @@ int ata_write_block(ata_drive *drive, uint64_t lba, void *buffer) .device = 0xE0 | drive->ms | ((lba >> 24) & 0xF), .command = ATA_CMD_WRITE_SECTORS, }; - ata_send_command(&command, 0); + int status = ata_send_command(&command); + if(status & ATA_ERR) + { + debug_error("An error occurred\n"); + } uint16_t *buf = buffer; for(int i=0; i<256; i++) {