Temporary "default output" global, makefile changes.

Default output variable holds a generic writer, and any output that
isn't really sure where to output to can just output there. Set by the
system early in boot.

Also made some changes to the makefile to support arguments in the "make
run" or "make debug" subset of calls. For now, it's just VGA=1/0 or
SERIAL=1/0 to enable/disable VGA/serial. Defaults are VGA=1, SERIAL=0.
This commit is contained in:
lordtet 2025-07-04 02:20:31 -04:00
parent 62ab718e4d
commit 53198515c8
5 changed files with 34 additions and 23 deletions

View file

@ -25,6 +25,19 @@ OBJECTS := $(OBJECTS:.s=.o)
OUT_ELF := $(BIN_DIR)/ukern.elf
OUT_ISO := $(BIN_DIR)/uOS.iso
###QEMU CONFIG
QEMU_FLAGS :=
VGA ?= 1
SERIAL ?= 0
ifeq ($(VGA), 0)
QEMU_FLAGS += -display none
endif
ifeq ($(SERIAL), 1)
QEMU_FLAGS += -serial stdio
endif
###RULES
.PHONY: all
@ -61,16 +74,16 @@ iso: $(OUT_ISO)
.PHONY: run
run: $(OUT_ELF)
$(QEMU) -kernel $(OUT_ELF)
$(QEMU) $(QEMU_FLAGS) -kernel $(OUT_ELF)
.PHONY: debug
debug:
$(QEMU) -s -S -kernel $(OUT_ELF)
$(QEMU) $(QEMU_FLAGS) -s -S -kernel $(OUT_ELF)
.PHONY: run_iso
run_iso:
$(QEMU) -cdrom $(OUT_ISO)
$(QEMU) $(QEMU_FLAGS) -cdrom $(OUT_ISO)
.PHONY: debug_iso
debug_iso:
$(QEMU) -s -S -cdrom $(OUT_ISO)
$(QEMU) $(QEMU_FLAGS) -s -S -cdrom $(OUT_ISO)

View file

@ -14,6 +14,8 @@ struct char_writer_s {
void* ctx;
};
extern char_writer_t* default_output;
int putc(char_writer_t*, char);
int print(char_writer_t*, const char*);
int println(char_writer_t*, const char*);

View file

@ -4,21 +4,13 @@
#include "serial.h"
void generic_isr_handler(StateSnapshot_t* cpu_state) {
//We made it to C for our interrupt! For now, let's just print our interrupt to the screen.
//What's cookin for outputs?
char_writer_t* out = 0;
if(default_COM) {
out = default_COM;
} else if(default_vga) {
out = default_vga;
vga_clear_ctx(default_vga->ctx);
}
switch(cpu_state->interrupt_id) {
default:
if(out){
printf(out, "INTERRUPT TRIGGERED! Info below.\n");
printf(out, "Int_ID|ERR: %X|%X\n", cpu_state->interrupt_id, cpu_state->error_code);
printf(out, "EFLAGS|CS|EIP: %X|%X|%X\n", cpu_state->eflags, cpu_state->cs,cpu_state->eip);
printf(out, "GP Registers:\neax:%X\nebx:%X\necx:%X\nedx:%X\nesp:%X\nebp:%X\nesi:%X\nedi:%X\n",
if(default_output){
printf(default_output, "INTERRUPT TRIGGERED! Info below.\n");
printf(default_output, "Int_ID|ERR: %X|%X\n", cpu_state->interrupt_id, cpu_state->error_code);
printf(default_output, "EFLAGS|CS|EIP: %X|%X|%X\n", cpu_state->eflags, cpu_state->cs,cpu_state->eip);
printf(default_output, "GP Registers:\neax:%X\nebx:%X\necx:%X\nedx:%X\nesp:%X\nebp:%X\nesi:%X\nedi:%X\n",
cpu_state->eax,
cpu_state->ebx,
cpu_state->ecx,
@ -27,7 +19,7 @@ void generic_isr_handler(StateSnapshot_t* cpu_state) {
cpu_state->ebp,
cpu_state->esi,
cpu_state->edi);
printf(out, "HALT!");
printf(default_output, "HALT!");
while(1);
}
}

View file

@ -2,6 +2,8 @@
#include "kttools.h"
#include <stdarg.h>
char_writer_t* default_output = 0;
int printhex(char_writer_t* writer, uint32_t out) {
char buff[9];
i_to_str(out, buff, 9, 0x10);

View file

@ -34,16 +34,18 @@ void kern_main(uint32_t multiboot_magic, mb_info_t* multiboot_info)
default_COM = &serial_writer;
serial_init(&serial_ctx);
//AND OUR DEFAULT OUTPUT IS:
default_output = default_vga;
printf(&vga_writer, "Entry eax:%X\n", multiboot_magic);
printf(default_output, "Entry eax:%X\n", multiboot_magic);
if(multiboot_magic != 0x2BADB002) {
println(&vga_writer, "Bootloader not multiboot1 compliant! Needed for mmap, etc. Can't work without it, kthxbye!");
println(default_output, "Bootloader not multiboot1 compliant! Needed for mmap, etc. Can't work without it, kthxbye!");
return;
} else {
println(&vga_writer, "Multiboot detected! Continuing...");
println(default_output, "Multiboot detected! Continuing...");
}
printf(&vga_writer, "MEM_LOWER:%X\n", multiboot_info->mem_lower);
printf(&vga_writer, "MEM_UPPER:%X\n", multiboot_info->mem_upper);
printf(default_output, "MEM_LOWER:%X\n", multiboot_info->mem_lower);
printf(default_output, "MEM_UPPER:%X\n", multiboot_info->mem_upper);
}