From 85fc2df62be3896c77a3d28d521b59ea7f403a06 Mon Sep 17 00:00:00 2001 From: Braiden Vasco Date: Wed, 1 Nov 2017 05:01:29 +0000 Subject: [PATCH] Add logging --- src/Makefile | 4 +-- src/console.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/console.h | 35 +++++++++++++++++++++ src/logger.c | 59 ++++++++++++++++++++++++++++++++++ src/logger.h | 9 ++++++ src/main.c | 6 ++++ src/util.h | 20 ++++++++++++ 7 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 src/console.c create mode 100644 src/console.h create mode 100644 src/logger.c create mode 100644 src/logger.h create mode 100644 src/util.h diff --git a/src/Makefile b/src/Makefile index 453da6b..2b59deb 100644 --- a/src/Makefile +++ b/src/Makefile @@ -3,12 +3,12 @@ CCPREFIX = i686-elf- AS = $(CCPREFIX)as CC = $(CCPREFIX)gcc -OBJS = boot.s.o main.c.o +OBJS = boot.s.o main.c.o logger.c.o console.c.o all: kernel clean: - rm kernel $(OBJS) + rm -f kernel $(OBJS) kernel: $(OBJS) $(CC) -T linker.ld -o $@ -ffreestanding -nostdlib -O2 -lgcc $(OBJS) diff --git a/src/console.c b/src/console.c new file mode 100644 index 0000000..119b700 --- /dev/null +++ b/src/console.c @@ -0,0 +1,87 @@ +#include "console.h" + +#include "util.h" + +#include + +static const size_t VGA_WIDTH = 80; +static const size_t VGA_HEIGHT = 25; + +static size_t console_row; +static size_t console_column; +static uint8_t console_color; +static uint16_t* console_buffer; + +static uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg); +static uint16_t vga_entry(unsigned char uc, uint8_t color); +static void console_putentryat(char c, uint8_t color, size_t x, size_t y); + +void console_initialize() { + console_row = 0; + console_column = 0; + console_color = vga_entry_color(VGA_COLOR_LIGHT_GREY, VGA_COLOR_BLACK); + console_buffer = (uint16_t*)0xB8000; + + for (size_t y = 0; y < VGA_HEIGHT; y++) { + for (size_t x = 0; x < VGA_WIDTH; x++) { + const size_t index = y * VGA_WIDTH + x; + console_buffer[index] = vga_entry(' ', console_color); + } + } +} + +void console_print(const char *const s) +{ + console_write(s, strlen(s)); +} + +void console_putc(const char c) { + if (c == '\n') { + console_column = 0; + + if (++console_row == VGA_HEIGHT) { + console_row = 0; + } + + return; + } + + console_putentryat(c, console_color, console_column, console_row); + + if (++console_column == VGA_WIDTH) { + console_column = 0; + + if (++console_row == VGA_HEIGHT) { + console_row = 0; + } + } +} + +void console_puts(const char *const s) +{ + console_print(s); + console_putc('\n'); +} + +void console_setcolor(const uint8_t color) { + console_color = color; +} + +void console_write(const char *const data, const size_t size) { + for (size_t i = 0; i < size; i++) { + console_putc(data[i]); + } +} + +uint8_t vga_entry_color(enum vga_color fg, enum vga_color bg) { + return fg | bg << 4; +} + +uint16_t vga_entry(unsigned char uc, uint8_t color) { + return (uint16_t) uc | (uint16_t) color << 8; +} + +void console_putentryat(char c, uint8_t color, size_t x, size_t y) { + const size_t index = y * VGA_WIDTH + x; + console_buffer[index] = vga_entry(c, color); +} diff --git a/src/console.h b/src/console.h new file mode 100644 index 0000000..f9aa746 --- /dev/null +++ b/src/console.h @@ -0,0 +1,35 @@ +#ifndef TAILIX_KERNEL_INCLUDED_CONSOLE +#define TAILIX_KERNEL_INCLUDED_CONSOLE 1 + +#include +#include + +// Hardware text mode color constants. +enum vga_color { + VGA_COLOR_BLACK = 0, + VGA_COLOR_BLUE = 1, + VGA_COLOR_GREEN = 2, + VGA_COLOR_CYAN = 3, + VGA_COLOR_RED = 4, + VGA_COLOR_MAGENTA = 5, + VGA_COLOR_BROWN = 6, + VGA_COLOR_LIGHT_GREY = 7, + VGA_COLOR_DARK_GREY = 8, + VGA_COLOR_LIGHT_BLUE = 9, + VGA_COLOR_LIGHT_GREEN = 10, + VGA_COLOR_LIGHT_CYAN = 11, + VGA_COLOR_LIGHT_RED = 12, + VGA_COLOR_LIGHT_MAGENTA = 13, + VGA_COLOR_LIGHT_BROWN = 14, + VGA_COLOR_WHITE = 15, +}; + +void console_initialize(); + +void console_print(const char *s); +void console_putc(char c); +void console_puts(const char *s); +void console_setcolor(uint8_t color); +void console_write(const char *data, size_t size); + +#endif diff --git a/src/logger.c b/src/logger.c new file mode 100644 index 0000000..1069aee --- /dev/null +++ b/src/logger.c @@ -0,0 +1,59 @@ +#include "logger.h" + +#include "console.h" + +void logger_initialize() +{ + console_initialize(); +} + +void logger_info(const char *const s) +{ + console_setcolor(VGA_COLOR_LIGHT_GREY); + console_putc('['); + + console_setcolor(VGA_COLOR_CYAN); + console_print("INFO"); + + console_setcolor(VGA_COLOR_LIGHT_GREY); + console_putc(']'); + + console_putc(' '); + + console_setcolor(VGA_COLOR_WHITE); + console_puts(s); +} + +void logger_warn(const char *const s) +{ + console_setcolor(VGA_COLOR_LIGHT_GREY); + console_putc('['); + + console_setcolor(VGA_COLOR_MAGENTA); + console_print("WARN"); + + console_setcolor(VGA_COLOR_LIGHT_GREY); + console_putc(']'); + + console_putc(' '); + + console_setcolor(VGA_COLOR_WHITE); + console_puts(s); +} + +void logger_fail(const char *const s) +{ + console_setcolor(VGA_COLOR_LIGHT_GREY); + console_putc('['); + + console_setcolor(VGA_COLOR_RED); + console_print("FAIL"); + + console_setcolor(VGA_COLOR_LIGHT_GREY); + console_putc(']'); + + console_putc(' '); + + console_setcolor(VGA_COLOR_WHITE); + console_puts(s); +} diff --git a/src/logger.h b/src/logger.h new file mode 100644 index 0000000..422a906 --- /dev/null +++ b/src/logger.h @@ -0,0 +1,9 @@ +#ifndef TAILIX_KERNEL_INCLUDED_LOGGER +#define TAILIX_KERNEL_INCLUDED_LOGGER 1 + +void logger_initialize(); +void logger_info(const char *s); +void logger_warn(const char *s); +void logger_fail(const char *s); + +#endif diff --git a/src/main.c b/src/main.c index 9198103..2c523c0 100644 --- a/src/main.c +++ b/src/main.c @@ -1,3 +1,9 @@ +#include "logger.h" + void main() { + logger_initialize(); + logger_info("Kernel initialization started."); + logger_warn("Nothing to do."); + logger_fail("Halt."); } diff --git a/src/util.h b/src/util.h new file mode 100644 index 0000000..daa0888 --- /dev/null +++ b/src/util.h @@ -0,0 +1,20 @@ +#ifndef TAILIX_KERNEL_INCLUDED_UTIL +#define TAILIX_KERNEL_INCLUDED_UTIL 1 + +#include +#include + +static inline size_t strlen(const char *s); + +size_t strlen(const char *const s) +{ + size_t len = 0; + + while (s[len]) { + len++; + } + + return len; +} + +#endif