summaryrefslogtreecommitdiff
path: root/kernel/src/devices/disc.c
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksav013@gmail.com>2022-08-22 15:12:25 +0200
committerAleksa Vuckovic <aleksav013@gmail.com>2022-08-22 20:34:28 +0200
commit9a54c41ad07ec00316bb8fcdeba51c215446d454 (patch)
tree388f7704a61ff0e103875e3ccbc4435589f6a898 /kernel/src/devices/disc.c
parent501a706643a056863b6ea214882a2be270966f87 (diff)
ext2 as multiboot2 module
Diffstat (limited to 'kernel/src/devices/disc.c')
-rw-r--r--kernel/src/devices/disc.c32
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);
+}