Skip to content

Commit

Permalink
[wasi] Work arounbd WASI's mmap implementation not returning aligned …
Browse files Browse the repository at this point in the history
…memory. (#91761)

Some code in sgen like sgen_los_free_object () expects the return address to be aligned.

Hopefully fixes #88501 and others.
  • Loading branch information
vargaz authored Sep 11, 2023
1 parent 00937b2 commit 036c14e
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions src/mono/mono/utils/mono-mmap-wasm.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ mono_setmmapjit (int flag)
/* Ignored on HOST_WASM */
}

void*
mono_valloc (void *addr, size_t size, int flags, MonoMemAccountType type)
static void*
valloc_impl (void *addr, size_t size, int flags, MonoMemAccountType type)
{
void *ptr;
int mflags = 0;
Expand Down Expand Up @@ -119,6 +119,19 @@ mono_valloc (void *addr, size_t size, int flags, MonoMemAccountType type)
return ptr;
}

void*
mono_valloc (void *addr, size_t size, int flags, MonoMemAccountType type)
{
#if HOST_WASI
// WASI implements mmap using malloc, so the returned address is not page aligned
// and our code depends on it
g_assert (!addr);
return mono_valloc_aligned (size, mono_pagesize (), flags, type);
#else
return valloc_impl (addr, size, flags, type);
#endif
}

static GHashTable *valloc_hash;

typedef struct {
Expand All @@ -130,7 +143,7 @@ void*
mono_valloc_aligned (size_t size, size_t alignment, int flags, MonoMemAccountType type)
{
/* Allocate twice the memory to be able to put the block on an aligned address */
char *mem = (char *) mono_valloc (NULL, size + alignment, flags, type);
char *mem = (char *) valloc_impl (NULL, size + alignment, flags, type);
char *aligned;

if (!mem)
Expand Down

0 comments on commit 036c14e

Please sign in to comment.