Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions kernel/arch/x86/boot/boot.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@

void banner(void)
{
tty_write("Welcome to MoonOS\n");
tty_write(
"\n"
" _____ _____ _____ \n"
"| |___ ___ ___| | __| \n"
"| | | | . | . | | | |__ | \n"
"|_|_|_|___|___|_|_|_____|_____| \n"
"\n");
trace(TRACE_BOOT, "Welcome to MoonOS\n");
trace(TRACE_BOOT,
"\n"
" _____ _____ _____ \n"
"| |___ ___ ___| | __| \n"
"| | | | . | . | | | |__ | \n"
"|_|_|_|___|___|_|_|_____|_____| \n"
"\n");
}

NORETURN void boot(void)
Expand Down
4 changes: 2 additions & 2 deletions kernel/arch/x86/devices/tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ void arch_tty_init(uint64_t fb_addr, uint16_t fb_width, uint16_t fb_height,
// clang-format on
}

void arch_tty_write(string_view str)
void arch_tty_write(StringView str)
{
flanterm_write(ft_ctx, str, strlen(str));
flanterm_write(ft_ctx, str.data, str.length);
}
2 changes: 1 addition & 1 deletion kernel/arch/x86/devices/tty.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ void arch_tty_init(uint64_t fb_addr, uint16_t fb_width, uint16_t fb_height,
uint8_t fb_red_mask_shift, uint8_t fb_green_mask_size,
uint8_t fb_green_mask_shift, uint8_t fb_blue_mask_size,
uint8_t fb_blue_mask_shift);
void arch_tty_write(string_view str);
void arch_tty_write(StringView str);

#endif // TTY_H
69 changes: 35 additions & 34 deletions kernel/arch/x86/int/interrupts.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,37 +11,37 @@
isr_t isr_handler_array[256] = {0};
bool can_return = false;

static string_view exception_messages[] = {
"Type: (#DE) Division Exception",
"Type: (#DB) Debug Exception",
"Type: (NONE) NMI interrupt (Non Maskable Interrupt)",
"Type: (#BP) Breakpoint Exception",
"Type: (#OF) Into detected Overflow Exception",
"Type: (#BR) BOUND Range Exceeded",
"Type: (#UD) Invalid Opcode (Undefined Opcode)",
"Type: (#NM) Device Not Available (No Math Coprocessor)",
"Type: (#DF) Double Fault",
"Type: (NONE) Coprocessor Segment Overrun (reserved)",
"Type: (#TS) Invalid TSS",
"Type: (#NP) Segment Not Present",
"Type: (#SS) Stack-Segment Fault",
"Type: (#GP) General Protection Fault",
"Type: (#PF) Page Fault",
"Type: (NONE) Unknown interrupt",
"Type: (#CF) Coprocessor fault",
"Type: (#AC) Alignment check",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved",
"Type: (NONE) Reserved"};
static StringView exception_messages[] = {
str_literal("Type: (#DE) Division Exception"),
str_literal("Type: (#DB) Debug Exception"),
str_literal("Type: (NONE) NMI interrupt (Non Maskable Interrupt)"),
str_literal("Type: (#BP) Breakpoint Exception"),
str_literal("Type: (#OF) Into detected Overflow Exception"),
str_literal("Type: (#BR) BOUND Range Exceeded"),
str_literal("Type: (#UD) Invalid Opcode (Undefined Opcode)"),
str_literal("Type: (#NM) Device Not Available (No Math Coprocessor)"),
str_literal("Type: (#DF) Double Fault"),
str_literal("Type: (NONE) Coprocessor Segment Overrun (reserved)"),
str_literal("Type: (#TS) Invalid TSS"),
str_literal("Type: (#NP) Segment Not Present"),
str_literal("Type: (#SS) Stack-Segment Fault"),
str_literal("Type: (#GP) General Protection Fault"),
str_literal("Type: (#PF) Page Fault"),
str_literal("Type: (NONE) Unknown interrupt"),
str_literal("Type: (#CF) Coprocessor fault"),
str_literal("Type: (#AC) Alignment check"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved"),
str_literal("Type: (NONE) Reserved")};

void isr_handler(struct iframe *regs)
{
Expand All @@ -54,7 +54,7 @@ void isr_handler(struct iframe *regs)
serial_set_color(BASH_RED);
debug(true,
"ERROR: %s (err_code %ld) | %lx\n",
exception_messages[regs->isr_number],
exception_messages[regs->isr_number].data,
regs->error_code,
cr2_read());
// for(;;);
Expand Down Expand Up @@ -137,8 +137,9 @@ void install_isr(uint8_t base, isr_t handler)
isr_handler_array[base] = handler;
}
else
printk(
"INT", "The interrupt ( %d ) has already been registered!\n", base);
trace(TRACE_INT,
"The interrupt (%d) has already been registered!\n",
base);
}

