From 5da2476852f5f70bd10f8640c80f9d5ce3fb1bac Mon Sep 17 00:00:00 2001 From: Tom-on64 Date: Thu, 11 Apr 2024 12:25:38 +0200 Subject: [PATCH] Fixed diskRead() function and made it follow the defined standards. \nAlso made a temp fix to the disk.c issue (it's something about the disk.o obj file idk --- build.sh | 7 ++++--- src/kernel/disk.c | 31 +++++++++++++++++++++++++++++++ src/kernel/disk.h | 4 ++-- src/kernel/f_disk.c | 27 --------------------------- 4 files changed, 37 insertions(+), 32 deletions(-) create mode 100644 src/kernel/disk.c delete mode 100644 src/kernel/f_disk.c diff --git a/build.sh b/build.sh index 5595d9c..96cad86 100644 --- a/build.sh +++ b/build.sh @@ -12,14 +12,15 @@ nasm -fbin ./src/boot.asm -o ./build/boot.bin echo "Assembling ./src/kernel/entry.asm..." nasm -felf32 ./src/kernel/entry.asm -o ./build/entry.o -for file in ./src/kernel/**.c; do +for file in ./src/kernel/*.c; do filename=$(basename "$file" .c) echo "Compiling $file..." - i386-elf-gcc -ffreestanding -Wall -Wextra -m32 -c $file -o ./build/$filename.o + i386-elf-gcc -ffreestanding -Wall -Wextra -m32 -c "$file" -o "./build/$filename.o" done echo "Linking kernel object files..." -i386-elf-ld -o ./build/kernel.bin -Ttext 0x1000 --oformat binary ./build/**.o +mv ./build/disk.o ./build/f_disk.o # Very temporary fix to issue with disk.o not linking or something weird +i386-elf-ld -o ./build/kernel.bin -Ttext 0x1000 --oformat binary ./build/*.o # OS Image echo "Creating kern.iso disk image..." diff --git a/src/kernel/disk.c b/src/kernel/disk.c new file mode 100644 index 0000000..fcd76e6 --- /dev/null +++ b/src/kernel/disk.c @@ -0,0 +1,31 @@ +#include "disk.h" +#include "stdint.h" +#include "system.h" + +#define PIO_PORT 0x1f0 +#define READ_COMMAND 0x20 +#define WRITE_COMMAND 0x30 + +void diskRead(uint32_t lbaAddress, uint8_t sectorCount, char* dst) { + outb(PIO_PORT + 6, ((lbaAddress >> 24) & 0x0f) | 0xe0); // 6 - Use LBA; 4 - Drive number; 3-0 - Highest lba address nibble + outb(PIO_PORT + 2, sectorCount); // Sector count register + outb(PIO_PORT + 3, (uint8_t)(lbaAddress)); // Lowest lba address byte + outb(PIO_PORT + 4, (uint8_t)(lbaAddress >> 8)); // Middle lba address byte + outb(PIO_PORT + 5, (uint8_t)(lbaAddress >> 16)); // High lba address byte + outb(PIO_PORT + 7, READ_COMMAND); // Command register + + uint16_t* address = (uint16_t*)dst; + + for (uint8_t i = sectorCount; i > 0; i--) { + while (inb(PIO_PORT + 7) & (1 << 7)); // Poll status register untill BSY bit is clear + + for (size_t j = 0; j < 256; j++) { + *address++ = inw(PIO_PORT); // Read 256 words (512 Bytes = 1 Sector) + } + + for (uint8_t delay = 0; delay < 4; delay++) { // 400ns delay + inb(0x3f6); // Alternate status register + } + } +} + diff --git a/src/kernel/disk.h b/src/kernel/disk.h index e64460b..e8e86d9 100644 --- a/src/kernel/disk.h +++ b/src/kernel/disk.h @@ -5,7 +5,7 @@ extern uint8_t driveNum; -void diskRead(uint8_t sector, uint8_t sectorCount, uint8_t drive, char* dst); -void diskWrite(uint8_t sector, uint8_t sectorCount, uint8_t drive, const char* src); +void diskRead(uint32_t lbaAddress, uint8_t sectorCount, char* dst); +// TODO: void diskWrite(uint8_t sector, uint8_t sectorCount, uint8_t drive, const char* src); #endif diff --git a/src/kernel/f_disk.c b/src/kernel/f_disk.c deleted file mode 100644 index 8f0b73b..0000000 --- a/src/kernel/f_disk.c +++ /dev/null @@ -1,27 +0,0 @@ -#include "disk.h" -#include "stdint.h" -#include "system.h" - -#define PIO_PORT 0x1f0 - -void diskRead(uint8_t sector, uint8_t sectorCount, uint8_t drive, char* dst) { - outb(PIO_PORT + 6, (drive & 0x0f) | 0xa0); // Head and drive number port - outb(PIO_PORT + 2, sectorCount); // Sector count - outb(PIO_PORT + 3, sector); // Sector to start reading at - outb(PIO_PORT + 4, 0); // Cylinder number low - outb(PIO_PORT + 5, 0); // Cylinder number high - outb(PIO_PORT + 7, 0x20); // Command register, 0x20 - Read with retry - - while (inb(PIO_PORT + 7) == 8); // Status register, wait until ready - - uint32_t i = 512 * sectorCount; - while (i > 0) { - uint16_t data = inw(PIO_PORT); // Data port - *dst++ = (uint8_t)(data); - *dst++ = (uint8_t)(data >> 8); - i--; - } -} - -void diskWrite(uint8_t sector, uint8_t sectorCount, uint8_t drive, const char* src); -