1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
#include <sys/log.h>
#include <sys/log.h>
#include <sys/mem.h>
#include <sys/cpio.h>
#include <early/dtb.h>
struct kernel_info {
struct dt_node *head;
void *mem_start;
size_t mem_size;
void *initrd_start;
size_t initrd_size;
};
uint32_t user_regs[31];
struct kernel_info *discover_arch(void *fdt) {
struct kernel_info *kernel_info = kemalloc(sizeof(struct kernel_info));
struct dt_node *head = dt_parse(fdt);
if (head == NULL) {
printk("[E;F] Failed to parse device tree!");
return NULL;
}
kernel_info->head = head;
struct dt_node *memory = dt_find_device(head, "memory");
if (memory == NULL) {
printk("[E;F] Failed to find the memory device!");
return NULL;
}
size_t len = 0;
uint8_t *memory_reg = dt_get_prop(memory, "reg", &len);
if (!memory_reg || len < sizeof(uintptr_t) + sizeof(size_t)) {
printk("[E;F] reg property for memory in provided device tree is nonexistent or invalid!");
return NULL;
}
uintptr_t base = btohi(*memory_reg);
size_t size = btohi(*(memory_reg + sizeof(uintptr_t)));
kernel_info->mem_start = (void *)base;
kernel_info->mem_size = size;
printk("[I] DTB provided memory block addr %p size %p\n", base, (uintptr_t)size);
uint8_t *initrd_reg = dt_get_prop(head, "initrd", &len);
if (!initrd_reg || len < sizeof(uintptr_t) + sizeof(size_t)) {
printk("[E;F] initrd property for head of provided device tree is nonexistent or invalid!");
return NULL;
}
base = btohi(*initrd_reg);
size = btohi(*(initrd_reg + sizeof(uintptr_t)));
kernel_info->initrd_start = (void *)base;
kernel_info->initrd_size = size;
printk("[I] DTB provided init ramdisk addr %p size %p\n", base, (uintptr_t)size);
return kernel_info;
}
void kernel_main(size_t hart, void *fdt) {
printk("wkern version %s (Compiler %s, Linker %s)\n", VERSION, COMPILER_NAME, LINKER_NAME);
if (hart != 0)
return;
struct kernel_info *kernel_info = discover_arch(fdt);
if (!kernel_info) {
return;
}
}
void kernel_trap() {
}
|