diff options
Diffstat (limited to 'library/fibers/initializestack_64_win.cpp')
-rw-r--r-- | library/fibers/initializestack_64_win.cpp | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/library/fibers/initializestack_64_win.cpp b/library/fibers/initializestack_64_win.cpp new file mode 100644 index 0000000..3b29caf --- /dev/null +++ b/library/fibers/initializestack_64_win.cpp @@ -0,0 +1,44 @@ +#include <stdlib.h> + +void initializeStack(void *data, int size, void (*entry)(), void **stackPointer) +{ + void* stackBottom = (char*)data + size; + // align to 16 byte + stackBottom = (void*)((size_t)stackBottom & ~0xF); + + void **p = (void**)stackBottom; + + //*(--p) = 0; // align to 16 bytes + *(--p) = (void*)fn; // rip + *(--p) = entry; // rbp + *(--p) = 0; // rbx + *(--p) = 0; // r12 + *(--p) = 0; // r13 + *(--p) = 0; // r14 + *(--p) = 0; // r15 + *(--p) = 0; // rsi + *(--p) = 0; // rdi + *(--p) = 0; // xmm6 + *(--p) = 0; // xmm6 + *(--p) = 0; // xmm7 + *(--p) = 0; // xmm7 + *(--p) = 0; // xmm8 + *(--p) = 0; // xmm8 + *(--p) = 0; // xmm9 + *(--p) = 0; // xmm9 + *(--p) = 0; // xmm10 + *(--p) = 0; // xmm10 + *(--p) = 0; // xmm11 + *(--p) = 0; // xmm11 + *(--p) = 0; // xmm12 + *(--p) = 0; // xmm12 + *(--p) = 0; // xmm13 + *(--p) = 0; // xmm13 + *(--p) = 0; // xmm14 + *(--p) = 0; // xmm14 + *(--p) = 0; // xmm15 + *(--p) = 0; // xmm15 + *(--p) = (void*)0x00001f800000033f; // SIMD and regular floating point control defaults + + *stackPointer = p; +} |