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;
}
|