Make kprintf_internal so panic.h can use it.
This commit is contained in:
parent
b4d5f8f6eb
commit
663c2712fd
6 changed files with 75 additions and 63 deletions
|
|
@ -3,7 +3,7 @@
|
|||
A monolithic hobbyist kernel written in C and Assembly for the RISC-V 64-bit architecture.
|
||||
|
||||
## Project Overview
|
||||
The Gemini Kernel is a from-scratch operating system project designed to explore low-level systems programming, memory management, and hardware-software interfacing.
|
||||
The Squidge Kernel is a from-scratch operating system project designed to explore low-level systems programming, memory management, and hardware-software interfacing.
|
||||
|
||||
### Target Architecture
|
||||
* **Architecture**: RISC-V (RV64GC)
|
||||
|
|
|
|||
|
|
@ -130,62 +130,66 @@ void kputs(const char *str)
|
|||
knewline();
|
||||
}
|
||||
|
||||
void kprintf_internal(const char *format, va_list args)
|
||||
{
|
||||
for (const char *p = format; *p != '\0'; p++)
|
||||
{
|
||||
if (*p == '%')
|
||||
{
|
||||
p++;
|
||||
switch (*p)
|
||||
{
|
||||
case 'c':
|
||||
{
|
||||
char c = (char)va_arg(args, int);
|
||||
kputchar(c);
|
||||
break;
|
||||
}
|
||||
case 's':
|
||||
{
|
||||
char *s = va_arg(args, char *);
|
||||
kprint(s);
|
||||
break;
|
||||
}
|
||||
case 'd':
|
||||
{
|
||||
int d = va_arg(args, int);
|
||||
kprint_int(d);
|
||||
break;
|
||||
}
|
||||
case 'f':
|
||||
{
|
||||
double f = va_arg(args, double);
|
||||
kprint_float((float)f);
|
||||
break;
|
||||
}
|
||||
case 'x': // Hex
|
||||
case 'p': // Pointer
|
||||
{
|
||||
uint64_t x = va_arg(args, uint64_t);
|
||||
kprint_hex(x);
|
||||
break;
|
||||
}
|
||||
case '%':
|
||||
kputchar('%');
|
||||
break;
|
||||
default:
|
||||
kputchar('%');
|
||||
kputchar(*p);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
kputchar(*p);
|
||||
}
|
||||
}
|
||||
knewline();
|
||||
}
|
||||
|
||||
void kprintf(const char *format, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
|
||||
for (const char *p = format; *p != '\0'; p++)
|
||||
{
|
||||
if (*p == '%')
|
||||
{
|
||||
p++;
|
||||
switch (*p)
|
||||
{
|
||||
case 'c':
|
||||
{
|
||||
char c = (char)va_arg(args, int);
|
||||
kputchar(c);
|
||||
break;
|
||||
}
|
||||
case 's':
|
||||
{
|
||||
char *s = va_arg(args, char *);
|
||||
kprint(s);
|
||||
break;
|
||||
}
|
||||
case 'd':
|
||||
{
|
||||
int d = va_arg(args, int);
|
||||
kprint_int(d);
|
||||
break;
|
||||
}
|
||||
case 'f':
|
||||
{
|
||||
double f = va_arg(args, double);
|
||||
kprint_float((float)f);
|
||||
break;
|
||||
}
|
||||
case 'x': // Hex
|
||||
case 'p': // Pointer
|
||||
{
|
||||
uint64_t x = va_arg(args, uint64_t);
|
||||
kprint_hex(x);
|
||||
break;
|
||||
}
|
||||
case '%':
|
||||
kputchar('%');
|
||||
break;
|
||||
default:
|
||||
kputchar('%');
|
||||
kputchar(*p);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
kputchar(*p);
|
||||
}
|
||||
}
|
||||
va_end(args);
|
||||
knewline();
|
||||
va_list args;
|
||||
va_start(args, format);
|
||||
kprintf_internal(format, args);
|
||||
va_end(args);
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
#include <stdarg.h>
|
||||
|
||||
#ifndef UART_H
|
||||
#define UART_H
|
||||
|
||||
#define UART_RBR (volatile uint8_t *)(UART_ADDRESS + 0)
|
||||
#define UART_LSR (volatile uint8_t *)(UART_ADDRESS + 5)
|
||||
#define UART_ADDRESS 0x10000000
|
||||
|
|
@ -13,6 +14,7 @@ void uart_handle_interrupt();
|
|||
int kputchar(int ch);
|
||||
void kprint_hex(uint64_t val);
|
||||
void kprint_int(int num);
|
||||
void kprintf_internal(const char *format, va_list args);
|
||||
void kprintf(const char *format, ...);
|
||||
void kprint_float(float num);
|
||||
void knewline();
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
#include <stdarg.h>
|
||||
#include <drivers/uart.h>
|
||||
#include <syscon/syscon.h>
|
||||
#include <kernel/plic.h>
|
||||
|
|
@ -21,11 +22,14 @@ void interrupt_init()
|
|||
kputs("OK");
|
||||
}
|
||||
|
||||
void kpanic(const char *reason)
|
||||
void kpanic(const char *reason, ...)
|
||||
{
|
||||
va_list args;
|
||||
va_start(args, reason);
|
||||
kputs("\n!!! PANIC !!!\n");
|
||||
kputs(reason);
|
||||
kprintf_internal(reason, args);
|
||||
kputs("\n!!! PANIC !!!\n");
|
||||
va_end(args);
|
||||
poweroff();
|
||||
}
|
||||
|
||||
|
|
@ -80,7 +84,7 @@ void handle_trap()
|
|||
kpanic("Reason: Illegal Instruction\n");
|
||||
break;
|
||||
case 3:
|
||||
kpanic("Reason: Breakpoint (ebreak)\n");
|
||||
kpanic("Reason: Breakpoint (ebreak) %s\n", "woo!");
|
||||
break;
|
||||
case 4:
|
||||
kpanic("Reason: Load Address Misaligned\n");
|
||||
|
|
@ -96,7 +100,7 @@ void handle_trap()
|
|||
break;
|
||||
default:
|
||||
break;
|
||||
// kpanic("Reason: Unknown Exception Code %d\n", cause);
|
||||
kpanic("Reason: Unknown Exception Code %d\n", cause);
|
||||
}
|
||||
kprintf("Faulting Address (if applicable): %x\n", mtval);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
#define PANIC_H
|
||||
|
||||
void interrupt_init();
|
||||
void kpanic(const char *);
|
||||
void kpanic(const char *, ...);
|
||||
void kpanic_force();
|
||||
void handle_interrupt(unsigned long code);
|
||||
|
||||
|
|
|
|||
|
|
@ -16,4 +16,6 @@ void kmain()
|
|||
uart_init();
|
||||
page_init();
|
||||
interrupt_init();
|
||||
|
||||
kpanic_force();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue