mirror of
https://github.com/tailix/kernel.git
synced 2025-02-17 15:45:37 -05:00
Add logging
This commit is contained in:
parent
4fe4df2ee1
commit
85fc2df62b
7 changed files with 218 additions and 2 deletions
|
@ -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
87
src/console.c
Normal 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
35
src/console.h
Normal 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
59
src/logger.c
Normal 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
9
src/logger.h
Normal 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
|
|
@ -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
20
src/util.h
Normal 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
|
Loading…
Add table
Reference in a new issue