48
49
bne .Lpseudo_cancel; \
49
50
cfi_remember_state; \
50
DO_CALL (syscall_name, 0); \
51
ldr r7, =SYS_ify (syscall_name); \
54
56
cfi_restore_state; \
58
.fnstart; /* matched by the .fnend in UNDOARGS below. */ \
57
59
DOCARGS_##args; /* save syscall args etc. around CENABLE. */ \
59
61
mov ip, r0; /* put mask in safe place. */ \
60
62
UNDOCARGS_##args; /* restore syscall args. */ \
61
63
ldr r7, =SYS_ify (syscall_name); \
62
64
swi 0x0; /* do the call. */ \
63
.fnend; /* Past here we can't easily unwind. */ \
64
65
mov r7, r0; /* save syscall return value. */ \
65
66
mov r0, ip; /* get mask back. */ \
72
/* DOARGS pushes four bytes on the stack for five arguments, eight bytes for
73
six arguments, and nothing for fewer. In order to preserve doubleword
73
/* DOARGS pushes eight bytes on the stack for five arguments, twelve bytes for
74
six arguments, and four bytes for fewer. In order to preserve doubleword
74
75
alignment, sometimes we must save an extra register. */
76
77
# define RESTART_UNWIND \
81
83
# define DOCARGS_0 \
82
stmfd sp!, {r7, lr}; \
83
cfi_adjust_cfa_offset (8); \
84
cfi_rel_offset (r7, 0); \
85
cfi_rel_offset (lr, 4); \
86
cfi_adjust_cfa_offset (4); \
87
cfi_rel_offset (lr, 0); \
87
89
# define UNDOCARGS_0
88
90
# define RESTORE_LR_0 \
89
ldmfd sp!, {r7, lr}; \
90
cfi_adjust_cfa_offset (-8); \
92
cfi_adjust_cfa_offset (-4); \
94
95
# define DOCARGS_1 \
95
stmfd sp!, {r0, r1, r7, lr}; \
96
cfi_adjust_cfa_offset (16); \
97
cfi_rel_offset (r7, 8); \
98
cfi_rel_offset (lr, 12); \
97
stmfd sp!, {r0, r1, lr}; \
98
cfi_adjust_cfa_offset (12); \
99
cfi_rel_offset (lr, 8); \
101
102
# define UNDOCARGS_1 \
102
103
ldr r0, [sp], #8; \
108
109
# define DOCARGS_2 \
109
stmfd sp!, {r0, r1, r7, lr}; \
110
cfi_adjust_cfa_offset (16); \
111
cfi_rel_offset (r7, 8); \
112
cfi_rel_offset (lr, 12); \
111
stmfd sp!, {r0, r1, lr}; \
112
cfi_adjust_cfa_offset (12); \
113
cfi_rel_offset (lr, 8); \
115
116
# define UNDOCARGS_2 \
116
117
ldmfd sp!, {r0, r1}; \
122
123
# define DOCARGS_3 \
123
stmfd sp!, {r0, r1, r2, r3, r7, lr}; \
124
cfi_adjust_cfa_offset (24); \
125
cfi_rel_offset (r7, 16); \
126
cfi_rel_offset (lr, 20); \
125
stmfd sp!, {r0, r1, r2, r3, lr}; \
126
cfi_adjust_cfa_offset (20); \
127
cfi_rel_offset (lr, 16); \
129
130
# define UNDOCARGS_3 \
130
131
ldmfd sp!, {r0, r1, r2, r3}; \
136
137
# define DOCARGS_4 \
137
stmfd sp!, {r0, r1, r2, r3, r7, lr}; \
138
cfi_adjust_cfa_offset (24); \
139
cfi_rel_offset (r7, 16); \
140
cfi_rel_offset (lr, 20); \
139
stmfd sp!, {r0, r1, r2, r3, lr}; \
140
cfi_adjust_cfa_offset (20); \
141
cfi_rel_offset (lr, 16); \
143
144
# define UNDOCARGS_4 \
144
145
ldmfd sp!, {r0, r1, r2, r3}; \
150
151
/* r4 is only stmfd'ed for correct stack alignment. */
151
152
# define DOCARGS_5 \
153
stmfd sp!, {r0, r1, r2, r3, r4, r7, lr}; \
154
cfi_adjust_cfa_offset (28); \
155
cfi_rel_offset (r7, 20); \
156
cfi_rel_offset (lr, 24); \
154
stmfd sp!, {r0, r1, r2, r3, r4, lr}; \
155
cfi_adjust_cfa_offset (24); \
156
cfi_rel_offset (lr, 20); \
159
159
# define UNDOCARGS_5 \
160
160
ldmfd sp!, {r0, r1, r2, r3}; \
161
161
cfi_adjust_cfa_offset (-16); \
167
167
# define RESTORE_LR_5 \
168
ldmfd sp!, {r4, r7, lr}; \
169
cfi_adjust_cfa_offset (-12); \
168
ldmfd sp!, {r4, lr}; \
169
cfi_adjust_cfa_offset (-8); \
170
170
/* r4 will be marked as restored later. */ \
174
173
# define DOCARGS_6 \
176
stmfd sp!, {r0, r1, r2, r3, r7, lr}; \
177
cfi_adjust_cfa_offset (24); \
178
cfi_rel_offset (r7, 16); \
179
cfi_rel_offset (lr, 20); \
174
.save {r4, r5, r7}; \
175
stmfd sp!, {r0, r1, r2, r3, lr}; \
176
cfi_adjust_cfa_offset (20); \
177
cfi_rel_offset (lr, 16); \
182
180
# define UNDOCARGS_6 \
183
181
ldmfd sp!, {r0, r1, r2, r3}; \
184
182
cfi_adjust_cfa_offset (-16); \
185
.save {r4, r5, r7}; \
189
187
# define RESTORE_LR_6 \