diff --git a/include/sys/debug.h b/include/sys/debug.h index 9fabc4e..8c9d1c6 100644 --- a/include/sys/debug.h +++ b/include/sys/debug.h @@ -23,6 +23,8 @@ #define kfatal(f, ...) debugf(DEBUG_FATAL, "[%s] " f, __func__, ##__VA_ARGS__) #define kprint(l, f, ...) debugf(l, "[%s] " f, __func__, ##__VA_ARGS__) +void fmtsiz(char *buf, size_t sz); + void debugc(int level, char c); void debugs(int level, const char *s); diff --git a/sys/amd64/mm/heap.c b/sys/amd64/mm/heap.c index 9ca4c30..4214180 100644 --- a/sys/amd64/mm/heap.c +++ b/sys/amd64/mm/heap.c @@ -118,6 +118,6 @@ void amd64_heap_dump(const heap_t *heap) { block; block = block->next) { assert((block->magic & HEAP_MAGIC) == HEAP_MAGIC, "Corrupted heap block magic\n"); - kdebug("%p: %u %s%s\n", block, block->size, (block->magic & 1 ? "USED" : "FREE"), (block->next ? " -> " : "")); + kdebug("%p: %S %s%s\n", block, block->size, (block->magic & 1 ? "USED" : "FREE"), (block->next ? " -> " : "")); } } diff --git a/sys/amd64/mm/mm.c b/sys/amd64/mm/mm.c index d6c9d9f..0b5ba76 100644 --- a/sys/amd64/mm/mm.c +++ b/sys/amd64/mm/mm.c @@ -41,9 +41,9 @@ void amd64_mm_init(void) { // Allocate some pages for kernel heap (base size: 16MiB) uintptr_t heap_base_phys = amd64_phys_alloc_contiguous(KERNEL_HEAP >> 12); - // TODO: pretty-print sizes - assert(heap_base_phys != MM_NADDR, "Could not allocate %uKiB of memory for kernel heap\n", KERNEL_HEAP >> 10); - kdebug("Setting up kernel heap of %uKiB @ %p\n", KERNEL_HEAP >> 10, heap_base_phys); + assert(heap_base_phys != MM_NADDR, "Could not allocate %S of memory for kernel heap\n", KERNEL_HEAP); + kdebug("Setting up kernel heap of %S @ %p\n", KERNEL_HEAP, heap_base_phys); amd64_heap_init(heap_global, heap_base_phys, KERNEL_HEAP); + amd64_heap_dump(heap_global); } diff --git a/sys/amd64/mm/phys.c b/sys/amd64/mm/phys.c index 7c649c3..5ab94b8 100644 --- a/sys/amd64/mm/phys.c +++ b/sys/amd64/mm/phys.c @@ -65,7 +65,7 @@ void amd64_phys_free(uintptr_t page) { // XXX: very slow impl. uintptr_t amd64_phys_alloc_contiguous(size_t count) { uintptr_t addr = 0; - kdebug("Requested %luKiB\n", count << 2); + kdebug("Requested %S\n", count << 12); if (count >= (PHYS_MAX_INDEX << 6)) { // The requested range is too large @@ -115,8 +115,7 @@ void amd64_phys_memory_map(const multiboot_memory_map_t *mmap, size_t length) { uintptr_t page_aligned_end = (entry->addr + entry->len) & ~0xFFF; if (entry->type == 1 && page_aligned_end > page_aligned_begin) { - // TODO: size pretty-printing - kdebug("+++ %uKiB @ %p\n", (page_aligned_end - page_aligned_begin) / 1024, page_aligned_begin); + kdebug("+++ %S @ %p\n", page_aligned_end - page_aligned_begin, page_aligned_begin); for (uintptr_t addr = page_aligned_begin - PHYS_ALLOWED_BEGIN; addr < (page_aligned_end - PHYS_ALLOWED_BEGIN); addr += 0x1000) { @@ -133,6 +132,5 @@ void amd64_phys_memory_map(const multiboot_memory_map_t *mmap, size_t length) { curr_item += entry->size + sizeof(uint32_t); } - // TODO: size pretty-printing - kdebug("%uKiB available\n", total_phys << 2); + kdebug("%S available\n", total_phys << 12); } diff --git a/sys/debug.c b/sys/debug.c index dfe2c9d..e6aa58f 100644 --- a/sys/debug.c +++ b/sys/debug.c @@ -10,6 +10,34 @@ static const char *s_debug_xs_set0 = "0123456789abcdef"; static const char *s_debug_xs_set1 = "0123456789ABCDEF"; +void fmtsiz(char *out, size_t sz) { + static const char sizs[] = "KMGTPE???"; + size_t f = sz, r = 0; + int pwr = 0; + size_t l = 0; + + while (f >= 1536) { + r = ((f % 1024) * 10) / 1024; + f /= 1024; + ++pwr; + } + + debug_ds(f, out, 0, 0); + l = strlen(out); + + if (pwr) { + out[l++] = '.'; + out[l++] = '0' + r; + + out[l++] = sizs[pwr - 1]; + + out[l++] = 'i'; + } + + out[l++] = 'B'; + out[l++] = 0; +} + // TODO: make debugc a __weak function of a character void debugc(int level, char c) { #if defined(ARCH_AMD64) @@ -233,6 +261,11 @@ void debugfv(int level, const char *fmt, va_list args) { debug_xs(value.v_ptr, buf, s_debug_xs_set0); debugspl(level, buf, '0', sizeof(uintptr_t) * 2); break; + case 'S': + value.v_ptr = va_arg(args, uintptr_t); + fmtsiz(buf, value.v_ptr); + debugsp(level, buf, padc, padn); + break; case 's': value.v_string = va_arg(args, const char *); debugsp(level, value.v_string ? value.v_string : "(null)", padc, padn);