@@ -113,23 +113,19 @@ void bpf_jit_build_prologue(u32 *image, struct codegen_context *ctx)
113
113
{
114
114
int i ;
115
115
116
- /* First arg comes in as a 32 bits pointer. */
117
- EMIT (PPC_RAW_MR (bpf_to_ppc (BPF_REG_1 ), _R3 ));
118
- EMIT (PPC_RAW_LI (bpf_to_ppc (BPF_REG_1 ) - 1 , 0 ));
116
+ /* Initialize tail_call_cnt, to be skipped if we do tail calls. */
117
+ EMIT (PPC_RAW_LI (_R4 , 0 ));
118
+
119
+ #define BPF_TAILCALL_PROLOGUE_SIZE 4
120
+
119
121
EMIT (PPC_RAW_STWU (_R1 , _R1 , - BPF_PPC_STACKFRAME (ctx )));
120
122
121
- /*
122
- * Initialize tail_call_cnt in stack frame if we do tail calls.
123
- * Otherwise, put in NOPs so that it can be skipped when we are
124
- * invoked through a tail call.
125
- */
126
123
if (ctx -> seen & SEEN_TAILCALL )
127
- EMIT (PPC_RAW_STW (bpf_to_ppc (BPF_REG_1 ) - 1 , _R1 ,
128
- bpf_jit_stack_offsetof (ctx , BPF_PPC_TC )));
129
- else
130
- EMIT (PPC_RAW_NOP ());
124
+ EMIT (PPC_RAW_STW (_R4 , _R1 , bpf_jit_stack_offsetof (ctx , BPF_PPC_TC )));
131
125
132
- #define BPF_TAILCALL_PROLOGUE_SIZE 16
126
+ /* First arg comes in as a 32 bits pointer. */
127
+ EMIT (PPC_RAW_MR (bpf_to_ppc (BPF_REG_1 ), _R3 ));
128
+ EMIT (PPC_RAW_LI (bpf_to_ppc (BPF_REG_1 ) - 1 , 0 ));
133
129
134
130
/*
135
131
* We need a stack frame, but we don't necessarily need to
@@ -170,24 +166,24 @@ static void bpf_jit_emit_common_epilogue(u32 *image, struct codegen_context *ctx
170
166
for (i = BPF_PPC_NVR_MIN ; i <= 31 ; i ++ )
171
167
if (bpf_is_seen_register (ctx , i ))
172
168
EMIT (PPC_RAW_LWZ (i , _R1 , bpf_jit_stack_offsetof (ctx , i )));
173
- }
174
-
175
- void bpf_jit_build_epilogue (u32 * image , struct codegen_context * ctx )
176
- {
177
- EMIT (PPC_RAW_MR (_R3 , bpf_to_ppc (BPF_REG_0 )));
178
-
179
- bpf_jit_emit_common_epilogue (image , ctx );
180
-
181
- /* Tear down our stack frame */
182
169
183
170
if (ctx -> seen & SEEN_FUNC )
184
171
EMIT (PPC_RAW_LWZ (_R0 , _R1 , BPF_PPC_STACKFRAME (ctx ) + PPC_LR_STKOFF ));
185
172
173
+ /* Tear down our stack frame */
186
174
EMIT (PPC_RAW_ADDI (_R1 , _R1 , BPF_PPC_STACKFRAME (ctx )));
187
175
188
176
if (ctx -> seen & SEEN_FUNC )
189
177
EMIT (PPC_RAW_MTLR (_R0 ));
190
178
179
+ }
180
+
181
+ void bpf_jit_build_epilogue (u32 * image , struct codegen_context * ctx )
182
+ {
183
+ EMIT (PPC_RAW_MR (_R3 , bpf_to_ppc (BPF_REG_0 )));
184
+
185
+ bpf_jit_emit_common_epilogue (image , ctx );
186
+
191
187
EMIT (PPC_RAW_BLR ());
192
188
}
193
189
@@ -244,7 +240,6 @@ static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 o
244
240
EMIT (PPC_RAW_RLWINM (_R3 , b2p_index , 2 , 0 , 29 ));
245
241
EMIT (PPC_RAW_ADD (_R3 , _R3 , b2p_bpf_array ));
246
242
EMIT (PPC_RAW_LWZ (_R3 , _R3 , offsetof(struct bpf_array , ptrs )));
247
- EMIT (PPC_RAW_STW (_R0 , _R1 , bpf_jit_stack_offsetof (ctx , BPF_PPC_TC )));
248
243
249
244
/*
250
245
* if (prog == NULL)
@@ -255,19 +250,14 @@ static int bpf_jit_emit_tail_call(u32 *image, struct codegen_context *ctx, u32 o
255
250
256
251
/* goto *(prog->bpf_func + prologue_size); */
257
252
EMIT (PPC_RAW_LWZ (_R3 , _R3 , offsetof(struct bpf_prog , bpf_func )));
258
-
259
- if (ctx -> seen & SEEN_FUNC )
260
- EMIT (PPC_RAW_LWZ (_R0 , _R1 , BPF_PPC_STACKFRAME (ctx ) + PPC_LR_STKOFF ));
261
-
262
253
EMIT (PPC_RAW_ADDIC (_R3 , _R3 , BPF_TAILCALL_PROLOGUE_SIZE ));
263
-
264
- if (ctx -> seen & SEEN_FUNC )
265
- EMIT (PPC_RAW_MTLR (_R0 ));
266
-
267
254
EMIT (PPC_RAW_MTCTR (_R3 ));
268
255
269
256
EMIT (PPC_RAW_MR (_R3 , bpf_to_ppc (BPF_REG_1 )));
270
257
258
+ /* Put tail_call_cnt in r4 */
259
+ EMIT (PPC_RAW_MR (_R4 , _R0 ));
260
+
271
261
/* tear restore NVRs, ... */
272
262
bpf_jit_emit_common_epilogue (image , ctx );
273
263
0 commit comments