From 56fea336d67f8f13ccd465c600cdf5bb72ceb2d6 Mon Sep 17 00:00:00 2001 From: Daniel Hammer Date: Fri, 6 Mar 2026 22:09:11 +0100 Subject: [PATCH] fix: memory and other improvements --- kernel/src/Api/Heap.hpp | 7 +- kernel/src/Sched/Scheduler.hpp | 2 +- programs/include/gui/canvas.hpp | 46 +++++- programs/include/gui/truetype.hpp | 12 +- programs/include/montauk/heap.h | 202 ++++++++++++++++++++------- programs/include/montauk/string.h | 46 +++++- programs/lib/libc/libc.c | 223 +++++++++++++++++++++++++----- programs/lib/libc/obj/libc.o | Bin 91408 -> 102208 bytes programs/lib/libjpeg/libjpeg.a | Bin 330158 -> 330158 bytes programs/lib/tls/libtls.a | Bin 106042 -> 106098 bytes programs/lib/tls/obj/tls.o | Bin 105648 -> 105704 bytes programs/src/desktop/main.cpp | 2 +- programs/src/fontpreview/Makefile | 9 +- programs/src/imageviewer/main.cpp | 3 +- 14 files changed, 445 insertions(+), 107 deletions(-) diff --git a/kernel/src/Api/Heap.hpp b/kernel/src/Api/Heap.hpp index 5d85e76..a2ec73d 100644 --- a/kernel/src/Api/Heap.hpp +++ b/kernel/src/Api/Heap.hpp @@ -18,7 +18,7 @@ namespace Montauk { uint64_t numPages; }; - static constexpr int MaxHeapAllocs = 128; + static constexpr int MaxHeapAllocs = 512; static HeapAlloc g_heapAllocs[Sched::MaxProcesses][MaxHeapAllocs]; static int g_heapAllocCount[Sched::MaxProcesses]; @@ -43,6 +43,7 @@ namespace Montauk { uint64_t userVa = proc->heapNext; uint64_t numPages = size / 0x1000; + // Allocate physical pages and map them into the process for (uint64_t i = 0; i < numPages; i++) { void* page = Memory::g_pfa->AllocateZeroed(); if (page == nullptr) return 0; @@ -90,7 +91,7 @@ namespace Montauk { uint64_t va = g_heapAllocs[slot][idx].va; uint64_t numPages = g_heapAllocs[slot][idx].numPages; - // Free each physical page and unmap the virtual address + // Free physical pages in bulk and unmap virtual addresses for (uint64_t i = 0; i < numPages; i++) { uint64_t pageVa = va + i * 0x1000; uint64_t physAddr = Memory::VMM::Paging::GetPhysAddr(proc->pml4Phys, pageVa); @@ -100,7 +101,7 @@ namespace Montauk { Memory::VMM::Paging::UnmapUserIn(proc->pml4Phys, pageVa); } - if (slot >= 0) Sched::g_allocatedPages[slot] -= numPages; + Sched::g_allocatedPages[slot] -= numPages; // Remove tracking entry by swapping with the last element g_heapAllocs[slot][idx] = g_heapAllocs[slot][g_heapAllocCount[slot] - 1]; diff --git a/kernel/src/Sched/Scheduler.hpp b/kernel/src/Sched/Scheduler.hpp index 3632b9c..93f9af1 100644 --- a/kernel/src/Sched/Scheduler.hpp +++ b/kernel/src/Sched/Scheduler.hpp @@ -13,7 +13,7 @@ namespace Sched { static constexpr int MaxProcesses = 256; static constexpr uint64_t StackPages = 4; // 16 KiB kernel stack per process static constexpr uint64_t StackSize = StackPages * 0x1000; - static constexpr uint64_t UserStackPages = 4; // 16 KiB user stack + static constexpr uint64_t UserStackPages = 8; // 32 KiB user stack static constexpr uint64_t UserStackSize = UserStackPages * 0x1000; static constexpr uint64_t UserStackTop = 0x7FFFFFF000ULL; // User stack top VA static constexpr uint64_t UserHeapBase = 0x40000000ULL; // User heap start VA diff --git a/programs/include/gui/canvas.hpp b/programs/include/gui/canvas.hpp index 426e8e5..fda9d62 100644 --- a/programs/include/gui/canvas.hpp +++ b/programs/include/gui/canvas.hpp @@ -29,8 +29,18 @@ struct Canvas { void fill(Color c) { uint32_t px = c.to_pixel(); + uint64_t px2 = ((uint64_t)px << 32) | px; int total = w * h; - for (int i = 0; i < total; i++) pixels[i] = px; + int i = 0; + // Align to 8-byte boundary if needed + if (total > 0 && ((uint64_t)pixels & 4)) { + pixels[0] = px; + i = 1; + } + uint64_t* dst64 = (uint64_t*)(pixels + i); + int pairs = (total - i) / 2; + for (int p = 0; p < pairs; p++) dst64[p] = px2; + if ((total - i) & 1) pixels[total - 1] = px; } void put_pixel(int x, int y, Color c) { @@ -40,11 +50,25 @@ struct Canvas { void fill_rect(int x, int y, int rw, int rh, Color c) { uint32_t px = c.to_pixel(); + uint64_t px2 = ((uint64_t)px << 32) | px; int x0 = gui_max(x, 0), y0 = gui_max(y, 0); int x1 = gui_min(x + rw, w), y1 = gui_min(y + rh, h); - for (int dy = y0; dy < y1; dy++) - for (int dx = x0; dx < x1; dx++) - pixels[dy * w + dx] = px; + for (int dy = y0; dy < y1; dy++) { + uint32_t* row = pixels + dy * w; + int dx = x0; + // Align to 8-byte boundary + if (dx < x1 && ((uint64_t)(row + dx) & 4)) { + row[dx] = px; + dx++; + } + // Bulk 2-pixel writes + uint64_t* dst64 = (uint64_t*)(row + dx); + int pairs = (x1 - dx) / 2; + for (int p = 0; p < pairs; p++) dst64[p] = px2; + dx += pairs * 2; + // Remainder + if (dx < x1) row[dx] = px; + } } void fill_rounded_rect(int x, int y, int rw, int rh, int radius, Color c) { @@ -77,8 +101,18 @@ struct Canvas { if (y < 0 || y >= h) return; uint32_t px = c.to_pixel(); int x0 = gui_max(x, 0), x1 = gui_min(x + len, w); - for (int dx = x0; dx < x1; dx++) - pixels[y * w + dx] = px; + uint32_t* row = pixels + y * w; + int dx = x0; + if (dx < x1 && ((uint64_t)(row + dx) & 4)) { + row[dx] = px; + dx++; + } + uint64_t px2 = ((uint64_t)px << 32) | px; + uint64_t* dst64 = (uint64_t*)(row + dx); + int pairs = (x1 - dx) / 2; + for (int p = 0; p < pairs; p++) dst64[p] = px2; + dx += pairs * 2; + if (dx < x1) row[dx] = px; } void vline(int x, int y, int len, Color c) { diff --git a/programs/include/gui/truetype.hpp b/programs/include/gui/truetype.hpp index 26f3e9d..7706763 100644 --- a/programs/include/gui/truetype.hpp +++ b/programs/include/gui/truetype.hpp @@ -136,11 +136,15 @@ struct TrueTypeFont { return gc; } - // Evict oldest cache (slot 0) and shift others down - GlyphCache evicted = caches[0]; + // Evict oldest cache (slot 0) — free its glyph bitmaps + for (int g = 0; g < 256; g++) { + if (caches[0].glyphs[g].bitmap) + montauk::mfree(caches[0].glyphs[g].bitmap); + } + // Shift remaining caches down for (int i = 0; i < 3; i++) - caches[i] = caches[i + 1]; - caches[3] = evicted; + montauk::memcpy(&caches[i], &caches[i + 1], sizeof(GlyphCache)); + montauk::memset(&caches[3], 0, sizeof(GlyphCache)); init_cache(&caches[3], pixel_size); return &caches[3]; } diff --git a/programs/include/montauk/heap.h b/programs/include/montauk/heap.h index 267c2b6..1fa0e72 100644 --- a/programs/include/montauk/heap.h +++ b/programs/include/montauk/heap.h @@ -1,18 +1,18 @@ /* * heap.h * Userspace heap allocator for MontaukOS programs - * Free-list allocator backed by SYS_ALLOC page requests. - * Adapted from the kernel HeapAllocator. - * Copyright (c) 2025 Daniel Hammer + * Copyright (c) 2025 Daniel Hammer */ #pragma once #include +#include namespace montauk { namespace heap_detail { static constexpr uint64_t HEADER_MAGIC = 0x5A484541; // "ZHEA" + static constexpr uint64_t FREED_MAGIC = 0xDEADFEEE; struct Header { uint64_t magic; @@ -24,29 +24,118 @@ namespace heap_detail { FreeNode* next; }; + // Segregated free lists: power-of-2 size classes for blocks <= 4096 bytes. + // Blocks larger than 4096 go to the overflow list. + static constexpr int NUM_BUCKETS = 8; + static constexpr uint64_t BUCKET_SIZES[NUM_BUCKETS] = { + 32, 64, 128, 256, 512, 1024, 2048, 4096 + }; + // Per-process heap state — must be `inline` (not `static`) so that all // translation units in a multi-TU program share a single heap. - inline FreeNode g_head{0, nullptr}; + inline FreeNode* g_buckets[NUM_BUCKETS] = {}; + inline FreeNode g_overflow{0, nullptr}; inline bool g_initialized = false; static inline Header* get_header(void* block) { return (Header*)((uint8_t*)block - sizeof(Header)); } - static inline void insert_free(void* ptr, uint64_t size) { - auto* node = (FreeNode*)ptr; - node->size = size; - node->next = g_head.next; - g_head.next = node; + // Determine which bucket a block size belongs to, or -1 for overflow + static inline int bucket_index(uint64_t blockSize) { + if (blockSize <= 32) return 0; + if (blockSize <= 64) return 1; + if (blockSize <= 128) return 2; + if (blockSize <= 256) return 3; + if (blockSize <= 512) return 4; + if (blockSize <= 1024) return 5; + if (blockSize <= 2048) return 6; + if (blockSize <= 4096) return 7; + return -1; + } + + // Insert into overflow list (sorted by address, with adjacent-block coalescing) + static inline void insert_overflow(void* ptr, uint64_t size) { + auto* node = (FreeNode*)ptr; + node->size = size; + + FreeNode* prev = &g_overflow; + FreeNode* cur = g_overflow.next; + while (cur != nullptr && cur < node) { + prev = cur; + cur = cur->next; + } + + bool merged_prev = false; + if (prev != &g_overflow && + (uint8_t*)prev + prev->size == (uint8_t*)node) { + prev->size += size; + node = prev; + merged_prev = true; + } + + if (cur != nullptr && + (uint8_t*)node + node->size == (uint8_t*)cur) { + node->size += cur->size; + node->next = cur->next; + if (!merged_prev) prev->next = node; + } else if (!merged_prev) { + node->next = cur; + prev->next = node; + } + } + + // Take a block of at least `needed` bytes from the overflow list. + // Splits remainder back into overflow if worthwhile. + static inline void* take_from_overflow(uint64_t needed) { + FreeNode* prev = &g_overflow; + FreeNode* cur = g_overflow.next; + + while (cur != nullptr) { + if (cur->size >= needed) { + uint64_t blockSize = cur->size; + prev->next = cur->next; + + if (blockSize > needed + sizeof(FreeNode) + 16) { + insert_overflow((uint8_t*)cur + needed, blockSize - needed); + } + return (void*)cur; + } + prev = cur; + cur = cur->next; + } + return nullptr; } static inline bool grow(uint64_t bytes) { uint64_t pages = (bytes + 0xFFF) / 0x1000; - if (pages < 4) pages = 4; // grow at least 16 KiB at a time + if (pages < 4) pages = 4; void* mem = montauk::alloc(pages * 0x1000); if (mem == nullptr) return false; - insert_free(mem, pages * 0x1000); + insert_overflow(mem, pages * 0x1000); + return true; + } + + // Refill a small-block bucket by carving a page-sized chunk from overflow + static inline bool refill_bucket(int idx) { + uint64_t bsize = BUCKET_SIZES[idx]; + uint64_t chunk = (bsize < 4096) ? 4096 : bsize; + + void* block = take_from_overflow(chunk); + if (block == nullptr) { + if (!grow(chunk)) return false; + block = take_from_overflow(chunk); + if (block == nullptr) return false; + } + + uint64_t count = chunk / bsize; + for (uint64_t i = 0; i < count; i++) { + auto* node = (FreeNode*)((uint8_t*)block + i * bsize); + node->size = bsize; + node->next = g_buckets[idx]; + g_buckets[idx] = node; + } return true; } @@ -63,41 +152,36 @@ namespace heap_detail { } uint64_t needed = size + sizeof(Header); - needed = (needed + 15) & ~15ULL; // 16-byte alignment + needed = (needed + 15) & ~15ULL; - FreeNode* prev = &g_head; - FreeNode* current = g_head.next; + int idx = bucket_index(needed); - while (current != nullptr) { - if (current->size >= needed) { - uint64_t blockSize = current->size; + if (idx >= 0) { + // Small allocation — use segregated bucket (O(1)) + if (g_buckets[idx] == nullptr && !refill_bucket(idx)) + return nullptr; - // Unlink - prev->next = current->next; + FreeNode* node = g_buckets[idx]; + g_buckets[idx] = node->next; - // Split if worthwhile - if (blockSize > needed + sizeof(FreeNode) + 16) { - void* rest = (void*)((uint8_t*)current + needed); - uint64_t restSize = blockSize - needed; - insert_free(rest, restSize); - } - - // Write allocation header - Header* header = (Header*)current; - header->magic = HEADER_MAGIC; - header->size = size; - - return (void*)((uint8_t*)header + sizeof(Header)); - } - - prev = current; - current = current->next; + Header* header = (Header*)node; + header->magic = HEADER_MAGIC; + header->size = size; + return (void*)((uint8_t*)header + sizeof(Header)); } - // No fit — grow and retry - if (!grow(needed)) - return nullptr; - return malloc(size); + // Large allocation — search overflow list + void* block = take_from_overflow(needed); + if (block == nullptr) { + if (!grow(needed)) return nullptr; + block = take_from_overflow(needed); + if (block == nullptr) return nullptr; + } + + Header* header = (Header*)block; + header->magic = HEADER_MAGIC; + header->size = size; + return (void*)((uint8_t*)header + sizeof(Header)); } inline void mfree(void* ptr) { @@ -107,27 +191,49 @@ namespace heap_detail { Header* header = get_header(ptr); + if (header->magic == FREED_MAGIC) return; // double-free + if (header->magic != HEADER_MAGIC) return; // corrupt + header->magic = FREED_MAGIC; + uint64_t blockSize = header->size + sizeof(Header); blockSize = (blockSize + 15) & ~15ULL; - insert_free((void*)header, blockSize); + int idx = bucket_index(blockSize); + + if (idx >= 0) { + // Small block — push onto bucket (O(1)) + auto* node = (FreeNode*)header; + node->size = BUCKET_SIZES[idx]; + node->next = g_buckets[idx]; + g_buckets[idx] = node; + } else { + // Large block — sorted insert with coalescing + insert_overflow((void*)header, blockSize); + } } inline void* realloc(void* ptr, uint64_t size) { if (ptr == nullptr) return malloc(size); - auto* header = heap_detail::get_header(ptr); - uint64_t old = header->size; + auto* header = heap_detail::get_header(ptr); + uint64_t old = header->size; + + // Compute actual block size (accounting for bucket rounding) + uint64_t oldBlock = (old + sizeof(heap_detail::Header) + 15) & ~15ULL; + int idx = heap_detail::bucket_index(oldBlock); + if (idx >= 0) oldBlock = heap_detail::BUCKET_SIZES[idx]; + + uint64_t newNeed = (size + sizeof(heap_detail::Header) + 15) & ~15ULL; + if (newNeed <= oldBlock) { + header->size = size; + return ptr; + } void* newBlock = malloc(size); if (newBlock == nullptr) return nullptr; - // Copy the smaller of old/new sizes uint64_t copySize = (old < size) ? old : size; - uint8_t* dst = (uint8_t*)newBlock; - uint8_t* src = (uint8_t*)ptr; - for (uint64_t i = 0; i < copySize; i++) - dst[i] = src[i]; + memcpy(newBlock, ptr, copySize); mfree(ptr); return newBlock; diff --git a/programs/include/montauk/string.h b/programs/include/montauk/string.h index a61b240..c85d982 100644 --- a/programs/include/montauk/string.h +++ b/programs/include/montauk/string.h @@ -39,22 +39,58 @@ namespace montauk { inline void memcpy(void* dst, const void* src, uint64_t n) { auto* d = (uint8_t*)dst; auto* s = (const uint8_t*)src; - for (uint64_t i = 0; i < n; i++) d[i] = s[i]; + + // Byte copy until 8-byte aligned + while (n && ((uint64_t)d & 7)) { *d++ = *s++; n--; } + + // Bulk 8-byte copy + auto* d8 = (uint64_t*)d; + auto* s8 = (const uint64_t*)s; + uint64_t words = n / 8; + for (uint64_t i = 0; i < words; i++) d8[i] = s8[i]; + + // Remainder + d = (uint8_t*)(d8 + words); + s = (const uint8_t*)(s8 + words); + for (uint64_t i = 0; i < (n & 7); i++) d[i] = s[i]; } inline void memmove(void* dst, const void* src, uint64_t n) { auto* d = (uint8_t*)dst; auto* s = (const uint8_t*)src; - if (d < s) { - for (uint64_t i = 0; i < n; i++) d[i] = s[i]; + if (d < s || d >= s + n) { + memcpy(dst, src, n); } else { - for (uint64_t i = n; i > 0; i--) d[i-1] = s[i-1]; + // Backward copy — bulk 8 bytes at a time from end + d += n; s += n; + while (n && ((uint64_t)d & 7)) { *--d = *--s; n--; } + auto* d8 = (uint64_t*)d; + auto* s8 = (const uint64_t*)s; + uint64_t words = n / 8; + for (uint64_t i = 1; i <= words; i++) d8[-i] = s8[-i]; + d = (uint8_t*)(d8 - words); + s = (const uint8_t*)(s8 - words); + for (uint64_t i = 1; i <= (n & 7); i++) d[-i] = s[-i]; } } inline void memset(void* dst, int val, uint64_t n) { auto* d = (uint8_t*)dst; - for (uint64_t i = 0; i < n; i++) d[i] = (uint8_t)val; + uint8_t v = (uint8_t)val; + + // Byte fill until 8-byte aligned + while (n && ((uint64_t)d & 7)) { *d++ = v; n--; } + + // Bulk 8-byte fill + uint64_t v8 = v; + v8 |= v8 << 8; v8 |= v8 << 16; v8 |= v8 << 32; + auto* d8 = (uint64_t*)d; + uint64_t words = n / 8; + for (uint64_t i = 0; i < words; i++) d8[i] = v8; + + // Remainder + d = (uint8_t*)(d8 + words); + for (uint64_t i = 0; i < (n & 7); i++) d[i] = v; } inline void strcpy(char* dst, const char* src) { diff --git a/programs/lib/libc/libc.c b/programs/lib/libc/libc.c index 5475c9b..c57f1e8 100644 --- a/programs/lib/libc/libc.c +++ b/programs/lib/libc/libc.c @@ -66,27 +66,61 @@ int errno = 0; void *memcpy(void *dest, const void *src, size_t n) { unsigned char *d = (unsigned char *)dest; const unsigned char *s = (const unsigned char *)src; - for (size_t i = 0; i < n; i++) - d[i] = s[i]; + + /* Byte copy until 8-byte aligned */ + while (n && ((uint64_t)d & 7)) { *d++ = *s++; n--; } + + /* Bulk 8-byte copy */ + uint64_t *d8 = (uint64_t *)d; + const uint64_t *s8 = (const uint64_t *)s; + size_t words = n / 8; + for (size_t i = 0; i < words; i++) d8[i] = s8[i]; + + /* Remainder */ + d = (unsigned char *)(d8 + words); + s = (const unsigned char *)(s8 + words); + for (size_t i = 0; i < (n & 7); i++) d[i] = s[i]; + return dest; } void *memset(void *s, int c, size_t n) { unsigned char *p = (unsigned char *)s; - for (size_t i = 0; i < n; i++) - p[i] = (unsigned char)c; + unsigned char v = (unsigned char)c; + + /* Byte fill until 8-byte aligned */ + while (n && ((uint64_t)p & 7)) { *p++ = v; n--; } + + /* Bulk 8-byte fill */ + uint64_t v8 = v; + v8 |= v8 << 8; v8 |= v8 << 16; v8 |= v8 << 32; + uint64_t *p8 = (uint64_t *)p; + size_t words = n / 8; + for (size_t i = 0; i < words; i++) p8[i] = v8; + + /* Remainder */ + p = (unsigned char *)(p8 + words); + for (size_t i = 0; i < (n & 7); i++) p[i] = v; + return s; } void *memmove(void *dest, const void *src, size_t n) { unsigned char *d = (unsigned char *)dest; const unsigned char *s = (const unsigned char *)src; - if (s < d && d < s + n) { - for (size_t i = n; i > 0; i--) - d[i - 1] = s[i - 1]; + if (d < s || d >= s + n) { + memcpy(dest, src, n); } else { - for (size_t i = 0; i < n; i++) - d[i] = s[i]; + /* Backward copy — bulk 8 bytes at a time from end */ + d += n; s += n; + while (n && ((uint64_t)d & 7)) { *--d = *--s; n--; } + uint64_t *d8 = (uint64_t *)d; + const uint64_t *s8 = (const uint64_t *)s; + size_t words = n / 8; + for (size_t i = 1; i <= words; i++) d8[-(long)i] = s8[-(long)i]; + d = (unsigned char *)(d8 - words); + s = (const unsigned char *)(s8 - words); + for (size_t i = 1; i <= (n & 7); i++) d[-(long)i] = s[-(long)i]; } return dest; } @@ -228,7 +262,8 @@ int tolower(int c) { return (c >= 'A' && c <= 'Z') ? c + 32 : c; } Heap allocator (free-list, backed by SYS_ALLOC) ======================================================================== */ -#define HEAP_MAGIC 0x5A484541ULL /* "ZHEA" */ +#define HEAP_MAGIC 0x5A484541ULL /* "ZHEA" */ +#define FREED_MAGIC 0xDEADFEEEULL struct HeapHeader { uint64_t magic; @@ -240,14 +275,78 @@ struct FreeNode { struct FreeNode *next; }; -static struct FreeNode g_heapHead = { 0, NULL }; +/* Segregated free lists: power-of-2 size classes for blocks <= 4096 bytes */ +#define NUM_BUCKETS 8 +static const uint64_t BUCKET_SIZES[NUM_BUCKETS] = { + 32, 64, 128, 256, 512, 1024, 2048, 4096 +}; + +static struct FreeNode *g_buckets[NUM_BUCKETS] = {}; +static struct FreeNode g_overflow = { 0, NULL }; static int g_heapInit = 0; -static void heap_insert_free(void *ptr, uint64_t size) { +static int heap_bucket_index(uint64_t blockSize) { + if (blockSize <= 32) return 0; + if (blockSize <= 64) return 1; + if (blockSize <= 128) return 2; + if (blockSize <= 256) return 3; + if (blockSize <= 512) return 4; + if (blockSize <= 1024) return 5; + if (blockSize <= 2048) return 6; + if (blockSize <= 4096) return 7; + return -1; +} + +/* Insert into overflow list (sorted by address, with coalescing) */ +static void heap_insert_overflow(void *ptr, uint64_t size) { struct FreeNode *node = (struct FreeNode *)ptr; node->size = size; - node->next = g_heapHead.next; - g_heapHead.next = node; + + struct FreeNode *prev = &g_overflow; + struct FreeNode *cur = g_overflow.next; + while (cur != NULL && cur < node) { + prev = cur; + cur = cur->next; + } + + int merged_prev = 0; + if (prev != &g_overflow && + (uint8_t *)prev + prev->size == (uint8_t *)node) { + prev->size += size; + node = prev; + merged_prev = 1; + } + + if (cur != NULL && + (uint8_t *)node + node->size == (uint8_t *)cur) { + node->size += cur->size; + node->next = cur->next; + if (!merged_prev) prev->next = node; + } else if (!merged_prev) { + node->next = cur; + prev->next = node; + } +} + +/* Take a block >= needed from overflow. Splits remainder back. */ +static void *heap_take_overflow(uint64_t needed) { + struct FreeNode *prev = &g_overflow; + struct FreeNode *cur = g_overflow.next; + + while (cur != NULL) { + if (cur->size >= needed) { + uint64_t blockSize = cur->size; + prev->next = cur->next; + + if (blockSize > needed + sizeof(struct FreeNode) + 16) { + heap_insert_overflow((uint8_t *)cur + needed, blockSize - needed); + } + return (void *)cur; + } + prev = cur; + cur = cur->next; + } + return NULL; } static void heap_grow(uint64_t bytes) { @@ -255,7 +354,29 @@ static void heap_grow(uint64_t bytes) { if (pages < 4) pages = 4; void *mem = (void *)_zos_syscall1(SYS_ALLOC, (long)(pages * 0x1000)); if (mem != NULL) - heap_insert_free(mem, pages * 0x1000); + heap_insert_overflow(mem, pages * 0x1000); +} + +/* Refill a small-block bucket from overflow */ +static int heap_refill_bucket(int idx) { + uint64_t bsize = BUCKET_SIZES[idx]; + uint64_t chunk = (bsize < 4096) ? 4096 : bsize; + + void *block = heap_take_overflow(chunk); + if (block == NULL) { + heap_grow(chunk); + block = heap_take_overflow(chunk); + if (block == NULL) return 0; + } + + uint64_t count = chunk / bsize; + for (uint64_t i = 0; i < count; i++) { + struct FreeNode *node = (struct FreeNode *)((uint8_t *)block + i * bsize); + node->size = bsize; + node->next = g_buckets[idx]; + g_buckets[idx] = node; + } + return 1; } void *malloc(size_t size) { @@ -267,39 +388,60 @@ void *malloc(size_t size) { uint64_t needed = size + sizeof(struct HeapHeader); needed = (needed + 15) & ~15ULL; - struct FreeNode *prev = &g_heapHead; - struct FreeNode *cur = g_heapHead.next; + int idx = heap_bucket_index(needed); - while (cur != NULL) { - if (cur->size >= needed) { - uint64_t blockSize = cur->size; - prev->next = cur->next; + if (idx >= 0) { + /* Small allocation — use segregated bucket (O(1)) */ + if (g_buckets[idx] == NULL && !heap_refill_bucket(idx)) + return NULL; - if (blockSize > needed + sizeof(struct FreeNode) + 16) { - void *rest = (void *)((uint8_t *)cur + needed); - heap_insert_free(rest, blockSize - needed); - } + struct FreeNode *node = g_buckets[idx]; + g_buckets[idx] = node->next; - struct HeapHeader *hdr = (struct HeapHeader *)cur; - hdr->magic = HEAP_MAGIC; - hdr->size = size; - return (void *)((uint8_t *)hdr + sizeof(struct HeapHeader)); - } - prev = cur; - cur = cur->next; + struct HeapHeader *hdr = (struct HeapHeader *)node; + hdr->magic = HEAP_MAGIC; + hdr->size = size; + return (void *)((uint8_t *)hdr + sizeof(struct HeapHeader)); } - heap_grow(needed); - return malloc(size); + /* Large allocation — search overflow list */ + void *block = heap_take_overflow(needed); + if (block == NULL) { + heap_grow(needed); + block = heap_take_overflow(needed); + if (block == NULL) return NULL; + } + + struct HeapHeader *hdr = (struct HeapHeader *)block; + hdr->magic = HEAP_MAGIC; + hdr->size = size; + return (void *)((uint8_t *)hdr + sizeof(struct HeapHeader)); } void free(void *ptr) { if (ptr == NULL) return; struct HeapHeader *hdr = (struct HeapHeader *)((uint8_t *)ptr - sizeof(struct HeapHeader)); + + if (hdr->magic == FREED_MAGIC) return; /* double-free */ + if (hdr->magic != HEAP_MAGIC) return; /* corrupt */ + hdr->magic = FREED_MAGIC; + uint64_t blockSize = hdr->size + sizeof(struct HeapHeader); blockSize = (blockSize + 15) & ~15ULL; - heap_insert_free((void *)hdr, blockSize); + + int idx = heap_bucket_index(blockSize); + + if (idx >= 0) { + /* Small block — push onto bucket (O(1)) */ + struct FreeNode *node = (struct FreeNode *)hdr; + node->size = BUCKET_SIZES[idx]; + node->next = g_buckets[idx]; + g_buckets[idx] = node; + } else { + /* Large block — sorted insert with coalescing */ + heap_insert_overflow((void *)hdr, blockSize); + } } void *calloc(size_t nmemb, size_t size) { @@ -316,6 +458,17 @@ void *realloc(void *ptr, size_t size) { struct HeapHeader *hdr = (struct HeapHeader *)((uint8_t *)ptr - sizeof(struct HeapHeader)); uint64_t old = hdr->size; + /* Compute actual block size (accounting for bucket rounding) */ + uint64_t oldBlock = (old + sizeof(struct HeapHeader) + 15) & ~15ULL; + int idx = heap_bucket_index(oldBlock); + if (idx >= 0) oldBlock = BUCKET_SIZES[idx]; + + uint64_t newNeed = (size + sizeof(struct HeapHeader) + 15) & ~15ULL; + if (newNeed <= oldBlock) { + hdr->size = size; + return ptr; + } + void *newp = malloc(size); if (newp == NULL) return NULL; diff --git a/programs/lib/libc/obj/libc.o b/programs/lib/libc/obj/libc.o index 961fbdf6505baf374462bd1d86258f996575bab1..b8aef845cee5c3e5c841deded606fcb891fd3d70 100644 GIT binary patch literal 102208 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 Q<=?`8ka>aeo4(Kgzs*Ov@&Et; literal 91408 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 aDyug1AFJs!sVV(JJ}7V&<2QL{F8N<`ax}aE diff --git a/programs/lib/libjpeg/libjpeg.a b/programs/lib/libjpeg/libjpeg.a index 97a9d79997026b083dc71155a1c1406cca0f65d2..9d9d5aa54e717157d2c03c83f4c3f63956e943d5 100644 GIT binary patch delta 51 wcmZ2CS!CU0kqI(v7Dgs!CPo{TOqig|<`|~-7$!y_2GPtw%(6X(i8Y8F0B>Fl(f|Me delta 51 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 J@e2zs{|}+fMsENB delta 28707 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 diff --git a/programs/lib/tls/obj/tls.o b/programs/lib/tls/obj/tls.o index ec70240d2acb95dd09090bb466d65d3842a6042d..8cd7af31c8817171772166680326ebbbb1838de2 100644 GIT binary patch delta 20972 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 B{OSMz delta 20964 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 diff --git a/programs/src/desktop/main.cpp b/programs/src/desktop/main.cpp index 221f867..88f6eed 100644 --- a/programs/src/desktop/main.cpp +++ b/programs/src/desktop/main.cpp @@ -82,7 +82,7 @@ void gui::desktop_init(DesktopState* ds) { ds->settings.ui_scale = 1; // Try to load default wallpaper - wallpaper_load(&ds->settings, "0:/home/stephen-walker-DaC8D3USffk-unsplash.jpg", + wallpaper_load(&ds->settings, "0:/home/kristaps-ungurs-llezNN2OGEY-unsplash.jpg", ds->screen_w, ds->screen_h); montauk::win_setscale(1); diff --git a/programs/src/fontpreview/Makefile b/programs/src/fontpreview/Makefile index 94d20bb..600828a 100644 --- a/programs/src/fontpreview/Makefile +++ b/programs/src/fontpreview/Makefile @@ -15,6 +15,7 @@ endif # ---- Paths ---- +LIBC_LIB := ../../lib/libc PROG_INC := ../../include LINK_LD := ../../link.ld BINDIR := ../../bin @@ -59,6 +60,10 @@ LDFLAGS := \ -z max-page-size=0x1000 \ -T $(LINK_LD) +# ---- Libraries ---- + +LIBS := $(LIBC_LIB)/liblibc.a + # ---- Source files ---- SRCS := main.cpp stb_truetype_impl.cpp @@ -72,9 +77,9 @@ TARGET := $(BINDIR)/os/fontpreview.elf all: $(TARGET) -$(TARGET): $(OBJS) $(LINK_LD) Makefile +$(TARGET): $(OBJS) $(LIBS) $(LINK_LD) Makefile mkdir -p $(BINDIR)/os - $(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $@ + $(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ $(OBJDIR)/%.o: %.cpp Makefile mkdir -p $(OBJDIR) diff --git a/programs/src/imageviewer/main.cpp b/programs/src/imageviewer/main.cpp index 9741a49..6fd023a 100644 --- a/programs/src/imageviewer/main.cpp +++ b/programs/src/imageviewer/main.cpp @@ -1,7 +1,6 @@ /* * main.cpp - * MontaukOS Image Viewer - standalone Window Server process - * Displays images with zoom, pan, fit-to-window, and 1:1 modes + * MontaukOS Image Viewer * Copyright (c) 2026 Daniel Hammer */