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.
This commit is contained in:
parent
8bff7e996c
commit
0d4de0f4b1
@ -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"
|
||||
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user