1 // Raw screen writing code.
3 // Copyright (C) 2008 Kevin O'Connor <kevin@koconnor.net>
5 // This file may be distributed under the terms of the GNU GPLv3 license.
7 #include <stdarg.h> // va_list
9 #include "farptr.h" // GET_VAR
10 #include "util.h" // printf
11 #include "bregs.h" // struct bregs
12 #include "config.h" // CONFIG_*
14 #define DEBUG_PORT 0x03f8
15 #define DEBUG_TIMEOUT 100000
20 if (!CONFIG_DEBUG_SERIAL)
22 // setup for serial logging: 8N1
23 u8 oldparam, newparam = 0x03;
24 oldparam = inb(DEBUG_PORT+3);
25 outb(newparam, DEBUG_PORT+3);
27 u8 oldier, newier = 0;
28 oldier = inb(DEBUG_PORT+1);
29 outb(newier, DEBUG_PORT+1);
31 if (oldparam != newparam || oldier != newier)
32 dprintf(1, "Changing serial settings was %x/%x now %x/%x\n"
33 , oldparam, oldier, newparam, newier);
39 int timeout = DEBUG_TIMEOUT;
40 while ((inb(DEBUG_PORT+5) & 0x60) != 0x60)
51 memset(&br, 0, sizeof(br));
54 call16_int(0x10, &br);
57 // Write a charcter to the framebuffer.
59 putc(u16 action, char c)
61 if (CONFIG_DEBUG_LEVEL) {
62 if (! CONFIG_COREBOOT)
63 // Send character to debug port.
64 outb(c, PORT_BIOS_DEBUG);
65 if (CONFIG_DEBUG_SERIAL) {
66 // Send character to serial port.
74 // Send character to video screen.
81 // Write a string to the framebuffer.
83 puts(u16 action, const char *s)
89 // Write a string to the framebuffer.
91 puts_cs(u16 action, const char *s)
94 char c = GET_VAR(CS, *(u8*)s);
101 // Write an unsigned integer to the screen.
103 putuint(u16 action, u32 val)
106 char *d = &buf[sizeof(buf) - 1];
109 *d = (val % 10) + '0';
118 // Write a single digit hex character to the screen.
120 putsinglehex(u16 action, u32 val)
125 val = 'a' + val - 10;
129 // Write an integer in hexadecimal to the screen.
131 puthex(u16 action, u32 val)
133 putsinglehex(action, (val >> 28) & 0xf);
134 putsinglehex(action, (val >> 24) & 0xf);
135 putsinglehex(action, (val >> 20) & 0xf);
136 putsinglehex(action, (val >> 16) & 0xf);
137 putsinglehex(action, (val >> 12) & 0xf);
138 putsinglehex(action, (val >> 8) & 0xf);
139 putsinglehex(action, (val >> 4) & 0xf);
140 putsinglehex(action, (val >> 0) & 0xf);
150 bvprintf(u16 action, const char *fmt, va_list args)
154 char c = GET_VAR(CS, *(u8*)s);
163 c = GET_VAR(CS, *(u8*)n);
169 // Ignore long format indicator
171 c = GET_VAR(CS, *(u8*)n);
180 val = va_arg(args, s32);
185 putuint(action, val);
188 val = va_arg(args, s32);
189 putuint(action, val);
193 val = va_arg(args, s32);
197 val = va_arg(args, int);
201 // Hack to support "%.s" - meaning string on stack.
202 if (GET_VAR(CS, *(u8*)(n+1)) != 's')
205 sarg = va_arg(args, const char *);
209 sarg = va_arg(args, const char *);
210 puts_cs(action, sarg);
221 BX_PANIC(const char *fmt, ...)
225 bvprintf(0, fmt, args);
228 // XXX - use PANIC PORT.
235 __dprintf(const char *fmt, ...)
239 bvprintf(0, fmt, args);
244 printf(const char *fmt, ...)
248 bvprintf(1, fmt, args);
253 dump_regs(struct bregs *regs)
256 dprintf(1, " NULL\n");
259 dprintf(1, " a=%x b=%x c=%x d=%x si=%x di=%x\n"
260 , regs->eax, regs->ebx, regs->ecx, regs->edx
261 , regs->esi, regs->edi);
262 dprintf(1, " ds=%x es=%x ip=%x cs=%x f=%x r=%p\n"
263 , regs->ds, regs->es, regs->ip, regs->cs, regs->flags, regs);
267 __debug_isr(const char *fname)
273 // Function called on handler startup.
275 __debug_enter(const char *fname, struct bregs *regs)
277 dprintf(1, "enter %s:\n", fname);
282 __debug_stub(const char *fname, int lineno, struct bregs *regs)
284 dprintf(1, "stub %s:%d:\n", fname, lineno);
289 __set_fail(const char *fname, int lineno, struct bregs *regs)
291 dprintf(1, "fail %s:%d:\n", fname, lineno);
293 set_fail_silent(regs);
297 __set_code_fail(const char *fname, int lineno, struct bregs *regs, u8 code)
299 dprintf(1, "fail %s:%d(%x):\n", fname, lineno, code);
301 set_code_fail_silent(regs, code);