From e6dc668a3f92906c8f8184722d926cc65c07887a Mon Sep 17 00:00:00 2001 From: Alexander Myltsev Date: Wed, 30 Nov 2022 14:48:13 +0000 Subject: [PATCH] Disable -Os; reformat ata.c. --- Makefile | 14 ++++++- drivers/ata.c | 104 ++++++++++++++++++++++++-------------------------- 2 files changed, 61 insertions(+), 57 deletions(-) diff --git a/Makefile b/Makefile index d139caf..a6c0ceb 100644 --- a/Makefile +++ b/Makefile @@ -8,12 +8,15 @@ GDB=x86_64-elf-gdb endif CFLAGS = -fno-pic -ffreestanding -static -fno-builtin -fno-strict-aliasing \ - -Os -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer + -Wall -ggdb -m32 -Werror -fno-omit-frame-pointer CFLAGS += $(shell $(CC) -fno-stack-protector -E -x c /dev/null >/dev/null 2>&1 && echo -fno-stack-protector) run: image.bin qemu-system-i386 -drive format=raw,file=$< -serial mon:stdio +run-nox: image.bin + qemu-system-i386 -nographic -drive format=raw,file=$< -serial mon:stdio + debug-preboot-nox: image.bin mbr.elf qemu-system-i386 -nographic -drive format=raw,file=$< -s -S & $(GDB) mbr.elf \ @@ -36,6 +39,13 @@ debug: image.bin -ex "break _start" \ -ex "continue" +debug-nox: image.bin + qemu-system-i386 -nographic -drive format=raw,file=$< -s -S & + $(GDB) kernel.bin \ + -ex "target remote localhost:1234" \ + -ex "break _start" \ + -ex "continue" + fs.img: kernel.bin tools/mkfs user/false tools/mkfs $@ $< @@ -64,7 +74,7 @@ mbr.elf: mbr.o $(LD) -m elf_i386 -Ttext=0x7c00 $^ -o $@ clean: - rm -f *.elf *.img *.bin *.o */*.o tools/mkfs + rm -f *.elf *.img *.bin *.o */*.o tools/mkfs user/false tools/%: tools/%.c gcc -Wall -Werror -g $^ -o $@ diff --git a/drivers/ata.c b/drivers/ata.c index 5abee68..13e9889 100644 --- a/drivers/ata.c +++ b/drivers/ata.c @@ -1,80 +1,74 @@ -// stolen from https://github.com/dhavalhirdhav/LearnOS/blob/master/drivers/ata/ata.c +// stolen from +// https://github.com/dhavalhirdhav/LearnOS/blob/master/drivers/ata/ata.c + +#include "ata.h" #include -#include "ata.h" #include "port.h" -/* - BSY: a 1 means that the controller is busy executing a command. No register should be accessed (except the digital output register) while this bit is set. -RDY: a 1 means that the controller is ready to accept a command, and the drive is spinning at correct speed.. -WFT: a 1 means that the controller detected a write fault. -SKC: a 1 means that the read/write head is in position (seek completed). -DRQ: a 1 means that the controller is expecting data (for a write) or is sending data (for a read). Don't access the data register while this bit is 0. -COR: a 1 indicates that the controller had to correct data, by using the ECC bytes (error correction code: extra bytes at the end of the sector that allows to verify its integrity and, sometimes, to correct errors). -IDX: a 1 indicates the the controller retected the index mark (which is not a hole on hard-drives). -ERR: a 1 indicates that an error occured. An error code has been placed in the error register. -*/ - #define STATUS_BSY 0x80 #define STATUS_RDY 0x40 #define STATUS_DRQ 0x08 -#define STATUS_DF 0x20 +#define STATUS_DF 0x20 #define STATUS_ERR 0x01 -//This is really specific to our OS now, assuming ATA bus 0 master -//Source - OsDev wiki +// This is really specific to our OS now, assuming ATA bus 0 master +// Source - OsDev wiki https://wiki.osdev.org/ATA_PIO_Mode + static void ATA_wait_BSY(); -static void ATA_wait_DRQ(); +static void ATA_wait_RDY(); + void read_sectors_ATA_PIO(uint32_t target_address, uint32_t LBA, uint8_t sector_count) { + ATA_wait_BSY(); + port_byte_out(0x1F6, 0xE0 | ((LBA >> 24) & 0xF)); + port_byte_out(0x1F2, sector_count); + port_byte_out(0x1F3, (uint8_t)LBA); + port_byte_out(0x1F4, (uint8_t)(LBA >> 8)); + port_byte_out(0x1F5, (uint8_t)(LBA >> 16)); + port_byte_out(0x1F7, 0x20); // Send the read command - ATA_wait_BSY(); - port_byte_out(0x1F6, 0xE0 | ((LBA >>24) & 0xF)); - port_byte_out(0x1F2, sector_count); - port_byte_out(0x1F3, (uint8_t) LBA); - port_byte_out(0x1F4, (uint8_t)(LBA >> 8)); - port_byte_out(0x1F5, (uint8_t)(LBA >> 16)); - port_byte_out(0x1F7, 0x20); //Send the read command + uint16_t *target = (uint16_t *)target_address; - uint16_t *target = (uint16_t*) target_address; - - for (int j = 0; j < sector_count; j++) - { - ATA_wait_BSY(); - ATA_wait_DRQ(); - for(int i = 0; i < 256; i++) - target[i] = port_word_in(0x1F0); - target += 256; - } + for (int j = 0; j < sector_count; j++) + { + ATA_wait_BSY(); + ATA_wait_RDY(); + for (int i = 0; i < 256; i++) + target[i] = port_word_in(0x1F0); + target += 256; + } } -void write_sectors_ATA_PIO(uint32_t LBA, uint8_t sector_count, uint32_t* bytes) +void write_sectors_ATA_PIO(uint32_t LBA, uint8_t sector_count, uint32_t *bytes) { - ATA_wait_BSY(); - port_byte_out(0x1F6,0xE0 | ((LBA >>24) & 0xF)); - port_byte_out(0x1F2,sector_count); - port_byte_out(0x1F3, (uint8_t) LBA); - port_byte_out(0x1F4, (uint8_t)(LBA >> 8)); - port_byte_out(0x1F5, (uint8_t)(LBA >> 16)); - port_byte_out(0x1F7,0x30); //Send the write command + ATA_wait_BSY(); + port_byte_out(0x1F6, 0xE0 | ((LBA >> 24) & 0xF)); + port_byte_out(0x1F2, sector_count); + port_byte_out(0x1F3, (uint8_t)LBA); + port_byte_out(0x1F4, (uint8_t)(LBA >> 8)); + port_byte_out(0x1F5, (uint8_t)(LBA >> 16)); + port_byte_out(0x1F7, 0x30); // Send the write command - for (int j =0;j