From 9943716d9bb4e0d6b0906f496f6674b3c334f47b Mon Sep 17 00:00:00 2001 From: Michael Mueller Date: Fri, 17 Oct 2025 16:54:42 +0200 Subject: [PATCH] =?UTF-8?q?libc:=20Use=20Hamstraaja=20for=20malloc=20on=20?= =?UTF-8?q?Eal=C3=A1nOS.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- repos/libports/lib/mk/libc-common.inc | 2 ++ repos/libports/src/lib/libc/internal/init.h | 4 ++- repos/libports/src/lib/libc/internal/kernel.h | 1 + repos/libports/src/lib/libc/kernel.cc | 2 +- repos/libports/src/lib/libc/malloc.cc | 30 +++++++++++++------ 5 files changed, 28 insertions(+), 11 deletions(-) diff --git a/repos/libports/lib/mk/libc-common.inc b/repos/libports/lib/mk/libc-common.inc index 51728194e4..9605665cff 100644 --- a/repos/libports/lib/mk/libc-common.inc +++ b/repos/libports/lib/mk/libc-common.inc @@ -7,6 +7,7 @@ LIBC_PORT_DIR := $(call select_from_ports,libc) LIBC_DIR := $(LIBC_PORT_DIR)/src/lib/libc LIBC_REP_DIR := $(realpath $(call select_from_repositories,include/libc-genode)/../..) +EALAN_REP_DIR := $(realpath $(call select_from_repositories,ealanos)) # local libc includes INC_DIR += $(LIBC_DIR)/lib/libc/locale @@ -14,6 +15,7 @@ INC_DIR += $(LIBC_DIR)/lib/libc/include INC_DIR += $(LIBC_DIR)/lib/libc/stdio INC_DIR += $(LIBC_DIR)/lib/libc/net INC_DIR += $(LIBC_DIR)/contrib/gdtoa +INC_DIR += $(EALAN_REP_DIR)/include #CC_OPT += -DGENODE_RELEASE diff --git a/repos/libports/src/lib/libc/internal/init.h b/repos/libports/src/lib/libc/internal/init.h index e2ad25097b..a9674dcbba 100644 --- a/repos/libports/src/lib/libc/internal/init.h +++ b/repos/libports/src/lib/libc/internal/init.h @@ -15,6 +15,8 @@ #define _LIBC__INTERNAL__INIT_H_ /* Genode includes */ +#include "pd_session/pd_session.h" +#include "region_map/region_map.h" #include #include #include @@ -98,7 +100,7 @@ namespace Libc { /** * Malloc allocator */ - void init_malloc(Genode::Allocator &); + void init_malloc(Genode::Pd_session &pd , Genode::Region_map &rm); void init_malloc_cloned(Clone_connection &); void reinit_malloc(Genode::Allocator &); diff --git a/repos/libports/src/lib/libc/internal/kernel.h b/repos/libports/src/lib/libc/internal/kernel.h index 069ae77ef9..521c50113b 100644 --- a/repos/libports/src/lib/libc/internal/kernel.h +++ b/repos/libports/src/lib/libc/internal/kernel.h @@ -45,6 +45,7 @@ #include #include + namespace Libc { class Kernel; class Main_blockade; diff --git a/repos/libports/src/lib/libc/kernel.cc b/repos/libports/src/lib/libc/kernel.cc index 25870f1ee1..a6554e8dc1 100644 --- a/repos/libports/src/lib/libc/kernel.cc +++ b/repos/libports/src/lib/libc/kernel.cc @@ -500,7 +500,7 @@ Libc::Kernel::Kernel(Genode::Env &env, Genode::Allocator &heap) } else { _malloc_heap.construct(*_malloc_ram, _env.rm()); - init_malloc(*_malloc_heap); + init_malloc(_env.pd(), _env.rm()); } init_fork(_env, _fd_alloc, _libc_env, _heap, *_malloc_heap, _pid, *this, diff --git a/repos/libports/src/lib/libc/malloc.cc b/repos/libports/src/lib/libc/malloc.cc index 2998070d42..f63f8ebba8 100644 --- a/repos/libports/src/lib/libc/malloc.cc +++ b/repos/libports/src/lib/libc/malloc.cc @@ -13,6 +13,8 @@ */ /* Genode includes */ +#include "pd_session/pd_session.h" +#include "region_map/region_map.h" #include #include #include @@ -30,6 +32,7 @@ extern "C" { #include #include #include +#include namespace Libc { @@ -83,7 +86,7 @@ class Libc::Malloc SLAB_START = 5, /* 32 bytes (log2) */ SLAB_STOP = 11, /* 2048 bytes (log2) */ NUM_SLABS = (SLAB_STOP - SLAB_START) + 1, - DEFAULT_ALIGN = 16 + DEFAULT_ALIGN = 64 }; struct Metadata @@ -232,10 +235,11 @@ class Libc::Malloc using namespace Libc; +using Hamsterer = Ealan::Memory::Hamstraaja<32, 2048>; +//static Malloc *mallocator; -static Malloc *mallocator; - +static Hamsterer *mallocator; extern "C" void *malloc(size_t size) { @@ -267,13 +271,21 @@ extern "C" void *realloc(void *ptr, size_t size) return nullptr; } - return mallocator->realloc(ptr, size); + void *new_addr = mallocator->alloc(size); + + if (new_addr) { + ::memcpy(new_addr, ptr, size); + free(ptr); + } + + return new_addr; + //return mallocator->realloc(ptr, size); } int posix_memalign(void **memptr, size_t alignment, size_t size) { - *memptr = mallocator->alloc(size, alignment); + *memptr = mallocator->aligned_alloc(size, alignment); if (!*memptr) return Errno(ENOMEM); @@ -283,19 +295,19 @@ int posix_memalign(void **memptr, size_t alignment, size_t size) /* space for singleton object w/o destructor */ -static long _malloc_obj[(sizeof(Malloc) + sizeof(long))/sizeof(long)]; +static long _malloc_obj[(sizeof(Hamsterer) + sizeof(long))/sizeof(long)]; -void Libc::init_malloc(Genode::Allocator &heap) +void Libc::init_malloc(Genode::Pd_session &pd, Genode::Region_map &rm) { - mallocator = construct_at(_malloc_obj, heap); + mallocator = construct_at(_malloc_obj, pd, rm); } void Libc::init_malloc_cloned(Clone_connection &clone_connection) { clone_connection.object_content(_malloc_obj); - mallocator = (Malloc *)_malloc_obj; + mallocator = (Hamsterer *)_malloc_obj; }