summaryrefslogtreecommitdiffstats
path: root/src/backend/initializestack_64_win.cpp
blob: 3b29caf69dac00a5e759a2ae29f0c3e58cec4daa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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;
}