From 85aaf83ec18acfffd7ecd6b4df94ab66c83a40d3 Mon Sep 17 00:00:00 2001 From: Matheus Date: Sun, 9 Apr 2023 18:58:11 -0300 Subject: [PATCH] kernel: term --- kernel-src/arch/x86-64/main.c | 2 ++ kernel-src/include/kernel/term.h | 8 ++++++ kernel-src/io/fb.c | 6 ++++ kernel-src/io/term.c | 49 ++++++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+) create mode 100644 kernel-src/include/kernel/term.h create mode 100644 kernel-src/io/fb.c create mode 100644 kernel-src/io/term.c diff --git a/kernel-src/arch/x86-64/main.c b/kernel-src/arch/x86-64/main.c index 6184279e..c7086592 100644 --- a/kernel-src/arch/x86-64/main.c +++ b/kernel-src/arch/x86-64/main.c @@ -3,6 +3,7 @@ #include #include #include +#include static cpu_t bsp_cpu; @@ -12,5 +13,6 @@ void kernel_entry() { arch_gdt_reload(); arch_idt_setup(); arch_idt_reload(); + term_init(); __assert(!"kernel entry end"); } diff --git a/kernel-src/include/kernel/term.h b/kernel-src/include/kernel/term.h new file mode 100644 index 00000000..7e9ddfd7 --- /dev/null +++ b/kernel-src/include/kernel/term.h @@ -0,0 +1,8 @@ +#ifndef _TERM_H +#define _TERM_H + +void term_init(); +void term_putchar(char c); +void term_write(char *str, size_t count); + +#endif diff --git a/kernel-src/io/fb.c b/kernel-src/io/fb.c new file mode 100644 index 00000000..96231d73 --- /dev/null +++ b/kernel-src/io/fb.c @@ -0,0 +1,6 @@ +#include + +volatile struct limine_framebuffer_request fb_liminereq = { + .id = LIMINE_FRAMEBUFFER_REQUEST, + .revision = 0 +}; diff --git a/kernel-src/io/term.c b/kernel-src/io/term.c new file mode 100644 index 00000000..0ff7a14b --- /dev/null +++ b/kernel-src/io/term.c @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#define EARLY_BUFFER_SIZE (64*1024*1024) + +extern volatile struct limine_framebuffer_request fb_liminereq; + +static size_t bufferused; +static uint8_t allocbuffer[EARLY_BUFFER_SIZE]; + +// TODO once the pmm is done, switch to allocating from it instead. +// right now the terminal is supposed to be initialized before true memory management is initialized. +// thus, there is a simple internal watermark allocator that allocates processor aligned chunks +// of a buffer of size EARLY_BUFFER_SIZE +static void *internalalloc(size_t n) { + __assert(bufferused + n <= EARLY_BUFFER_SIZE) + void *ret = &allocbuffer[bufferused]; + bufferused += n + (sizeof(uintmax_t) - (n % sizeof(uintmax_t))); + return ret; +} + +static struct flanterm_context *term_ctx; + +void term_write(char *str, size_t count) { + flanterm_write(term_ctx, str, count); +} + +void term_putchar(char c) { + flanterm_write(term_ctx, &c, 1); +} + +void term_init() { + __assert(fb_liminereq.response); + __assert(fb_liminereq.response->framebuffer_count); + struct limine_framebuffer *fb = fb_liminereq.response->framebuffers[0]; + + // TODO add support for a background if desired by the user + term_ctx = flanterm_fb_init(internalalloc, fb->address, fb->width, fb->height, fb->pitch, + NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + 0, 0, 1, 1, 1, 0); + + __assert(term_ctx); +}