void uninstall_isr(uint8_t base)
Expand Down
24 changes: 13 additions & 11 deletions kernel/panic.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#define PR_MODULE "panic"
#include "panic.h"
#include <base/fmt.h>
#include <cpu.h>
Expand All @@ -17,8 +18,8 @@ NORETURN void __panic(size_t bp, size_t sp, string_view fmt, ...)

override_quiet_boot();

printk("panic", "\n\033[31mA kernel panic has occurred\033[39m\n");
tty_write("*** \033[97mReason: %s\033[39m ***\n", panic_buff);
trace(TRACE_ERROR, "\n\033[31mA kernel panic has occurred\033[39m\n");
trace(TRACE_ERROR, "*** \033[97mReason: %s\033[39m ***\n", panic_buff);
debug(false,
"A kernel panic has occurred\n*** \033[97mReason: %s\033[39m ***\n",
panic_buff);
Expand All @@ -29,11 +30,11 @@ NORETURN void __panic(size_t bp, size_t sp, string_view fmt, ...)
}

size_t frame_size = bp - sp;
printk("stackdump",
"Dumping %s's stackframe\nStackframe size: 0x%x\n",
sym_lookup(res.trace_results[1]).name,
frame_size);
tty_write("<addr>\t\t <stack>\t <stack+8>\n");
trace(TRACE_ERROR,
"Dumping %s's stackframe\nStackframe size: 0x%x\n",
sym_lookup(res.trace_results[1]).name,
frame_size);
trace(TRACE_ERROR, "<addr>\t\t <stack>\t <stack+8>\n");

// The larger the stackframe the less likely the chance of seeing messages
// printed earlier due to the terminal scrolling. 0x18 was chosen randomly.
Expand All @@ -43,10 +44,11 @@ NORETURN void __panic(size_t bp, size_t sp, string_view fmt, ...)
// Dump stackframe of the function that called panic()
for (size_t i = 0; i < frame_size; i++)
{
tty_write("%lx: %p %p\n",
bp,
*(size_t *)(bp),
*(size_t *)(bp + sizeof(size_t)));
trace(TRACE_ERROR,
"%lx: %p %p\n",
bp,
*(size_t *)(bp),
*(size_t *)(bp + sizeof(size_t)));
bp += sizeof(size_t) * 2;
}

Expand Down
2 changes: 1 addition & 1 deletion kernel/platform/acpi/x86/acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ AcpiTable acpi_find_table(string_view identifier)
}
}

printk("acpi", "Could not find table '%s'\n", identifier);
trace(TRACE_HARDWARE, "Could not find table '%s'\n", identifier);
return NULL;
}

Expand Down
10 changes: 5 additions & 5 deletions kernel/platform/acpi/x86/madt/madt.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ struct apic_device_info madt_init(void *madt_base)
pic_disable();
enumarate_apic_devices(&madt);

trace(TRACE_MISC, "OEM String: '%s'\n", oem_str);
trace(TRACE_MISC, "OEM Table ID: '%s'\n", oem_table_id);
trace(TRACE_HARDWARE, "OEM String: '%s'\n", oem_str);
trace(TRACE_HARDWARE, "OEM Table ID: '%s'\n", oem_table_id);

