#include <stdio.h>
char stack[0x10000] __attribute__((aligned(16))) = {0};
void test(void *ctx) {
printf("%s\n", (const char*)ctx
); }
void call_with_new_stack(void* sp, void (*fn)(void*), void* ctx)
{
__asm volatile(
"xchg %%rsp, %%rdi\n\t" //
"sub $8, %%rsp\n\t"
"push %%rdi\n\t"
"mov %%rdx, %%rdi\n\t"
"call *%%rsi\n\t"
"pop %%rsp\n\t"
: : "D"(sp), "S"(fn), "d"(ctx) : "memory"
);
}
int main() {
call_with_new_stack(stack + sizeof(stack), &test, "Hello, world!");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgpjaGFyIHN0YWNrWzB4MTAwMDBdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgPSB7MH07Cgp2b2lkIHRlc3Qodm9pZCAqY3R4KSB7CiAgICBwcmludGYoIiVzXG4iLCAoY29uc3QgY2hhciopY3R4KTsKfQoKdm9pZCBjYWxsX3dpdGhfbmV3X3N0YWNrKHZvaWQqIHNwLCB2b2lkICgqZm4pKHZvaWQqKSwgdm9pZCogY3R4KQp7CiAgICBfX2FzbSB2b2xhdGlsZSgKICAgICAgICAieGNoZyAlJXJzcCwgJSVyZGlcblx0IiAgLy8gCiAgICAgICAgInN1YiAkOCwgJSVyc3Bcblx0IgogICAgICAgICJwdXNoICUlcmRpXG5cdCIKICAgICAgICAibW92ICUlcmR4LCAlJXJkaVxuXHQiCiAgICAgICAgImNhbGwgKiUlcnNpXG5cdCIKICAgICAgICAicG9wICUlcnNwXG5cdCIKICAgICAgICA6IDogIkQiKHNwKSwgIlMiKGZuKSwgImQiKGN0eCkgOiAibWVtb3J5IgogICAgKTsKfQoKaW50IG1haW4oKSB7CiAgICBjYWxsX3dpdGhfbmV3X3N0YWNrKHN0YWNrICsgc2l6ZW9mKHN0YWNrKSwgJnRlc3QsICJIZWxsbywgd29ybGQhIik7CiAgICByZXR1cm4gMDsKfQo=