From 150499dbea44a4ecf1689990ed915467a14abb02 Mon Sep 17 00:00:00 2001 From: Carlos Maiolino Date: Tue, 24 Feb 2026 21:12:39 +0100 Subject: block: Add a simple block layer Signed-off-by: Carlos Maiolino --- Makefile | 7 ++++++- src/block/block.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ src/include/ata/ata.h | 6 ++++++ src/include/block/block.h | 16 ++++++++++++++++ src/include/toxic/config.h | 1 + src/kernel.c | 5 +++-- 6 files changed, 76 insertions(+), 3 deletions(-) create mode 100644 src/block/block.c create mode 100644 src/include/ata/ata.h create mode 100644 src/include/block/block.h diff --git a/Makefile b/Makefile index 365b7b9..2414134 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,8 @@ KOBJ_FILES = $(KERNEL_ASM_OBJ) \ ./build/mm/kernel_heap.o \ ./build/mm/paging.asm.o \ ./build/mm/paging.o \ - ./build/drivers/ata.o + ./build/drivers/ata.o \ + ./build/block/block.o BOOT_TGT =./bin/boot.bin @@ -84,6 +85,9 @@ $(BUILD_DIR)/mm/paging.o: ./src/mm/paging.c $(BUILD_DIR)/drivers/ata.o: ./src/drivers/ata.c i686-elf-gcc $(INCLUDES) $(FLAGS) -std=gnu99 -c ./src/drivers/ata.c -o $(BUILD_DIR)/drivers/ata.o +$(BUILD_DIR)/block/block.o: ./src/block/block.c + i686-elf-gcc $(INCLUDES) $(FLAGS) -std=gnu99 -c ./src/block/block.c -o $(BUILD_DIR)/block/block.o + clean: rm -f $(BOOT_TGT) rm -f bin/kernel.bin @@ -97,4 +101,5 @@ clean: rm -f build/io/io.asm.o rm -f build/mm/*.o rm -f build/drivers/*.o + rm -f build/block/*.o rm -f bin/os.bin diff --git a/src/block/block.c b/src/block/block.c new file mode 100644 index 0000000..d4758f5 --- /dev/null +++ b/src/block/block.c @@ -0,0 +1,44 @@ +#include +#include +#include +#include + +/* + * Only primary ATA disk is supported by now, just + * hardcode it here. + */ +struct bdev hda; + +/* Init block layer */ +void +block_init() +{ + memset(&hda, 0, sizeof(struct bdev)); + hda.id = TOXIC_HDA_0; + hda.sector_size = SECTOR_SIZE; +} + +struct bdev * +bdev_get(int id) +{ + /* Just a single bdev is supported */ + if (id) + return NULL; + + return &hda; +} + +/* Read len bytes from bdev starting at addr into buf*/ +int +bread( + struct bdev *bdev, + unsigned int addr, + unsigned int len, + void *buf) +{ + /* + * XXX: This should be a function call into the disk driver. + * i.e. bdev->read(), or something like that + */ + return ata_read_sector(addr, len, buf); +} diff --git a/src/include/ata/ata.h b/src/include/ata/ata.h new file mode 100644 index 0000000..2ea73bd --- /dev/null +++ b/src/include/ata/ata.h @@ -0,0 +1,6 @@ +#ifndef ATA_H +#define ATA_H + +int ata_read_sector(int lba, int total, void *buf); + +#endif /* ATA_H */ diff --git a/src/include/block/block.h b/src/include/block/block.h new file mode 100644 index 0000000..eedff88 --- /dev/null +++ b/src/include/block/block.h @@ -0,0 +1,16 @@ +#ifndef BLOCK_H +#define BLOCK_H + +#define TOXIC_HDA_0 0 + +struct bdev { + unsigned int id; + unsigned int sector_size; +}; + +void block_init(void); +struct bdev * bdev_get(int id); +int bread( struct bdev *bdev, unsigned int addr, + unsigned int len, void *buf); + +#endif /* BLOCK_H */ diff --git a/src/include/toxic/config.h b/src/include/toxic/config.h index 19d05a9..c1c1e7f 100644 --- a/src/include/toxic/config.h +++ b/src/include/toxic/config.h @@ -8,4 +8,5 @@ /* Kernel heap settings */ #define PAGE_SIZE (4096) +#define SECTOR_SIZE (512) #endif /* CONFIG_H */ diff --git a/src/kernel.c b/src/kernel.c index d917bd8..373d65d 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -7,7 +7,7 @@ #include #include #include -#include +#include static struct page_directory *kernel_directory; @@ -16,6 +16,7 @@ void start_kernel() char buf[512] = {0}; init_display(2); + block_init(); vprintl("Hello World!!!\n"); vprintl("Testing it!!!\n"); @@ -51,5 +52,5 @@ void start_kernel() kfree(ptr); - ata_read_sector(0, 1, buf); + bread(bdev_get(0), 0, 1, buf); } -- cgit v1.2.3