#include <stdarg.h> // va_list
#include "farptr.h" // GET_VAR
-#include "util.h" // bprintf
+#include "util.h" // printf
#include "biosvar.h" // struct bregs
static void
call16_int(0x10, &br);
}
-// XXX
-#define PORT_DEBUG 0x403
-
// Write a charcter to the framebuffer.
static void
putc(u16 action, char c)
{
- outb(c, PORT_DEBUG);
+ outb(c, PORT_BIOS_DEBUG);
if (action) {
if (c == '\n')
screenc('\r');
puts_cs(u16 action, const char *s)
{
for (;; s++) {
- char c = GET_VAR(CS, (u8)*s);
+ char c = GET_VAR(CS, *(u8*)s);
if (!c)
break;
putc(action, c);
return c - '0' < 10;
}
-void
-bprintf(u16 action, const char *fmt, ...)
+static void
+bvprintf(u16 action, const char *fmt, va_list args)
{
- va_list args;
- va_start(args, fmt);
const char *s = fmt;
for (;; s++) {
- char c = GET_VAR(CS, (u8)*s);
+ char c = GET_VAR(CS, *(u8*)s);
if (!c)
break;
if (c != '%') {
}
const char *n = s+1;
for (;;) {
- c = GET_VAR(CS, (u8)*n);
+ c = GET_VAR(CS, *(u8*)n);
if (!isdigit(c))
break;
n++;
if (c == 'l') {
// Ignore long format indicator
n++;
- c = GET_VAR(CS, (u8)*n);
+ c = GET_VAR(CS, *(u8*)n);
}
s32 val;
const char *sarg;
val = va_arg(args, s32);
putuint(action, val);
break;
+ case 'p':
case 'x':
val = va_arg(args, s32);
puthex(action, val);
val = va_arg(args, int);
putc(action, val);
break;
+ case '.':
+ // Hack to support "%.s" - meaning string on stack.
+ if (GET_VAR(CS, *(u8*)(n+1)) != 's')
+ break;
+ n++;
+ sarg = va_arg(args, const char *);
+ puts(action, sarg);
+ break;
case 's':
sarg = va_arg(args, const char *);
puts_cs(action, sarg);
}
s = n;
}
+}
+
+void
+BX_PANIC(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ bvprintf(0, fmt, args);
+ va_end(args);
+
+ // XXX - use PANIC PORT.
+ irq_disable();
+ for (;;)
+ hlt();
+}
+
+void
+BX_INFO(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ bvprintf(0, fmt, args);
+ va_end(args);
+}
+
+void
+printf(const char *fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ bvprintf(1, fmt, args);
va_end(args);
}
dump_regs(const char *fname, const char *type, struct bregs *regs)
{
if (!regs) {
- bprintf(0, "%s %s: NULL\n", type, fname);
+ BX_INFO("%s %s: NULL\n", type, fname);
return;
}
- bprintf(0, "%s %s: a=%x b=%x c=%x d=%x si=%x di=%x\n"
+ BX_INFO("%s %s: a=%x b=%x c=%x d=%x si=%x di=%x\n"
, type, fname, regs->eax, regs->ebx, regs->ecx, regs->edx
, regs->esi, regs->edi);
- bprintf(0, " ds=%x es=%x ip=%x cs=%x f=%x\n"
- , regs->ds, regs->es
- , regs->ip, regs->cs, regs->flags);
+ BX_INFO(" ds=%x es=%x ip=%x cs=%x f=%x r=%p\n"
+ , regs->ds, regs->es, regs->ip, regs->cs, regs->flags, regs);
}
void