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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
| ;
| ; stack switching code for MASM on x641
| ; Kristjan Valur Jonsson, sept 2005
| ;
|
|
| ;prototypes for our calls
| slp_save_state_asm PROTO
| slp_restore_state_asm PROTO
|
|
| pushxmm MACRO reg
| sub rsp, 16
| .allocstack 16
| movaps [rsp], reg ; faster than movups, but we must be aligned
| ; .savexmm128 reg, offset (don't know what offset is, no documentation)
| ENDM
| popxmm MACRO reg
| movaps reg, [rsp] ; faster than movups, but we must be aligned
| add rsp, 16
| ENDM
|
| pushreg MACRO reg
| push reg
| .pushreg reg
| ENDM
| popreg MACRO reg
| pop reg
| ENDM
|
|
| .code
| slp_switch PROC FRAME
| ;realign stack to 16 bytes after return address push, makes the following faster
| sub rsp,8
| .allocstack 8
|
| pushxmm xmm15
| pushxmm xmm14
| pushxmm xmm13
| pushxmm xmm12
| pushxmm xmm11
| pushxmm xmm10
| pushxmm xmm9
| pushxmm xmm8
| pushxmm xmm7
| pushxmm xmm6
|
| pushreg r15
| pushreg r14
| pushreg r13
| pushreg r12
|
| pushreg rbp
| pushreg rbx
| pushreg rdi
| pushreg rsi
|
| sub rsp, 10h ;allocate the singlefunction argument (must be multiple of 16)
| .allocstack 10h
| .endprolog
|
| lea rcx, [rsp+10h] ;load stack base that we are saving
| call slp_save_state_asm ;pass stackpointer, return offset in eax
| cmp rax, 1
| je EXIT1
| cmp rax, -1
| je EXIT2
| ;actual stack switch:
| add rsp, rax
| call slp_restore_state_asm
| xor rax, rax ;return 0
|
| EXIT:
|
| add rsp, 10h
| popreg rsi
| popreg rdi
| popreg rbx
| popreg rbp
|
| popreg r12
| popreg r13
| popreg r14
| popreg r15
|
| popxmm xmm6
| popxmm xmm7
| popxmm xmm8
| popxmm xmm9
| popxmm xmm10
| popxmm xmm11
| popxmm xmm12
| popxmm xmm13
| popxmm xmm14
| popxmm xmm15
|
| add rsp, 8
| ret
|
| EXIT1:
| mov rax, 1
| jmp EXIT
|
| EXIT2:
| sar rax, 1
| jmp EXIT
|
| slp_switch ENDP
|
| END
|
|