diff options
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..4721735 --- /dev/null +++ b/src/main.c @@ -0,0 +1,65 @@ +#include "aplos.h" + +static void welcome(void); +static void print_memmap(struct boot_info *); +static void print_size(uint64_t); + +void +main(struct boot_info *info) +{ + screen_init(&info->framebuffer); + welcome(); + print(u8"CPU count: %u64\n", cpu_count()); + print_memmap(info); + + halt(); +} + +static void +welcome(void) +{ + print(u8"Starting ☺☻☺☻☺☻☺☻☺☻\n"); +} + +static void +print_memmap(struct boot_info *info) +{ + print(u8"Usable memory: "); + uint64_t total = 0; + for(uint64_t i = 0; i < info->memmap_count; i++) + total += info->memmaps[i].size; + print_size(total); + print(u8"\n"); + + for(uint64_t i = 0; i < info->memmap_count; i++){ + struct memmap *m = &info->memmaps[i]; + print(u8"%p - %p (", m->start, m->start + m->size); + print_size(m->size); + print(u8")\n"); + } +} + +static void +print_size(uint64_t size) +{ + uint64_t gb, mb, kb, b; + gb = size >> 30; size -= gb << 30; + mb = size >> 20; size -= mb << 20; + kb = size >> 10; size -= kb << 10; + b = size; + + int printed = 0; + +#define P(what, spec, force) \ + if(what || (force && !printed)){ \ + if(printed) \ + print(u8" + "); \ + printed = 1; \ + print(u8"%u64 " spec, what); \ + } + + P(gb, "GB", 0); + P(mb, "MB", 0); + P(kb, "KB", 0); + P(b, "B", 1); +} |