diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-22 15:12:25 +0200 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-22 20:34:28 +0200 |
| commit | 9a54c41ad07ec00316bb8fcdeba51c215446d454 (patch) | |
| tree | 388f7704a61ff0e103875e3ccbc4435589f6a898 /kernel/src/devices/disc.c | |
| parent | 501a706643a056863b6ea214882a2be270966f87 (diff) | |
ext2 as multiboot2 module
Diffstat (limited to 'kernel/src/devices/disc.c')
| -rw-r--r-- | kernel/src/devices/disc.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/kernel/src/devices/disc.c b/kernel/src/devices/disc.c new file mode 100644 index 0000000..8d34473 --- /dev/null +++ b/kernel/src/devices/disc.c @@ -0,0 +1,32 @@ +#include <disc.h> +#include <multiboot2.h> +#include <libk/string.h> +#include <paging.h> +#include <libk/math.h> + +#define KERNEL_VMA 0xc0000000 + +disc_sector_t* disc; + +void disc_init() +{ + disc = (disc_sector_t*)(uint64_t)ext2_module->mod_start; + if (disc == NULL) { + printf("Error opening disc\n"); + } + + uint32_t disc_size = ext2_module->mod_end - ext2_module->mod_start; + for (size_t i = 0; i < upper_div(disc_size, PAGE_SIZE) + 1; i++) { + map_addr((uint64_t)((char*)disc + i * PAGE_SIZE), (uint64_t)((char*)disc + i * PAGE_SIZE), FLAG_PRESENT | FLAG_WRITABLE | FLAG_HUGE); + } +} + +void read_sector(size_t sector_num, disc_sector_t* disc_sector) +{ + memcpy(disc_sector, disc + sector_num, SECTOR_SIZE); +} + +void write_sector(size_t sector_num, disc_sector_t* disc_sector) +{ + memcpy(disc + sector_num, disc_sector, SECTOR_SIZE); +} |
