From eb9460542e2b688bd7adb871779cc8e8f17ef82a Mon Sep 17 00:00:00 2001 From: Travis Geiselbrecht Date: Sun, 7 Sep 2008 22:32:49 -0700 Subject: [PATCH] [IO] rework dprintf to take a debug level, defined in DEBUGLEVEL printf at the moment just calls dprintf, but soon will become a seperate I/O queue. --- app/console/console.c | 25 ++++---- app/stringtests/string_tests.c | 42 ++++++------- app/tests/printf_tests.c | 104 ++++++++++++++++----------------- app/tests/thread_tests.c | 36 ++++++------ arch/arm/faults.c | 27 ++++----- include/assert.h | 8 +-- include/debug.h | 22 +++++++ include/platform/debug.h | 7 +-- include/stdio.h | 12 ++++ kernel/main.c | 26 ++++----- kernel/thread.c | 14 ++--- lib/debug/debug.c | 19 +++--- lib/heap/heap.c | 84 +++++++++++++++++++------- lib/libc/printf.c | 18 +++++- makefile | 2 +- platform/armemu/debug.c | 4 +- platform/at91sam7/debug.c | 4 +- platform/at91sam7/emac_dev.c | 17 +++--- platform/at91sam7/timer.c | 3 +- platform/integrator/debug.c | 6 +- platform/omap3/debug.c | 6 +- platform/omap5912/debug.c | 6 +- 22 files changed, 293 insertions(+), 199 deletions(-) create mode 100644 include/stdio.h diff --git a/app/console/console.c b/app/console/console.c index 6fa4a4b8..7f450b59 100644 --- a/app/console/console.c +++ b/app/console/console.c @@ -25,6 +25,7 @@ #include #include #include +#include static cmd_block *command_list = NULL; @@ -81,7 +82,7 @@ static int read_line(char *buffer, int len) char c; /* loop until we get a char */ - if (dgetc(&c) < 0) + if (getc(&c) < 0) continue; // printf("c = 0x%hhx\n", c); @@ -90,16 +91,16 @@ static int read_line(char *buffer, int len) switch (c) { case '\r': case '\n': - dputc(c); + putc(c); goto done; case 0x7f: // backspace or delete case 0x8: if (pos > 0) { pos--; - dputs("\x1b[1D"); // move to the left one - dputc(' '); - dputs("\x1b[1D"); // move to the left one + puts("\x1b[1D"); // move to the left one + putc(' '); + puts("\x1b[1D"); // move to the left one } break; @@ -109,7 +110,7 @@ static int read_line(char *buffer, int len) default: buffer[pos++] = c; - dputc(c); + putc(c); } } else if (escape_level == 1) { // inside an escape, look for '[' @@ -123,14 +124,14 @@ static int read_line(char *buffer, int len) switch (c) { case 67: // right arrow buffer[pos++] = ' '; - dputc(' '); + putc(' '); break; case 68: // left arrow if (pos > 0) { pos--; - dputs("\x1b[1D"); // move to the left one - dputc(' '); - dputs("\x1b[1D"); // move to the left one + puts("\x1b[1D"); // move to the left one + putc(' '); + puts("\x1b[1D"); // move to the left one } break; case 65: // up arrow @@ -145,7 +146,7 @@ static int read_line(char *buffer, int len) /* end of line. */ if (pos == (len - 1)) { - dputs("\nerror: line too long\n"); + puts("\nerror: line too long\n"); pos = 0; goto done; } @@ -240,7 +241,7 @@ static void console_loop(void) printf("entering main console loop\n"); for (;;) { - dputs("] "); + puts("] "); int len = read_line(buffer, sizeof(buffer)); if (len == 0) diff --git a/app/stringtests/string_tests.c b/app/stringtests/string_tests.c index 6f158770..ac558b30 100644 --- a/app/stringtests/string_tests.c +++ b/app/stringtests/string_tests.c @@ -60,7 +60,7 @@ static void bench_memcpy(void) time_t null, libc, mine; size_t srcalign, dstalign; - dprintf("memcpy speed test\n"); + printf("memcpy speed test\n"); thread_sleep(200); // let the debug string clear the serial port for (srcalign = 0; srcalign < 64; ) { @@ -70,10 +70,10 @@ static void bench_memcpy(void) libc = bench_memcpy_routine(&memcpy, srcalign, dstalign); mine = bench_memcpy_routine(&mymemcpy, srcalign, dstalign); - dprintf("srcalign %lu, dstalign %lu\n", srcalign, dstalign); - dprintf(" null memcpy %u msecs\n", null); - dprintf(" libc memcpy %u msecs, %llu bytes/sec\n", libc, BUFFER_SIZE * ITERATIONS * 1000ULL / libc); - dprintf(" my memcpy %u msecs, %llu bytes/sec\n", mine, BUFFER_SIZE * ITERATIONS * 1000ULL / mine); + printf("srcalign %lu, dstalign %lu\n", srcalign, dstalign); + printf(" null memcpy %u msecs\n", null); + printf(" libc memcpy %u msecs, %llu bytes/sec\n", libc, BUFFER_SIZE * ITERATIONS * 1000ULL / libc); + printf(" my memcpy %u msecs, %llu bytes/sec\n", mine, BUFFER_SIZE * ITERATIONS * 1000ULL / mine); if (dstalign == 0) dstalign = 1; @@ -102,7 +102,7 @@ static void validate_memcpy(void) size_t srcalign, dstalign, size; const size_t maxsize = 256; - dprintf("testing memcpy for correctness\n"); + printf("testing memcpy for correctness\n"); /* * do the simple tests to make sure that memcpy doesn't color outside @@ -110,10 +110,10 @@ static void validate_memcpy(void) */ for (srcalign = 0; srcalign < 64; srcalign++) { for (dstalign = 0; dstalign < 64; dstalign++) { -// dprintf("srcalign %zu, dstalign %zu\n", srcalign, dstalign); +// printf("srcalign %zu, dstalign %zu\n", srcalign, dstalign); for (size = 0; size < maxsize; size++) { -// dprintf("srcalign %zu, dstalign %zu, size %zu\n", srcalign, dstalign, size); +// printf("srcalign %zu, dstalign %zu, size %zu\n", srcalign, dstalign, size); fillbuf(src, maxsize * 2, 567); fillbuf(src2, maxsize * 2, 567); @@ -125,7 +125,7 @@ static void validate_memcpy(void) int comp = memcmp(dst, dst2, maxsize * 2); if (comp != 0) { - dprintf("error! srcalign %zu, dstalign %zu, size %zu\n", srcalign, dstalign, size); + printf("error! srcalign %zu, dstalign %zu, size %zu\n", srcalign, dstalign, size); } } } @@ -149,7 +149,7 @@ static void bench_memset(void) time_t libc, mine; size_t dstalign; - dprintf("memset speed test\n"); + printf("memset speed test\n"); thread_sleep(200); // let the debug string clear the serial port for (dstalign = 0; dstalign < 64; dstalign++) { @@ -157,9 +157,9 @@ static void bench_memset(void) libc = bench_memset_routine(&memset, dstalign); mine = bench_memset_routine(&mymemset, dstalign); - dprintf("dstalign %lu\n", dstalign); - dprintf(" libc memset %u msecs, %llu bytes/sec\n", libc, BUFFER_SIZE * ITERATIONS * 1000ULL / libc); - dprintf(" my memset %u msecs, %llu bytes/sec\n", mine, BUFFER_SIZE * ITERATIONS * 1000ULL / mine); + printf("dstalign %lu\n", dstalign); + printf(" libc memset %u msecs, %llu bytes/sec\n", libc, BUFFER_SIZE * ITERATIONS * 1000ULL / libc); + printf(" my memset %u msecs, %llu bytes/sec\n", mine, BUFFER_SIZE * ITERATIONS * 1000ULL / mine); } } @@ -169,10 +169,10 @@ static void validate_memset(void) int c; const size_t maxsize = 256; - dprintf("testing memset for correctness\n"); + printf("testing memset for correctness\n"); for (dstalign = 0; dstalign < 64; dstalign++) { - dprintf("align %zd\n", dstalign); + printf("align %zd\n", dstalign); for (size = 0; size < maxsize; size++) { for (c = 0; c < 256; c++) { @@ -184,7 +184,7 @@ static void validate_memset(void) int comp = memcmp(dst, dst2, maxsize * 2); if (comp != 0) { - dprintf("error! align %zu, c %d, size %zu\n", dstalign, c, size); + printf("error! align %zu, c %d, size %zu\n", dstalign, c, size); } } } @@ -201,14 +201,14 @@ static int string_tests(int argc, cmd_args *argv) src2 = memalign(64, BUFFER_SIZE + 256); dst2 = memalign(64, BUFFER_SIZE + 256); - dprintf("src %p, dst %p\n", src, dst); - dprintf("src2 %p, dst2 %p\n", src2, dst2); + printf("src %p, dst %p\n", src, dst); + printf("src2 %p, dst2 %p\n", src2, dst2); if (argc < 3) { - dprintf("not enough arguments:\n"); + printf("not enough arguments:\n"); usage: - dprintf("%s validate \n", argv[0].str); - dprintf("%s bench \n", argv[0].str); + printf("%s validate \n", argv[0].str); + printf("%s bench \n", argv[0].str); goto out; } diff --git a/app/tests/printf_tests.c b/app/tests/printf_tests.c index efabba8e..2c3ebc0f 100644 --- a/app/tests/printf_tests.c +++ b/app/tests/printf_tests.c @@ -25,66 +25,66 @@ void printf_tests(void) { - dprintf("printf tests\n"); + printf("printf tests\n"); - dprintf("numbers:\n"); - dprintf("int8: %hhd %hhd %hhd\n", -12, 0, 254); - dprintf("uint8: %hhu %hhu %hhu\n", -12, 0, 254); - dprintf("int16: %hd %hd %hd\n", -1234, 0, 1234); - dprintf("uint16:%hu %hu %hu\n", -1234, 0, 1234); - dprintf("int: %d %d %d\n", -12345678, 0, 12345678); - dprintf("uint: %u %u %u\n", -12345678, 0, 12345678); - dprintf("long: %ld %ld %ld\n", -12345678, 0, 12345678); - dprintf("ulong: %lu %lu %lu\n", -12345678, 0, 12345678); - dprintf("long: %D %D %D\n", -12345678, 0, 12345678); - dprintf("ulong: %U %U %U\n", -12345678, 0, 12345678); - dprintf("longlong: %lli %lli %lli\n", -12345678LL, 0LL, 12345678LL); - dprintf("ulonglong: %llu %llu %llu\n", -12345678LL, 0LL, 12345678LL); - dprintf("size_t: %zd %zd %zd\n", -12345678, 0, 12345678); - dprintf("usize_t: %zu %zu %zu\n", -12345678, 0, 12345678); + printf("numbers:\n"); + printf("int8: %hhd %hhd %hhd\n", -12, 0, 254); + printf("uint8: %hhu %hhu %hhu\n", -12, 0, 254); + printf("int16: %hd %hd %hd\n", -1234, 0, 1234); + printf("uint16:%hu %hu %hu\n", -1234, 0, 1234); + printf("int: %d %d %d\n", -12345678, 0, 12345678); + printf("uint: %u %u %u\n", -12345678, 0, 12345678); + printf("long: %ld %ld %ld\n", -12345678, 0, 12345678); + printf("ulong: %lu %lu %lu\n", -12345678, 0, 12345678); + printf("long: %D %D %D\n", -12345678, 0, 12345678); + printf("ulong: %U %U %U\n", -12345678, 0, 12345678); + printf("longlong: %lli %lli %lli\n", -12345678LL, 0LL, 12345678LL); + printf("ulonglong: %llu %llu %llu\n", -12345678LL, 0LL, 12345678LL); + printf("size_t: %zd %zd %zd\n", -12345678, 0, 12345678); + printf("usize_t: %zu %zu %zu\n", -12345678, 0, 12345678); - dprintf("hex:\n"); - dprintf("uint8: %hhx %hhx %hhx\n", -12, 0, 254); - dprintf("uint16:%hx %hx %hx\n", -1234, 0, 1234); - dprintf("uint: %x %x %x\n", -12345678, 0, 12345678); - dprintf("ulong: %lx %lx %lx\n", -12345678, 0, 12345678); - dprintf("ulong: %X %X %X\n", -12345678, 0, 12345678); - dprintf("ulonglong: %llx %llx %llx\n", -12345678LL, 0LL, 12345678LL); - dprintf("usize_t: %zx %zx %zx\n", -12345678, 0, 12345678); + printf("hex:\n"); + printf("uint8: %hhx %hhx %hhx\n", -12, 0, 254); + printf("uint16:%hx %hx %hx\n", -1234, 0, 1234); + printf("uint: %x %x %x\n", -12345678, 0, 12345678); + printf("ulong: %lx %lx %lx\n", -12345678, 0, 12345678); + printf("ulong: %X %X %X\n", -12345678, 0, 12345678); + printf("ulonglong: %llx %llx %llx\n", -12345678LL, 0LL, 12345678LL); + printf("usize_t: %zx %zx %zx\n", -12345678, 0, 12345678); - dprintf("alt/sign:\n"); - dprintf("uint: %#x %#X\n", 0xabcdef, 0xabcdef); - dprintf("int: %+d %+d\n", 12345678, -12345678); + printf("alt/sign:\n"); + printf("uint: %#x %#X\n", 0xabcdef, 0xabcdef); + printf("int: %+d %+d\n", 12345678, -12345678); - dprintf("formatting\n"); - dprintf("int: a%8da\n", 12345678); - dprintf("int: a%9da\n", 12345678); - dprintf("int: a%-9da\n", 12345678); - dprintf("int: a%10da\n", 12345678); - dprintf("int: a%-10da\n", 12345678); - dprintf("int: a%09da\n", 12345678); - dprintf("int: a%010da\n", 12345678); - dprintf("int: a%6da\n", 12345678); + printf("formatting\n"); + printf("int: a%8da\n", 12345678); + printf("int: a%9da\n", 12345678); + printf("int: a%-9da\n", 12345678); + printf("int: a%10da\n", 12345678); + printf("int: a%-10da\n", 12345678); + printf("int: a%09da\n", 12345678); + printf("int: a%010da\n", 12345678); + printf("int: a%6da\n", 12345678); - dprintf("a%1sa\n", "b"); - dprintf("a%9sa\n", "b"); - dprintf("a%-9sa\n", "b"); - dprintf("a%5sa\n", "thisisatest"); + printf("a%1sa\n", "b"); + printf("a%9sa\n", "b"); + printf("a%-9sa\n", "b"); + printf("a%5sa\n", "thisisatest"); int err; - err = dprintf("a"); - dprintf(" returned %d\n", err); - err = dprintf("ab"); - dprintf(" returned %d\n", err); - err = dprintf("abc"); - dprintf(" returned %d\n", err); - err = dprintf("abcd"); - dprintf(" returned %d\n", err); - err = dprintf("abcde"); - dprintf(" returned %d\n", err); - err = dprintf("abcdef"); - dprintf(" returned %d\n", err); + err = printf("a"); + printf(" returned %d\n", err); + err = printf("ab"); + printf(" returned %d\n", err); + err = printf("abc"); + printf(" returned %d\n", err); + err = printf("abcd"); + printf(" returned %d\n", err); + err = printf("abcde"); + printf(" returned %d\n", err); + err = printf("abcdef"); + printf(" returned %d\n", err); } diff --git a/app/tests/thread_tests.c b/app/tests/thread_tests.c index 75127264..acbdfbd6 100644 --- a/app/tests/thread_tests.c +++ b/app/tests/thread_tests.c @@ -30,7 +30,7 @@ static int sleep_thread(void *arg) { for(;;) { - dprintf("sleeper %p\n", current_thread); + printf("sleeper %p\n", current_thread); thread_sleep(rand() % 500); } return 0; @@ -55,7 +55,7 @@ static int mutex_thread(void *arg) atomic_add(&mutex_thread_count, 1); - dprintf("mutex tester thread %p starting up, will go for %d iterations\n", current_thread, iterations); + printf("mutex tester thread %p starting up, will go for %d iterations\n", current_thread, iterations); for (i = 0; i < iterations; i++) { mutex_acquire(&m); @@ -80,9 +80,9 @@ static int mutex_timeout_thread(void *arg) mutex_t *timeout_mutex = (mutex_t *)arg; status_t err; - dprintf("mutex_timeout_thread acquiring mutex %p with 1 second timeout\n", timeout_mutex); + printf("mutex_timeout_thread acquiring mutex %p with 1 second timeout\n", timeout_mutex); err = mutex_acquire_timeout(timeout_mutex, 1000); - dprintf("mutex_acquire_timeout returns %d\n", err); + printf("mutex_acquire_timeout returns %d\n", err); return err; } @@ -92,9 +92,9 @@ static int mutex_zerotimeout_thread(void *arg) mutex_t *timeout_mutex = (mutex_t *)arg; status_t err; - dprintf("mutex_zerotimeout_thread acquiring mutex %p with zero second timeout\n", timeout_mutex); + printf("mutex_zerotimeout_thread acquiring mutex %p with zero second timeout\n", timeout_mutex); err = mutex_acquire_timeout(timeout_mutex, 0); - dprintf("mutex_acquire_timeout returns %d\n", err); + printf("mutex_acquire_timeout returns %d\n", err); return err; } @@ -112,9 +112,9 @@ int mutex_test(void) while (mutex_thread_count > 0) thread_yield(); - dprintf("done with simple mutex tests\n"); + printf("done with simple mutex tests\n"); - dprintf("testing mutex timeout\n"); + printf("testing mutex timeout\n"); mutex_t timeout_mutex; @@ -129,7 +129,7 @@ int mutex_test(void) thread_sleep(5000); mutex_release(&timeout_mutex); - dprintf("done with mutex tests\n"); + printf("done with mutex tests\n"); mutex_destroy(&timeout_mutex); @@ -140,13 +140,13 @@ static event_t e; static int event_signaller(void *arg) { - dprintf("event signaller pausing\n"); + printf("event signaller pausing\n"); thread_sleep(1000); // for (;;) { - dprintf("signalling event\n"); + printf("signalling event\n"); event_signal(&e, true); - dprintf("done signalling event\n"); + printf("done signalling event\n"); thread_yield(); // } @@ -155,15 +155,15 @@ static int event_signaller(void *arg) static int event_waiter(void *arg) { - dprintf("event waiter starting\n"); + printf("event waiter starting\n"); for (;;) { - dprintf("%p: waiting on event...\n", current_thread); + printf("%p: waiting on event...\n", current_thread); if (event_wait(&e) < 0) { - dprintf("%p: event_wait() returned error\n", current_thread); + printf("%p: event_wait() returned error\n", current_thread); return -1; } - dprintf("%p: done waiting on event...\n", current_thread); + printf("%p: done waiting on event...\n", current_thread); thread_yield(); } @@ -196,7 +196,7 @@ void event_test(void) static int quantum_tester(void *arg) { for (;;) { - dprintf("%p: in this thread. rq %d\n", current_thread, current_thread->remaining_quantum); + printf("%p: in this thread. rq %d\n", current_thread, current_thread->remaining_quantum); } return 0; } @@ -227,7 +227,7 @@ static int context_switch_tester(void *arg) } total_count += debug_cycle_count() - count; thread_sleep(1000); - dprintf("took %u cycles to yield %d times, %u per yield, %u per yield per thread\n", + printf("took %u cycles to yield %d times, %u per yield, %u per yield per thread\n", total_count, iter, total_count / iter, total_count / iter / thread_count); event_signal(&context_switch_done_event, true); diff --git a/arch/arm/faults.c b/arch/arm/faults.c index 487db1f8..020266ae 100644 --- a/arch/arm/faults.c +++ b/arch/arm/faults.c @@ -26,20 +26,20 @@ static void dump_fault_frame(struct arm_fault_frame *frame) { - dprintf("r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n", frame->r[0], frame->r[1], frame->r[2], frame->r[3]); - dprintf("r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n", frame->r[4], frame->r[5], frame->r[6], frame->r[7]); - dprintf("r8 0x%08x r9 0x%08x r10 0x%08x r11 0x%08x\n", frame->r[8], frame->r[9], frame->r[10], frame->r[11]); - dprintf("r12 0x%08x usp 0x%08x ulr 0x%08x pc 0x%08x\n", frame->r[12], frame->usp, frame->ulr, frame->pc); - dprintf("spsr 0x%08x\n", frame->spsr); + dprintf(CRITICAL, "r0 0x%08x r1 0x%08x r2 0x%08x r3 0x%08x\n", frame->r[0], frame->r[1], frame->r[2], frame->r[3]); + dprintf(CRITICAL, "r4 0x%08x r5 0x%08x r6 0x%08x r7 0x%08x\n", frame->r[4], frame->r[5], frame->r[6], frame->r[7]); + dprintf(CRITICAL, "r8 0x%08x r9 0x%08x r10 0x%08x r11 0x%08x\n", frame->r[8], frame->r[9], frame->r[10], frame->r[11]); + dprintf(CRITICAL, "r12 0x%08x usp 0x%08x ulr 0x%08x pc 0x%08x\n", frame->r[12], frame->usp, frame->ulr, frame->pc); + dprintf(CRITICAL, "spsr 0x%08x\n", frame->spsr); struct arm_mode_regs regs; arm_save_mode_regs(®s); - dprintf("%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_FIQ) ? '*' : ' ', "fiq", regs.fiq_r13, regs.fiq_r14); - dprintf("%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_IRQ) ? '*' : ' ', "irq", regs.irq_r13, regs.irq_r14); - dprintf("%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_SVC) ? '*' : ' ', "svc", regs.svc_r13, regs.svc_r14); - dprintf("%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_UND) ? '*' : ' ', "und", regs.und_r13, regs.und_r14); - dprintf("%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_SYS) ? '*' : ' ', "sys", regs.sys_r13, regs.sys_r14); + dprintf(CRITICAL, "%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_FIQ) ? '*' : ' ', "fiq", regs.fiq_r13, regs.fiq_r14); + dprintf(CRITICAL, "%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_IRQ) ? '*' : ' ', "irq", regs.irq_r13, regs.irq_r14); + dprintf(CRITICAL, "%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_SVC) ? '*' : ' ', "svc", regs.svc_r13, regs.svc_r14); + dprintf(CRITICAL, "%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_UND) ? '*' : ' ', "und", regs.und_r13, regs.und_r14); + dprintf(CRITICAL, "%c%s r13 0x%08x r14 0x%08x\n", ((frame->spsr & MODE_MASK) == MODE_SYS) ? '*' : ' ', "sys", regs.sys_r13, regs.sys_r14); // dump the bottom of the current stack addr_t stack; @@ -54,7 +54,7 @@ static void dump_fault_frame(struct arm_fault_frame *frame) } if (stack != 0) { - dprintf("bottom of stack at 0x%08x:\n", (unsigned int)stack); + dprintf(CRITICAL, "bottom of stack at 0x%08x:\n", (unsigned int)stack); hexdump((void *)stack, 128); } } @@ -63,9 +63,10 @@ static void exception_die(struct arm_fault_frame *frame, int pc_off, const char { inc_critical_section(); frame->pc += pc_off; - dprintf(msg); + dprintf(CRITICAL, msg); dump_fault_frame(frame); - debug_halt(); + + halt(); for(;;); } diff --git a/include/assert.h b/include/assert.h index db58611b..332dfdb9 100644 --- a/include/assert.h +++ b/include/assert.h @@ -24,14 +24,14 @@ #define __ASSERT_H #include -#include +#include #define ASSERT(x) \ - do { if (unlikely(!(x))) { dprintf("ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); debug_halt(); } } while (0) + do { if (unlikely(!(x))) { panic("ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); } } while (0) -#if DEBUG +#if DEBUGLEVEL > 1 #define DEBUG_ASSERT(x) \ - do { if (unlikely(!(x))) { dprintf("DEBUG ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); debug_halt(); } } while (0) + do { if (unlikely(!(x))) { panic("DEBUG ASSERT FAILED at (%s:%d): %s\n", __FILE__, __LINE__, #x); } } while (0) #else #define DEBUG_ASSERT(x) \ do { } while(0) diff --git a/include/debug.h b/include/debug.h index 1013e87c..e5ebc197 100644 --- a/include/debug.h +++ b/include/debug.h @@ -24,6 +24,8 @@ #define __DEBUG_H #include +#include +#include #include #include @@ -37,6 +39,26 @@ extern "C" { #define DEBUGLEVEL 2 #endif +/* debug levels */ +#define CRITICAL 0 +#define ALWAYS 0 +#define INFO 1 +#define SPEW 2 + +/* output */ +void _dputc(char c); // XXX for now, platform implements +int _dputs(const char *str); +int _dprintf(const char *fmt, ...) __PRINTFLIKE(1, 2); +int _dvprintf(const char *fmt, va_list ap); + +#define dputc(level, str) do { if ((level) <= DEBUGLEVEL) { _dputc(str); } } while (0) +#define dputs(level, str) do { if ((level) <= DEBUGLEVEL) { _dputs(str); } } while (0) +#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x); } } while (0) +#define dvprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dvprintf(x); } } while (0) + +/* input */ +int dgetc(char *c); + /* systemwide halts */ void halt(void) __NO_RETURN; diff --git a/include/platform/debug.h b/include/platform/debug.h index 2a480064..4ab460a4 100644 --- a/include/platform/debug.h +++ b/include/platform/debug.h @@ -31,11 +31,6 @@ extern "C" { #endif -void dputc(char c); -int dgetc(char *c); -int dputs(const char *str); -int dprintf(const char *fmt, ...) __PRINTFLIKE(1, 2); -int dvprintf(const char *fmt, va_list ap); void debug_dump_regs(void); uint32_t debug_cycle_count(void); @@ -45,7 +40,7 @@ void debug_dump_memory_words(void *mem, int len); void debug_set_trace_level(int trace_type, int level); -void debug_halt(void) __NO_RETURN; +void platform_halt(void) __NO_RETURN; #if defined(__cplusplus) } diff --git a/include/stdio.h b/include/stdio.h new file mode 100644 index 00000000..ebabfca9 --- /dev/null +++ b/include/stdio.h @@ -0,0 +1,12 @@ +#ifndef __STDIO_H +#define __STDIO_H + +#include +#include + +void putc(char c); +int puts(const char *str); +int getc(char *c); // XXX not really getc + +#endif + diff --git a/kernel/main.c b/kernel/main.c index cfe39b23..7fa8d593 100644 --- a/kernel/main.c +++ b/kernel/main.c @@ -67,30 +67,30 @@ void kmain(void) // do any super early target initialization target_early_init(); - dprintf("welcome to lk\n\n"); + dprintf(INFO, "welcome to lk\n\n"); // deal with any static constructors - dprintf("calling constructors\n"); + dprintf(SPEW, "calling constructors\n"); call_constructors(); // bring up the kernel heap - dprintf("initializing heap\n"); + dprintf(SPEW, "initializing heap\n"); heap_init(); // initialize the threading system - dprintf("initializing threads\n"); + dprintf(SPEW, "initializing threads\n"); thread_init(); // initialize the dpc system - dprintf("initializing dpc\n"); + dprintf(SPEW, "initializing dpc\n"); dpc_init(); // initialize kernel timers - dprintf("initializing timers\n"); + dprintf(SPEW, "initializing timers\n"); timer_init(); // create a thread to complete system initialization - dprintf("creating bootstrap completion thread\n"); + dprintf(SPEW, "creating bootstrap completion thread\n"); thread_resume(thread_create("bootstrap2", &bootstrap2, NULL, DEFAULT_PRIORITY, DEFAULT_STACK_SIZE)); // enable interrupts @@ -104,19 +104,19 @@ int main(void); static int bootstrap2(void *arg) { - dprintf("top of bootstrap2()\n"); + dprintf(SPEW, "top of bootstrap2()\n"); arch_init(); // initialize the rest of the platform - dprintf("initializing rest of platform\n"); + dprintf(SPEW, "initializing platform\n"); platform_init(); - - // initialize the rest of the target - dprintf("initializing rest of target\n"); + + // initialize the target + dprintf(SPEW, "initializing target\n"); target_init(); - dprintf("calling project_init()\n"); + dprintf(SPEW, "calling sys_init()\n"); project_init(); return 0; diff --git a/kernel/thread.c b/kernel/thread.c index 6de7d6bb..fc9d9cae 100644 --- a/kernel/thread.c +++ b/kernel/thread.c @@ -156,7 +156,7 @@ static void thread_cleanup_dpc(void *thread) { thread_t *t = (thread_t *)thread; -// dprintf("thread_cleanup_dpc: thread %p (%s)\n", t, t->name); +// dprintf(SPEW, "thread_cleanup_dpc: thread %p (%s)\n", t, t->name); #if THREAD_CHECKS ASSERT(t->state == THREAD_DEATH); @@ -238,7 +238,7 @@ void thread_resched(void) #endif int next_queue = HIGHEST_PRIORITY - __builtin_clz(run_queue_bitmap) - (32 - NUM_PRIORITIES); -// dprintf("bitmap 0x%x, next %d\n", run_queue_bitmap, next_queue); + //dprintf(SPEW, "bitmap 0x%x, next %d\n", run_queue_bitmap, next_queue); newthread = list_remove_head_type(&run_queue[next_queue], thread_t, queue_node); @@ -451,11 +451,11 @@ void thread_become_idle(void) void dump_thread(thread_t *t) { - dprintf("dump_thread: t %p (%s)\n", t, t->name); - dprintf("\tstate %d, priority %d, remaining quantum %d, critical section %d\n", t->state, t->priority, t->remaining_quantum, t->saved_critical_section_count); - dprintf("\tstack %p, stack_size %zd\n", t->stack, t->stack_size); - dprintf("\tentry %p, arg %p\n", t->entry, t->arg); - dprintf("\twait queue %p, wait queue ret %d\n", t->blocking_wait_queue, t->wait_queue_block_ret); + dprintf(INFO, "dump_thread: t %p (%s)\n", t, t->name); + dprintf(INFO, "\tstate %d, priority %d, remaining quantum %d, critical section %d\n", t->state, t->priority, t->remaining_quantum, t->saved_critical_section_count); + dprintf(INFO, "\tstack %p, stack_size %zd\n", t->stack, t->stack_size); + dprintf(INFO, "\tentry %p, arg %p\n", t->entry, t->arg); + dprintf(INFO, "\twait queue %p, wait queue ret %d\n", t->blocking_wait_queue, t->wait_queue_block_ret); } void dump_all_threads(void) diff --git a/lib/debug/debug.c b/lib/debug/debug.c index a7a717c4..10b25a79 100644 --- a/lib/debug/debug.c +++ b/lib/debug/debug.c @@ -29,6 +29,7 @@ #include #include #include +#include #include void spin(uint32_t usecs) @@ -42,31 +43,31 @@ void spin(uint32_t usecs) void halt(void) { enter_critical_section(); // disable ints - for(;;); + platform_halt(); } void _panic(void *caller, const char *fmt, ...) { - dprintf("panic (caller %p): ", caller); + dprintf(ALWAYS, "panic (caller %p): ", caller); va_list ap; va_start(ap, fmt); - dvprintf(fmt, ap); + _dvprintf(fmt, ap); va_end(ap); halt(); } -int dputs(const char *str) +int _dputs(const char *str) { while(*str != 0) { - dputc(*str++); + _dputc(*str++); } return 0; } -int dprintf(const char *fmt, ...) +int _dprintf(const char *fmt, ...) { char buf[256]; int err; @@ -76,19 +77,19 @@ int dprintf(const char *fmt, ...) err = vsprintf(buf, fmt, ap); va_end(ap); - dputs(buf); + dputs(ALWAYS, buf); return err; } -int dvprintf(const char *fmt, va_list ap) +int _dvprintf(const char *fmt, va_list ap) { char buf[256]; int err; err = vsprintf(buf, fmt, ap); - dputs(buf); + dputs(ALWAYS, buf); return err; } diff --git a/lib/heap/heap.c b/lib/heap/heap.c index 575c6b8f..2ed35c4a 100644 --- a/lib/heap/heap.c +++ b/lib/heap/heap.c @@ -24,19 +24,33 @@ #include #include #include -#include +#include #include +#include + +#define LOCAL_TRACE 0 #define ROUNDUP(a, b) (((a) + ((b)-1)) & ~((b)-1)) #define HEAP_MAGIC 'HEAP' +#if WITH_STATIC_HEAP + +#if !defined(HEAP_START) || !defined(HEAP_LEN) +#error WITH_STATIC_HEAP set but no HEAP_START or HEAP_LEN defined +#endif + +#else // end of the binary extern int _end; // end of memory extern int _end_of_ram; +#define HEAP_START ((unsigned long)&_end) +#define HEAP_LEN ((size_t)&_end_of_ram - (size_t)&_end) +#endif + struct free_heap_chunk { struct list_node node; size_t len; @@ -60,14 +74,14 @@ struct alloc_struct_begin { static void dump_free_chunk(struct free_heap_chunk *chunk) { - dprintf("\t\tbase %p, end 0x%lx, len 0x%lx\n", chunk, (vaddr_t)chunk + chunk->len, chunk->len); + dprintf(INFO, "\t\tbase %p, end 0x%lx, len 0x%zx\n", chunk, (vaddr_t)chunk + chunk->len, chunk->len); } static void heap_dump(void) { - dprintf("Heap dump:\n"); - dprintf("\tbase %p, len 0x%lx\n", theheap.base, theheap.len); - dprintf("\tfree list:\n"); + dprintf(INFO, "Heap dump:\n"); + dprintf(INFO, "\tbase %p, len 0x%zx\n", theheap.base, theheap.len); + dprintf(INFO, "\tfree list:\n"); struct free_heap_chunk *chunk; list_for_every_entry(&theheap.free_list, chunk, struct free_heap_chunk, node) { @@ -103,17 +117,17 @@ static void heap_test(void) unsigned int index = (unsigned int)rand() % 16; if ((i % (16*1024)) == 0) - dprintf("pass %d\n", i); + printf("pass %d\n", i); -// dprintf("index 0x%x\n", index); +// printf("index 0x%x\n", index); if (ptr[index]) { -// dprintf("freeing ptr[0x%x] = %p\n", index, ptr[index]); +// printf("freeing ptr[0x%x] = %p\n", index, ptr[index]); heap_free(ptr[index]); ptr[index] = 0; } unsigned int align = 1 << ((unsigned int)rand() % 8); ptr[index] = heap_alloc((unsigned int)rand() % 32768, align); -// dprintf("ptr[0x%x] = %p, align 0x%x\n", index, ptr[index], align); +// printf("ptr[0x%x] = %p, align 0x%x\n", index, ptr[index], align); DEBUG_ASSERT(((addr_t)ptr[index] % align) == 0); // heap_dump(); @@ -131,7 +145,7 @@ static void heap_test(void) // nearby ones if possible. Returns base of whatever chunk it became in the list. static struct free_heap_chunk *heap_insert_free_chunk(struct free_heap_chunk *chunk) { -#if DEBUG +#if DEBUGLEVEL > INFO vaddr_t chunk_end = (vaddr_t)chunk + chunk->len; #endif @@ -199,7 +213,7 @@ void *heap_alloc(size_t size, unsigned int alignment) { void *ptr; -// dprintf("%s: size %zd, align %d\n", __PRETTY_FUNCTION__, size, alignment); + LTRACEF("size %zd, align %d\n", size, alignment); // alignment must be power of 2 if (alignment & (alignment - 1)) @@ -278,7 +292,7 @@ void *heap_alloc(size_t size, unsigned int alignment) } } -// dprintf("%s: returning ptr %p\n", __PRETTY_FUNCTION__, ptr); + LTRACEF("returning ptr %p\n", ptr); // heap_dump(); @@ -292,7 +306,7 @@ void heap_free(void *ptr) if (ptr == 0) return; -// dprintf("%s: ptr %p\n", __PRETTY_FUNCTION__, ptr); + LTRACEF("ptr %p\n", ptr); // check for the old allocation structure struct alloc_struct_begin *as = (struct alloc_struct_begin *)ptr; @@ -300,7 +314,7 @@ void heap_free(void *ptr) DEBUG_ASSERT(as->magic == HEAP_MAGIC); -// dprintf("%s: allocation was %d bytes long at ptr %p\n", __FUNCTION__, as->size, as->ptr); + LTRACEF("allocation was %zd bytes long at ptr %p\n", as->size, as->ptr); // looks good, create a free chunk and add it to the pool enter_critical_section(); @@ -312,13 +326,13 @@ void heap_free(void *ptr) void heap_init(void) { - dprintf("%s: entry\n", __PRETTY_FUNCTION__); + LTRACE_ENTRY; // set the heap range - theheap.base = (void *)&_end; - theheap.len = ((unsigned) &_end_of_ram) - ((unsigned) &_end); + theheap.base = (void *)HEAP_START; + theheap.len = HEAP_LEN; - dprintf("%s: heap size %ld bytes\n", __PRETTY_FUNCTION__, theheap.len); + LTRACEF("base %p size %zd bytes\n", theheap.base, theheap.len); // initialize the free list list_initialize(&theheap.free_list); @@ -327,10 +341,40 @@ void heap_init(void) heap_insert_free_chunk(heap_create_free_chunk(theheap.base, theheap.len)); // dump heap info - // heap_dump(); +// heap_dump(); -// dprintf("running heap tests\n"); +// dprintf(INFO, "running heap tests\n"); // heap_test(); } +#if DEBUGLEVEL > 1 +#if WITH_APP_CONSOLE + +#include + +static int cmd_heap(int argc, const cmd_args *argv); + +STATIC_COMMAND_START + { "heap", "heap debug commands", &cmd_heap }, +STATIC_COMMAND_END(heap); + +static int cmd_heap(int argc, const cmd_args *argv) +{ + if (argc < 2) { + printf("not enough arguments\n"); + return -1; + } + + if (strcmp(argv[1].str, "info") == 0) { + heap_dump(); + } else { + printf("unrecognized command\n"); + return -1; + } + + return 0; +} + +#endif +#endif diff --git a/lib/libc/printf.c b/lib/libc/printf.c index 806d5a92..af9379e0 100644 --- a/lib/libc/printf.c +++ b/lib/libc/printf.c @@ -20,19 +20,35 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include #include #include #include #include #include +void putc(char c) +{ + return _dputc(c); +} + +int puts(const char *str) +{ + return _dputs(str); +} + +int getc(char *c) +{ + return dgetc(c); +} + int printf(const char *fmt, ...) { int err; va_list ap; va_start(ap, fmt); - err = dvprintf(fmt, ap); + err = _dvprintf(fmt, ap); va_end(ap); return err; diff --git a/makefile b/makefile index a40bda08..fe533da3 100644 --- a/makefile +++ b/makefile @@ -2,7 +2,7 @@ include macros.mk PROJECT ?= beagle-test -DEBUG ?= 1 +DEBUG ?= 2 BUILDDIR := build-$(PROJECT) OUTBIN := $(BUILDDIR)/lk.bin diff --git a/platform/armemu/debug.c b/platform/armemu/debug.c index aca3931c..09aabd56 100644 --- a/platform/armemu/debug.c +++ b/platform/armemu/debug.c @@ -27,7 +27,7 @@ #include #include -void dputc(char c) +void _dputc(char c) { *REG8(DEBUG_STDOUT) = c; } @@ -48,7 +48,7 @@ void debug_dump_regs(void) *REG32(DEBUG_REGDUMP) = 1; } -void debug_halt(void) +void platform_halt(void) { *REG32(DEBUG_HALT) = 1; for(;;); diff --git a/platform/at91sam7/debug.c b/platform/at91sam7/debug.c index 2cca7b34..ad8f2623 100644 --- a/platform/at91sam7/debug.c +++ b/platform/at91sam7/debug.c @@ -64,12 +64,12 @@ void ser_puts(const char *s) } } -void dputc(char c) +void _dputc(char c) { ser_putc(c); } -void debug_halt() +void platform_halt() { arch_disable_ints(); for(;;); diff --git a/platform/at91sam7/emac_dev.c b/platform/at91sam7/emac_dev.c index d042ef63..03a32378 100644 --- a/platform/at91sam7/emac_dev.c +++ b/platform/at91sam7/emac_dev.c @@ -20,6 +20,7 @@ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +#include #include #include #include @@ -98,7 +99,7 @@ int emac_init(void) AT91PMC *pmc = AT91PMC_ADDR; AT91RSTC *rstc = AT91RSTC_ADDR; - dprintf("emac_init()\n"); + dprintf(INFO, "emac_init()\n"); /* enable clock to EMAC */ pmc->PCER = (1 << PID_EMAC); @@ -119,7 +120,7 @@ int emac_init(void) thread_sleep(30); - dprintf("emac_init() - reset phy\n"); + dprintf(INFO, "emac_init() - reset phy\n"); /* assert the RST line and wait until the it deasserts */ rstc->CR = RSTC_KEY | RSTC_EXTRST; @@ -135,14 +136,14 @@ int emac_init(void) thread_sleep(1000); - dprintf("emac_init() - read state\n"); + dprintf(INFO, "emac_init() - read state\n"); emac->NCR = NCR_MPE; emac->NCFG = NCFG_CLK_d64; - dprintf("bcr = %x\n", mi_rd(emac, MII_REG_BCR)); - dprintf("id1 = %x\n", mi_rd(emac, MII_REG_PHY_ID1)); - dprintf("id2 = %x\n", mi_rd(emac, MII_REG_PHY_ID2)); + dprintf(INFO, "bcr = %x\n", mi_rd(emac, MII_REG_BCR)); + dprintf(INFO, "id1 = %x\n", mi_rd(emac, MII_REG_PHY_ID1)); + dprintf(INFO, "id2 = %x\n", mi_rd(emac, MII_REG_PHY_ID2)); #if 0 unsigned state, last; @@ -175,7 +176,7 @@ int emac_init(void) default: name = "unknown"; } - dprintf("link state: %s\n", name); + dprintf(INFO, "link state: %s\n", name); } thread_sleep(100); } @@ -225,7 +226,7 @@ int ethernet_send(void *data, unsigned len) waited++; } - if(waited) dprintf("W%d\n",waited); + if(waited) dprintf(INFO, "W%d\n",waited); if(xe->addr != 0) { free((void*) xe->addr); diff --git a/platform/at91sam7/timer.c b/platform/at91sam7/timer.c index 52224c59..be65e9c9 100644 --- a/platform/at91sam7/timer.c +++ b/platform/at91sam7/timer.c @@ -21,6 +21,7 @@ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include +#include #include #include @@ -76,7 +77,7 @@ status_t platform_set_periodic_timer(platform_timer_callback callback, AT91PIT *pit = AT91PIT_ADDR; n = AT91_MCK_MHZ / 16 / 1000; - dprintf("timer: MCK=%dKHz, n=%d\n", AT91_MCK_MHZ / 1000, n); + dprintf(INFO, "timer: MCK=%dKHz, n=%d\n", AT91_MCK_MHZ / 1000, n); enter_critical_section(); diff --git a/platform/integrator/debug.c b/platform/integrator/debug.c index ab9f9010..0a2e0585 100644 --- a/platform/integrator/debug.c +++ b/platform/integrator/debug.c @@ -93,7 +93,7 @@ static int uart_getc(int port, bool wait) /* returns -1 if no data available */ return -1; } -void dputc(char c) +void _dputc(char c) { uart_putc(0, c); } @@ -114,9 +114,9 @@ void debug_dump_regs(void) PANIC_UNIMPLEMENTED; } -void debug_halt(void) +void platform_halt(void) { - dprintf("HALT: spinning forever...\n"); + dprintf(ALWAYS, "HALT: spinning forever...\n"); for(;;); } diff --git a/platform/omap3/debug.c b/platform/omap3/debug.c index 973287b6..ac6300d3 100644 --- a/platform/omap3/debug.c +++ b/platform/omap3/debug.c @@ -30,7 +30,7 @@ #include #include -void dputc(char c) +void _dputc(char c) { if (c == '\n') uart_putc(DEBUG_UART, '\r'); @@ -53,9 +53,9 @@ void debug_dump_regs(void) PANIC_UNIMPLEMENTED; } -void debug_halt(void) +void platform_halt(void) { - dprintf("HALT: spinning forever...\n"); + dprintf(ALWAYS, "HALT: spinning forever...\n"); for(;;); } diff --git a/platform/omap5912/debug.c b/platform/omap5912/debug.c index cb3ea29d..d190fa01 100644 --- a/platform/omap5912/debug.c +++ b/platform/omap5912/debug.c @@ -87,7 +87,7 @@ static int uart_getc(int port, bool wait) /* returns -1 if no data available */ return read_uart_reg(port, UART_RHR); } -void dputc(char c) +void _dputc(char c) { if (c == '\n') uart_putc(0, '\r'); @@ -110,9 +110,9 @@ void debug_dump_regs(void) PANIC_UNIMPLEMENTED; } -void debug_halt(void) +void platform_halt(void) { - dprintf("HALT: spinning forever...\n"); + dprintf(ALWAYS, "HALT: spinning forever...\n"); for(;;); }