summaryrefslogtreecommitdiff
path: root/kernel/include
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/include')
-rw-r--r--kernel/include/containter_of.h40
-rw-r--r--kernel/include/ext2.h16
-rw-r--r--kernel/include/libk/list.h31
-rw-r--r--kernel/include/multiboot2.h9
4 files changed, 90 insertions, 6 deletions
diff --git a/kernel/include/containter_of.h b/kernel/include/containter_of.h
new file mode 100644
index 0000000..766847a
--- /dev/null
+++ b/kernel/include/containter_of.h
@@ -0,0 +1,40 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef CONTAINER_OF
+#define CONTAINER_OF
+
+#define static_assert(expr, ...) __static_assert(expr, ##__VA_ARGS__, #expr)
+#define __static_assert(expr, msg, ...) _Static_assert(expr, msg)
+#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))
+#define typeof_member(T, m) typeof(((T*)0)->m)
+
+/**
+ * container_of - cast a member of a structure out to the containing structure
+ * @ptr: the pointer to the member.
+ * @type: the type of the container struct this is embedded in.
+ * @member: the name of the member within the struct.
+ *
+ */
+#define container_of(ptr, type, member) ({ \
+ void *__mptr = (void *)(ptr); \
+ static_assert(__same_type(*(ptr), ((type *)0)->member) || \
+ __same_type(*(ptr), void), \
+ "pointer type mismatch in container_of()"); \
+ ((type *)(__mptr - offsetof(type, member))); })
+
+/**
+ * container_of_safe - cast a member of a structure out to the containing structure
+ * @ptr: the pointer to the member.
+ * @type: the type of the container struct this is embedded in.
+ * @member: the name of the member within the struct.
+ *
+ * If IS_ERR_OR_NULL(ptr), ptr is returned unchanged.
+ */
+#define container_of_safe(ptr, type, member) ({ \
+ void *__mptr = (void *)(ptr); \
+ static_assert(__same_type(*(ptr), ((type *)0)->member) || \
+ __same_type(*(ptr), void), \
+ "pointer type mismatch in container_of_safe()"); \
+ IS_ERR_OR_NULL(__mptr) ? ERR_CAST(__mptr) : \
+ ((type *)(__mptr - offsetof(type, member))); })
+
+#endif
diff --git a/kernel/include/ext2.h b/kernel/include/ext2.h
index 1acdb18..b9222df 100644
--- a/kernel/include/ext2.h
+++ b/kernel/include/ext2.h
@@ -121,6 +121,18 @@ struct ext2_dentry_t {
};
typedef struct ext2_dentry_t ext2_dentry_t;
+struct path_t {
+ char* name;
+ list_t list;
+};
+typedef struct path_t path_t;
+
+struct dentry_list_t {
+ ext2_dentry_t ext2_dentry;
+ list_t list;
+};
+typedef struct dentry_list_t dentry_list_t;
+
extern ext2_superblock_t* ext2_superblock;
// size of structs
@@ -135,9 +147,9 @@ 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);
+dentry_list_t* directory_to_entries(uint32_t inode);
char* files_to_buffer(uint32_t inode);
-list_t* path_to_list(const char* path);
+path_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);
diff --git a/kernel/include/libk/list.h b/kernel/include/libk/list.h
index f6a97f8..1cd9928 100644
--- a/kernel/include/libk/list.h
+++ b/kernel/include/libk/list.h
@@ -1,14 +1,37 @@
#ifndef LIST_H
#define LIST_H
+#include <containter_of.h>
+
struct list_t {
struct list_t* next;
- void* data;
+ struct list_t* prev;
};
typedef struct list_t list_t;
-void add_to_list_head(list_t** ptr, void* data);
-void add_to_list_tail(list_t** ptr, void* data);
-void free_list(list_t** ptr);
+void add_to_list(list_t* head, list_t* prev, list_t* next);
+void free_node(list_t* head);
+
+#define INIT_LIST(name) \
+ name.next = &name; \
+ name.prev = &name;
+
+#define list_for_each(pos, head) \
+ for (pos = head->next; pos != head; pos = pos->next)
+
+#define list_next_entry(pos, member) \
+ container_of(pos->member.next, typeof(*pos), member)
+
+#define list_prev_entry(pos, member) \
+ container_of(pos->member.prev, typeof(*pos), member)
+
+#define list_for_each_entry(pos, head, member) \
+ for (pos = container_of(head->next, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); pos = container_of(pos->member.next, typeof(*pos), member))
+
+#define list_for_each_entry_prev(pos, head, member) \
+ for (pos = container_of(head->prev, typeof(*pos), member); pos != container_of(head, typeof(*pos), member); pos = container_of(pos->member.prev, typeof(*pos), member))
+
+#define list_is_empty(pos) \
+ (pos == pos->next)
#endif
diff --git a/kernel/include/multiboot2.h b/kernel/include/multiboot2.h
index 994dbc5..ff91092 100644
--- a/kernel/include/multiboot2.h
+++ b/kernel/include/multiboot2.h
@@ -2,6 +2,7 @@
#define MULTIBOOT2_H
#include <types.h>
+#include <libk/list.h>
struct mb2_tag_header {
uint32_t type;
@@ -46,6 +47,14 @@ struct mb2_tag_module {
};
typedef struct mb2_tag_module mb2_tag_module;
+struct mmap_t {
+ mb2_tag_mmap_entry mmap_entry;
+ list_t list;
+};
+typedef struct mmap_t mmap_t;
+
+extern mmap_t mmap;
+
// multiboot2 magic check
#define MB2_MAGIC 0x36D76289