summaryrefslogtreecommitdiff
path: root/kernel/include
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/include
parent501a706643a056863b6ea214882a2be270966f87 (diff)
ext2 as multiboot2 module
Diffstat (limited to 'kernel/include')
-rw-r--r--kernel/include/disc.h21
-rw-r--r--kernel/include/ext2.h144
-rw-r--r--kernel/include/heap.h4
-rw-r--r--kernel/include/multiboot2.h13
4 files changed, 179 insertions, 3 deletions
diff --git a/kernel/include/disc.h b/kernel/include/disc.h
new file mode 100644
index 0000000..7b4fd0b
--- /dev/null
+++ b/kernel/include/disc.h
@@ -0,0 +1,21 @@
+#ifndef DISC_H
+#define DISC_H
+
+#include <types.h>
+
+#include <libk/stdio.h>
+
+#define SECTOR_SIZE 512
+
+struct disc_sector_t {
+ uint8_t data[SECTOR_SIZE];
+};
+typedef struct disc_sector_t disc_sector_t;
+
+extern disc_sector_t* disc;
+
+void disc_init(void);
+void read_sector(size_t sector_num, disc_sector_t* disc_sector);
+void write_sector(size_t sector_num, disc_sector_t* disc_sector);
+
+#endif
diff --git a/kernel/include/ext2.h b/kernel/include/ext2.h
new file mode 100644
index 0000000..1760fef
--- /dev/null
+++ b/kernel/include/ext2.h
@@ -0,0 +1,144 @@
+#ifndef EXT2_H
+#define EXT2_H
+
+#include <types.h>
+
+#include <libk/list.h>
+
+struct ext2_superblock_t {
+// base fields
+ uint32_t inodes_count;
+ uint32_t blocks_count;
+ uint32_t superuser_blocks;
+ uint32_t free_blocks;
+ uint32_t free_inodes;
+ uint32_t superblock_block;
+ uint32_t block_size;
+ uint32_t fragment_size;
+ uint32_t blocks_per_group;
+ uint32_t fragments_per_group;
+ uint32_t inodes_per_group;
+ uint32_t last_mount_time;
+ uint32_t last_write_time;
+ uint16_t mounts_since_fcsk;
+ uint16_t mounts_before_fcsk;
+ uint16_t signature;
+ uint16_t state;
+ uint16_t on_error;
+ uint16_t version_minor;
+ uint32_t last_time_fcsk;
+ uint32_t interval_fcsk;
+ uint32_t os_id;
+ uint32_t version_major;
+ uint16_t superuser_id;
+ uint16_t supergroup_id;
+// extended fields
+ uint32_t first_inode;
+ uint16_t inode_size;
+ uint16_t superblock_group;
+ uint32_t optional_features;
+ uint32_t required_features;
+ uint32_t ro_features;
+ uint8_t id[16];
+ uint8_t volume_name[16];
+ uint8_t path_name[64];
+ uint32_t compression;
+ uint8_t blocks_for_files;
+ uint8_t blocks_for_dirs;
+ uint16_t unused;
+ uint8_t journal_id[16];
+ uint32_t journal_inode;
+ uint32_t journal_device;
+ uint32_t orphan_inode_head;
+ // unused
+};
+typedef struct ext2_superblock_t ext2_superblock_t;
+
+struct ext2_bg_desc_t {
+ uint32_t block_bitmap;
+ uint32_t inode_bitmap;
+ uint32_t inode_block_address;
+ uint16_t free_blocks;
+ uint16_t free_inodes;
+ uint16_t dir_count;
+};
+typedef struct ext2_bg_desc_t ext2_bg_desc_t;
+
+struct ext2_inode_t {
+ uint16_t type_perms;
+ uint16_t user_id;
+ uint32_t size_lower;
+ uint32_t last_accessed;
+ uint32_t creation_time;
+ uint32_t last_modified;
+ uint32_t deletion_time;
+ uint16_t group_id;
+ uint16_t hard_links_count;
+ uint32_t sectors_used;
+ uint32_t flags;
+ uint8_t os_specific1[4];
+ uint32_t dbp[12];
+ uint32_t sibp;
+ uint32_t dibp;
+ uint32_t tibp;
+ uint32_t gen_number;
+ uint32_t eab;
+ uint32_t size_upper;
+ uint32_t fragment_address;
+ uint8_t os_specific2[12];
+};
+typedef struct ext2_inode_t ext2_inode_t;
+
+// inode type
+#define TYPE_FIFO 0x1000
+#define TYPE_CHAR_DEV 0x2000
+#define TYPE_DIR 0x4000
+#define TYPE_BLOCK DEV 0x6000
+#define TYPE_FILE 0x8000
+#define TYPE_SYMLINK 0xA000
+#define TYPE_SOCKET 0xC000
+
+// inode permission
+#define PERM_OE 0x001
+#define PERM_OR 0x002
+#define PERM_OW 0x004
+#define PERM_GE 0x008
+#define PERM_GR 0x010
+#define PERM_GW 0x020
+#define PERM_UE 0x040
+#define PERM_UR 0x080
+#define PERM_UW 0x100
+#define PERM_STICKY 0x200
+#define PERM_GID 0x400
+#define PERM_UID 0x800
+
+struct ext2_dentry_t {
+ uint32_t inode;
+ uint16_t size;
+ uint8_t name_length_lower;
+ uint8_t type;
+ char* name;
+};
+typedef struct ext2_dentry_t ext2_dentry_t;
+
+extern ext2_superblock_t* ext2_superblock;
+
+// size of structs
+#define BG_DESC_SIZE 32
+#define BLOCK_SIZE (uint32_t)(1024 << ext2_superblock->block_size)
+#define INODE_SIZE (ext2_superblock->inode_size)
+#define INODES_PER_BLOCK (BLOCK_SIZE / INODE_SIZE)
+
+
+void read_block(uint32_t block_num, void* block_ptr);
+void read_superblock(ext2_superblock_t* ext2_superblock);
+void read_bg_desc(uint32_t bg_desc, ext2_bg_desc_t* ext2_bg_desc);
+void read_inode(uint32_t starting_block_num, uint32_t inode_index, ext2_inode_t* ext2_inode);
+list_t* directory_to_entries(uint32_t inode);
+char* files_to_buffer(uint32_t inode);
+list_t* path_to_list(const char* path);
+uint32_t path_to_inode(const char* path);
+void ls(uint32_t inode);
+void print(uint32_t inode);
+
+#endif
diff --git a/kernel/include/heap.h b/kernel/include/heap.h
index 88a9ad0..62d3b6f 100644
--- a/kernel/include/heap.h
+++ b/kernel/include/heap.h
@@ -3,8 +3,8 @@
#include <types.h>
-#define HEAP_VMEM_ADDR 0xc0400000
-#define HEAP_PMEM_ADDR 0x00400000
+#define HEAP_VMEM_ADDR 0xc1000000
+#define HEAP_PMEM_ADDR 0x01000000
#define HEAP_SIZE 0x01000000
#define HEAP_BLOCK_SIZE 0x00000010
diff --git a/kernel/include/multiboot2.h b/kernel/include/multiboot2.h
index 6d4a86f..994dbc5 100644
--- a/kernel/include/multiboot2.h
+++ b/kernel/include/multiboot2.h
@@ -37,6 +37,15 @@ struct mb2_tag_mmap_entry {
};
typedef struct mb2_tag_mmap_entry mb2_tag_mmap_entry;
+struct mb2_tag_module {
+ uint32_t type;
+ uint32_t size;
+ uint32_t mod_start;
+ uint32_t mod_end;
+ char* name;
+};
+typedef struct mb2_tag_module mb2_tag_module;
+
// multiboot2 magic check
#define MB2_MAGIC 0x36D76289
@@ -45,16 +54,18 @@ typedef struct mb2_tag_mmap_entry mb2_tag_mmap_entry;
#define MB2_TAG_END 0
#define MB2_TAG_CMDLINE 1
#define MB2_TAG_BOOTLOADER 2
-#define MB2_TAG_MODULES 3
+#define MB2_TAG_MODULE 3
#define MB2_TAG_MEM 4
#define MB2_TAG_BIOS 5
#define MB2_TAG_MMAP 6
#define MB2_TAG_VBE 7
#define MB2_TAG_FB 8
+extern mb2_tag_module* ext2_module;
void read_mb2(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic);
void init_fb(mb2_tag_fb* tag_fb);
void init_mmap(mb2_tag_mmap* tag_mmap);
+void init_module(mb2_tag_module* tag_module);
#endif