diff options
| author | Nathan Lee <me@nwlee.tech> | 2026-07-12 12:42:31 -0500 |
|---|---|---|
| committer | Nathan Lee <me@nwlee.tech> | 2026-07-12 12:45:05 -0500 |
| commit | 24fdac29fb8a1c7766869b05e7a17b2c4cc98ce1 (patch) | |
| tree | 6fddf53527e7ab52e089b620bcdbcba5fa67daa3 /kernel | |
| parent | 5d9942d70ca61af4d12cd2a531a190c98052c9c4 (diff) | |
create elf.h
The ELF parser needs more work, there are more structs to be added.
memcpy was refactored from mem.h into common.h
endianness conversions were standardized in types.h
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/bump.c | 4 | ||||
| -rw-r--r-- | kernel/dtb.c | 10 | ||||
| -rw-r--r-- | kernel/elf.c | 12 | ||||
| -rw-r--r-- | kernel/kernel.c | 14 | ||||
| -rw-r--r-- | kernel/mem.c | 12 |
5 files changed, 20 insertions, 32 deletions
diff --git a/kernel/bump.c b/kernel/bump.c index 369f92f..fd4f25d 100644 --- a/kernel/bump.c +++ b/kernel/bump.c @@ -19,8 +19,8 @@ struct mem_info *km_find_memory(struct dt_node *head) { size_t len = 0; uint32_t *reg = (uint32_t *)dt_get_prop(head, "reg", &len); if (reg && len >= 8) { - uint32_t base = be32_to_cpu(reg[0]); - uint32_t size = be32_to_cpu(reg[1]); + uint32_t base = btohi(reg[0]); + uint32_t size = btohi(reg[1]); struct mem_info *ret = kemalloc(sizeof(struct mem_info)); ret->start = (void*)base; ret->size = (size_t)size; diff --git a/kernel/dtb.c b/kernel/dtb.c index 99b1679..7647767 100644 --- a/kernel/dtb.c +++ b/kernel/dtb.c @@ -10,15 +10,15 @@ struct dt_node *dt_parse(void *fdt) { return NULL; } - uint32_t *p = (uint32_t *)(fdt + be32_to_cpu(hdr->off_dt_struct)); - char *strings = fdt + be32_to_cpu(hdr->off_dt_strings); + uint32_t *p = (uint32_t *)(fdt + btohi(hdr->off_dt_struct)); + char *strings = fdt + btohi(hdr->off_dt_strings); struct dt_node *root = NULL; struct dt_node *stack[DTB_MAX_NODES]; int sp = 0; while (1) { - uint32_t token = be32_to_cpu(*p++); + uint32_t token = btohi(*p++); switch (token) { case FDT_BEGIN_NODE: { char *name = (char *)p; @@ -35,8 +35,8 @@ struct dt_node *dt_parse(void *fdt) { break; } case FDT_PROP: { - uint32_t len = be32_to_cpu(*p++); - uint32_t nameoff = be32_to_cpu(*p++); + uint32_t len = btohi(*p++); + uint32_t nameoff = btohi(*p++); void *value = p; p += (len + 3) / 4; diff --git a/kernel/elf.c b/kernel/elf.c new file mode 100644 index 0000000..f1ceb2d --- /dev/null +++ b/kernel/elf.c @@ -0,0 +1,12 @@ +#include <elf.h> +#include <common.h> + +int elf_chk_header(struct elf_header *header) { + uint32_t magic_chk; + memcpy(&magic_chk, header->e_ident, sizeof(uint32_t)); + if (magic_chk != ltohi(ELF_MAGIC_LE)) { + return -1; + } + + return 0; +} diff --git a/kernel/kernel.c b/kernel/kernel.c index 3952f8f..da44428 100644 --- a/kernel/kernel.c +++ b/kernel/kernel.c @@ -1,18 +1,6 @@ #include <types.h> #include <dtb.h> #include <bump.h> -#define UART_BASE 0x10000000 // Example UART address - -static inline void putchar(char c) { - volatile char *uart = (volatile char *)UART_BASE; - *uart = c; -} - -static void print_string(const char *str) { - while (*str) { - putchar(*str++); - } -} void kernel_main(size_t hart, void *fdt) { (void)hart; @@ -21,11 +9,11 @@ void kernel_main(size_t hart, void *fdt) { struct mem_info *info = km_find_memory(head); if (!info) { - print_string("failed to get memory!\n"); while (1); } km_init(info); + while(1); } diff --git a/kernel/mem.c b/kernel/mem.c index 0556dfb..2a6bd35 100644 --- a/kernel/mem.c +++ b/kernel/mem.c @@ -106,18 +106,6 @@ void kfree(void *ptr) { } - -void* memcpy(void *to, const void *from, size_t size) { - char *dest = (char *)to; - const char *src = (const char *)from; - - while (size--) { - *dest++ = *src++; - } - - return dest; -} - void km_init(struct mem_info *info) { struct page *base = (struct page *)info->start; base->next = NULL; |
