aboutsummaryrefslogtreecommitdiff
path: root/src/kernel/fs/marfs/disklevel.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/fs/marfs/disklevel.c')
-rw-r--r--src/kernel/fs/marfs/disklevel.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/src/kernel/fs/marfs/disklevel.c b/src/kernel/fs/marfs/disklevel.c
new file mode 100644
index 0000000..b6fc8c2
--- /dev/null
+++ b/src/kernel/fs/marfs/disklevel.c
@@ -0,0 +1,23 @@
+#include <stdint.h>
+#include <kernel/fs/ata_pio.h>
+#include "marfs.h"
+
+void marfs_format(void) {
+ // Create superblock
+ struct marfs_SUPERBLOCK sb;
+ sb.signature = 0x1083B99F34B59645; // Huh, magic?!
+ sb.n_inodes = (marfs_get_max_lba() - 2) >> 5;
+ sb.n_chunks = (marfs_get_max_lba() - (2 + sb.n_inodes)) >> 9;
+ sb.n_first_unallocated_inode = 0;
+ sb.s_first_inode = 2;
+ sb.s_first_chunk = 2 + sb.n_inodes;
+
+ // Write to disk
+ marfs_writeSB(&sb);
+
+ // Initialize the inodes
+ for (uint32_t i = 0; i < sb.n_inodes; i++) ATA_clear28(iface, 2 + i);
+
+ // Initialize the chunks
+ for (uint32_t i = 0; i < sb.n_chunks; i++) ATA_clear28(iface, sb.s_first_chunk + i * 512);
+}