diff options
Diffstat (limited to 'kernel/include')
| -rw-r--r-- | kernel/include/containter_of.h | 40 | ||||
| -rw-r--r-- | kernel/include/ext2.h | 16 | ||||
| -rw-r--r-- | kernel/include/libk/list.h | 31 | ||||
| -rw-r--r-- | kernel/include/multiboot2.h | 9 |
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 |
