1
0
Fork 0
mirror of https://github.com/tailix/kernel.git synced 2025-02-17 15:45:37 -05:00

Add logging

This commit is contained in:
Braiden Vasco 2017-11-01 05:01:29 +00:00
parent 4fe4df2ee1
commit 85fc2df62b
7 changed files with 218 additions and 2 deletions

View file

@ -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)

87
src/console.c Normal file
View file

@ -0,0 +1,87 @@
#include "console.h"
#include "util.h"
#include <stdbool.h>
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);
}

35
src/console.h Normal file
View file

@ -0,0 +1,35 @@
#ifndef TAILIX_KERNEL_INCLUDED_CONSOLE
#define TAILIX_KERNEL_INCLUDED_CONSOLE 1
#include <stdint.h>
#include <stddef.h>
// 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

59
src/logger.c Normal file
View file

@ -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);
}

9
src/logger.h Normal file
View file

@ -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

View file

@ -1,3 +1,9 @@
#include "logger.h"
void main()
{
logger_initialize();
logger_info("Kernel initialization started.");
logger_warn("Nothing to do.");
logger_fail("Halt.");
}

20
src/util.h Normal file
View file

@ -0,0 +1,20 @@
#ifndef TAILIX_KERNEL_INCLUDED_UTIL
#define TAILIX_KERNEL_INCLUDED_UTIL 1
#include <stdint.h>
#include <stddef.h>
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