Skip to content

Commit

Permalink
wasm: align fiber stack pointer to 16 bytes (ruby#12101)
Browse files Browse the repository at this point in the history
wasm: align fiber stack pointer to 16 bytes

In WebAssembly C ABI, the linear stack pointer must be always aligned
to 16 bytes like other archs.
The misaligned stack pointer causes some weird memory corruption since
compiler assumes the aligned stack pointer.
  • Loading branch information
kateinoigakukun authored Nov 15, 2024
1 parent a24570a commit a97621e
Showing 1 changed file with 6 additions and 2 deletions.
8 changes: 6 additions & 2 deletions coroutine/asyncify/Context.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

#include <stddef.h>
#include <stdio.h>
#include <stdint.h>
#include "wasm/asyncify.h"
#include "wasm/machine.h"
#include "wasm/fiber.h"
Expand Down Expand Up @@ -47,10 +48,13 @@ static inline void coroutine_initialize_main(struct coroutine_context * context)

static inline void coroutine_initialize(struct coroutine_context *context, coroutine_start start, void *stack, size_t size)
{
if (ASYNCIFY_CORO_DEBUG) fprintf(stderr, "[%s] entry (context = %p, stack = %p ... %p)\n", __func__, context, stack, (char *)stack + size);
// Linear stack pointer must be always aligned down to 16 bytes.
// https://github.com/WebAssembly/tool-conventions/blob/c74267a5897c1bdc9aa60adeaf41816387d3cd12/BasicCABI.md#the-linear-stack
uintptr_t sp = ((uintptr_t)stack + size) & ~0xF;
if (ASYNCIFY_CORO_DEBUG) fprintf(stderr, "[%s] entry (context = %p, stack = %p ... %p)\n", __func__, context, stack, (char *)sp);
rb_wasm_init_context(&context->fc, coroutine_trampoline, start, context);
// record the initial stack pointer position to restore it after resumption
context->current_sp = (char *)stack + size;
context->current_sp = (char *)sp;
context->stack_base = stack;
context->size = size;
}
Expand Down

0 comments on commit a97621e

Please sign in to comment.