return apic_dev;
}
Expand All @@ -61,7 +61,7 @@ static void enumarate_apic_devices(madt_t **madt)
{
case 0 ... 5:
{
trace(TRACE_MISC,
trace(TRACE_HARDWARE,
"Detected %s\n",
interrupt_device_id_map[*madt_interrupt_devices]);

Expand All @@ -84,12 +84,12 @@ static void enumarate_apic_devices(madt_t **madt)
}

case 9:
printk("madt", "Detected x2APIC\n");
trace(TRACE_HARDWARE, "Detected x2APIC\n");
madt_interrupt_devices += madt_interrupt_devices[1];
break;

default:
trace(TRACE_MISC,
trace(TRACE_HARDWARE,
"Invalid interrupt device detected, got %d, expected 0-5 "
"or 9\n",
*madt_interrupt_devices);
Expand Down
23 changes: 10 additions & 13 deletions kernel/printk.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,29 +23,26 @@ void printk_init(bool verbose_boot, HandoverFramebuffer fb)
is_verbose_boot = verbose_boot;
}

void printk(string_view status, string_view fmt, ...)
void printk(StringView status, StringView fmt, ...)
{
if (unlikely(!is_verbose_boot))
return;

char buffer[512];
va_list arg;
va_start(arg, fmt);
vsnprintf((string)&buffer, (size_t)-1, fmt, arg);
vsnprintf(buffer, sizeof(buffer), fmt.data, arg);
va_end(arg);

tty_write("[core#%d] %s: %s", current_cpu(), status, buffer);
}

void tty_write(string_view fmt, ...)
{
char buffer[512];
va_list arg;
va_start(arg, fmt);
vsnprintf((string)&buffer, (size_t)-1, fmt, arg);
va_end(arg);
char output[512];
snprintf(output,
sizeof(output),
"[core#%d] %s: %s",
current_cpu(),
status.data,
buffer);

arch_tty_write((string_view)&buffer);
arch_tty_write(str(output));
}

// Note: This should only be called when information
Expand Down
44 changes: 23 additions & 21 deletions kernel/printk.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define FMT_PRINTK_H

#include <base/base-types.h>
#include <base/string.h>
#include <moon-io/serial.h>
#include <moon-sys/handover.h>

Expand All @@ -16,39 +17,40 @@
debug(true, x, __VA_ARGS__); \
} while (0)

#define trace(bitmask, ...) \
do \
{ \
if (bitmask & TRACE_MASK) \
printk(PR_MODULE, __VA_ARGS__); \
#define trace(bitmask, fmt, ...) \
do \
{ \
if (bitmask & TRACE_MASK) \
printk(str(PR_MODULE), str(fmt), ##__VA_ARGS__); \
} while (0)

#define TRACE_MASK (TRACE_ALL)

enum
{
TRACE_BOOT = (1 << 0),
TRACE_INT = (1 << 1),
TRACE_DEBUG = (1 << 2),
TRACE_SYSCALL = (1 << 3),
TRACE_MISC = (1 << 4), // For logs with no specific category
TRACE_TASK = (1 << 5),
TRACE_SERVICE = (1 << 6),
TRACE_ELF = (1 << 7),
TRACE_SLAB = (1 << 8),
TRACE_BUDDY = (1 << 9),
TRACE_TLSF = (1 << 10),
TRACE_ALLOC = (1 << 11),
TRACE_IPC = (1 << 12),
TRACE_CAP = (1 << 13),
TRACE_BOOT = (1 << 0),
TRACE_INT = (1 << 1),
TRACE_DEBUG = (1 << 2),
TRACE_SYSCALL = (1 << 3),
TRACE_MISC = (1 << 4), // For logs with no specific category
TRACE_TASK = (1 << 5),
TRACE_SERVICE = (1 << 6),
TRACE_ELF = (1 << 7),
TRACE_SLAB = (1 << 8),
TRACE_BUDDY = (1 << 9),
TRACE_TLSF = (1 << 10),
TRACE_ALLOC = (1 << 11),
TRACE_IPC = (1 << 12),
TRACE_CAP = (1 << 13),
TRACE_ERROR = (1 << 14),
TRACE_HARDWARE = (1 << 15),

TRACE_ALL = ~0,
TRACE_NONE = 0,
};

void printk(string_view status, string_view fmt, ...);
void printk_init(bool verbose_boot, HandoverFramebuffer fb);
void tty_write(string_view fmt, ...);
void printk(StringView status, StringView fmt, ...);

// Note: This should only be called when information
// must be shown, a kernel panic for example
Expand Down
14 changes: 7 additions & 7 deletions kernel/trace/sym.c
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
#define PR_MODULE "sym"
#if defined(__x86_64__)
#include "sym.h"
#include <printk.h>
#include <base/base-types.h>
#include <base/string.h>
#include <moon-io/serial.h>
#include <printk.h>

extern SymbolTable symbol_table[];

SymbolTable sym_lookup(uint64_t address)
{
uint64_t corrected_address = 0;
uint64_t index_new = 0;
uint64_t index_new = 0;

for (int i = 0;; i++)
{
Expand All @@ -24,15 +25,14 @@ SymbolTable sym_lookup(uint64_t address)
if (sym_addr > corrected_address)
{
corrected_address = sym_addr;
index_new = i;
index_new = i;
}
}

if (sym_addr == 0xFFFFFFFF)
{
return (SymbolTable){
.addr = corrected_address,
.name = symbol_table[index_new].name};
return (SymbolTable){.addr = corrected_address,
.name = symbol_table[index_new].name};
}
}
}
Expand All @@ -58,7 +58,7 @@ int64_t find_symbol_by_name(string name)
void backtrace_symbol(uint64_t address)
{
SymbolTable sym = sym_lookup(address);
printk("backtrace", "%llx - %s\n", sym.addr, sym.name);
trace(TRACE_MISC, "%llx - %s\n", sym.addr, sym.name);
debug(false, "%llx - %s\n", sym.addr, sym.name);
}
#endif
14 changes: 14 additions & 0 deletions libs/base/cstring.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#ifndef LIB_KERNEL_CSTRING_H
#define LIB_KERNEL_CSTRING_H

#include <base/base-types.h>

int strcmp(const char *str1, const char *str2);
int strncmp(string_view str1, string_view str2, size_t n);
char *strcpy(char *dest, string_view src);
char *strcat(char *a, char *b);
uint64_t strlen(string_view s);
char *strrev(char *src);
bool isdigit(int c);

#endif // LIB_KERNEL_CSTRING_H
Loading