Commit e175aaf6 authored by Sergei Trofimovich's avatar Sergei Trofimovich

fix osReserveHeapMemory block alignment

Before the change osReserveHeapMemory() attempted
to allocate chunks of memory via osTryReserveHeapMemory()
not multiple of MBLOCK_SIZE in the following fallback code:

    if (at == NULL) {
        *len -= *len / 8;

and caused assertion failure:

$ make fulltest TEST=T11607 WAY=threaded1
T11607: internal error: ASSERTION FAILED: file rts/posix/OSMem.c, line 457
    (GHC version 8.7.20180716 for riscv64_unknown_linux)


The change applies alignment mask before each MBLOCK allocation attempt
and fixes WAY=threaded1 test failures on qemu-riscv64.
Signed-off-by: default avatarSergei Trofimovich <>

Test Plan: run 'make fulltest WAY=threaded1'

Reviewers: simonmar, bgamari, erikd

Reviewed By: simonmar

Subscribers: rwbarton, thomie, carter

Differential Revision:
parent d0bbe1bf
......@@ -441,6 +441,8 @@ osTryReserveHeapMemory (W_ len, void *hint)
void *base, *top;
void *start, *end;
ASSERT((len & ~MBLOCK_MASK) == len);
/* We try to allocate len + MBLOCK_SIZE,
because we need memory which is MBLOCK_SIZE aligned,
and then we discard what we don't need */
......@@ -517,6 +519,8 @@ void *osReserveHeapMemory(void *startAddressPtr, W_ *len)
attempt = 0;
while (1) {
*len &= ~MBLOCK_MASK;
if (*len < MBLOCK_SIZE) {
// Give up if the system won't even give us 16 blocks worth of heap
barf("osReserveHeapMemory: Failed to allocate heap storage");
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment