1
- #include "x86_64_regs.h"
2
-
1
+ #include "regs.h"
2
+ #define ARG0 RUSTRT_ARG0_S
3
+ #define ARG1 RUSTRT_ARG1_S
4
+
3
5
.text
4
6
5
7
/*
@@ -41,7 +43,10 @@ First four arguments:
41
43
/*
42
44
Stores current registers into arg0/RCX and restores
43
45
registers found in arg1/RDX. This is used by our
44
- implementation of getcontext.
46
+ implementation of getcontext. Only saves/restores nonvolatile
47
+ registers and the register used for the first argument.
48
+ Volatile registers in general ought to be saved by the caller
49
+ anyhow.
45
50
*/
46
51
47
52
// swap_registers(registers_t *oregs, registers_t *regs)
@@ -56,60 +61,53 @@ swap_registers:
56
61
// return address. We can therefore just return normally to
57
62
// jump back into the old code.
58
63
59
- # if defined(RUSTRT_ARG0_S)
60
- mov RUSTRT_ARG0_S, %rdi
61
- mov RUSTRT_ARG1_S, %rsi
62
- # endif
63
-
64
64
// Save instruction pointer:
65
65
pop %rax
66
- mov %rax , (RUSTRT_IP*8 )(%rdi )
66
+ mov %rax , (RUSTRT_IP*8 )(RUSTRT_ARG0_S )
67
67
68
68
// Save non-volatile integer registers:
69
69
// (including RSP)
70
- mov %rbx , (RUSTRT_RBX*8 )(%rdi )
71
- mov %rsp , (RUSTRT_RSP*8 )(%rdi )
72
- mov %rbp , (RUSTRT_RBP*8 )(%rdi )
73
- mov %r12 , (RUSTRT_R12*8 )(%rdi )
74
- mov %r13 , (RUSTRT_R13*8 )(%rdi )
75
- mov %r14 , (RUSTRT_R14*8 )(%rdi )
76
- mov %r15 , (RUSTRT_R15*8 )(%rdi )
77
-
78
- // Save relevant argument registers:
79
- mov %rcx , (RUSTRT_RCX*8 )(%rdi )
80
- mov %rdi , (RUSTRT_RDI*8 )(%rdi )
70
+ mov %rbx , (RUSTRT_RBX*8 )(ARG0)
71
+ mov %rsp , (RUSTRT_RSP*8 )(ARG0)
72
+ mov %rbp , (RUSTRT_RBP*8 )(ARG0)
73
+ mov %r12 , (RUSTRT_R12*8 )(ARG0)
74
+ mov %r13 , (RUSTRT_R13*8 )(ARG0)
75
+ mov %r14 , (RUSTRT_R14*8 )(ARG0)
76
+ mov %r15 , (RUSTRT_R15*8 )(ARG0)
77
+
78
+ // Save 0th argument register:
79
+ mov ARG0, (RUSTRT_ARG0*8 )(ARG0)
81
80
82
81
// Save non-volatile XMM registers:
83
- movapd %xmm0 , (RUSTRT_XMM0*8 )(%rdi )
84
- movapd %xmm1 , (RUSTRT_XMM1*8 )(%rdi )
85
- movapd %xmm2 , (RUSTRT_XMM2*8 )(%rdi )
86
- movapd %xmm3 , (RUSTRT_XMM3*8 )(%rdi )
87
- movapd %xmm4 , (RUSTRT_XMM4*8 )(%rdi )
88
- movapd %xmm5 , (RUSTRT_XMM5*8 )(%rdi )
82
+ movapd %xmm0 , (RUSTRT_XMM0*8 )(ARG0 )
83
+ movapd %xmm1 , (RUSTRT_XMM1*8 )(ARG0 )
84
+ movapd %xmm2 , (RUSTRT_XMM2*8 )(ARG0 )
85
+ movapd %xmm3 , (RUSTRT_XMM3*8 )(ARG0 )
86
+ movapd %xmm4 , (RUSTRT_XMM4*8 )(ARG0 )
87
+ movapd %xmm5 , (RUSTRT_XMM5*8 )(ARG0 )
89
88
90
89
// Restore non-volatile integer registers:
91
90
// (including RSP)
92
- mov (RUSTRT_RBX*8 )(%rsi ), %rbx
93
- mov (RUSTRT_RSP*8 )(%rsi ), %rsp
94
- mov (RUSTRT_RBP*8 )(%rsi ), %rbp
95
- mov (RUSTRT_R12*8 )(%rsi ), %r12
96
- mov (RUSTRT_R13*8 )(%rsi ), %r13
97
- mov (RUSTRT_R14*8 )(%rsi ), %r14
98
- mov (RUSTRT_R15*8 )(%rsi ), %r15
99
-
100
- // Restore relevant argument registers:
101
- mov (RUSTRT_RCX*8 )(%rsi ), %rcx
102
- mov (RUSTRT_RDI*8 )(%rsi ), %rdi
91
+ mov (RUSTRT_RBX*8 )(ARG1), %rbx
92
+ mov (RUSTRT_RSP*8 )(ARG1), %rsp
93
+ mov (RUSTRT_RBP*8 )(ARG1), %rbp
94
+ mov (RUSTRT_R12*8 )(ARG1), %r12
95
+ mov (RUSTRT_R13*8 )(ARG1), %r13
96
+ mov (RUSTRT_R14*8 )(ARG1), %r14
97
+ mov (RUSTRT_R15*8 )(ARG1), %r15
98
+
99
+ // Restore 0th argument register:
100
+ mov (RUSTRT_ARG0*8 )(ARG1), ARG0
103
101
104
102
// Restore non-volatile XMM registers:
105
- movapd (RUSTRT_XMM0*8 )(%rsi ), %xmm0
106
- movapd (RUSTRT_XMM1*8 )(%rsi ), %xmm1
107
- movapd (RUSTRT_XMM2*8 )(%rsi ), %xmm2
108
- movapd (RUSTRT_XMM3*8 )(%rsi ), %xmm3
109
- movapd (RUSTRT_XMM4*8 )(%rsi ), %xmm4
110
- movapd (RUSTRT_XMM5*8 )(%rsi ), %xmm5
103
+ movapd (RUSTRT_XMM0*8 )(ARG1 ), %xmm0
104
+ movapd (RUSTRT_XMM1*8 )(ARG1 ), %xmm1
105
+ movapd (RUSTRT_XMM2*8 )(ARG1 ), %xmm2
106
+ movapd (RUSTRT_XMM3*8 )(ARG1 ), %xmm3
107
+ movapd (RUSTRT_XMM4*8 )(ARG1 ), %xmm4
108
+ movapd (RUSTRT_XMM5*8 )(ARG1 ), %xmm5
111
109
112
110
// Jump to the instruction pointer
113
111
// found in regs:
114
- jmp *(RUSTRT_IP*8 )(%rsi )
112
+ jmp *(RUSTRT_IP*8 )(ARG1 )
115
113
0 commit comments