summaryrefslogtreecommitdiffstats
path: root/library/fibers/initializestack_64_win.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'library/fibers/initializestack_64_win.cpp')
-rw-r--r--library/fibers/initializestack_64_win.cpp44
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;
+}