KVM: MIPS: Remove a "set but not used" variable
[linux-2.6-microblaze.git] / arch / powerpc / net / bpf_jit_comp.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * eBPF JIT compiler
4  *
5  * Copyright 2016 Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com>
6  *                IBM Corporation
7  *
8  * Based on the powerpc classic BPF JIT compiler by Matt Evans
9  */
10 #include <linux/moduleloader.h>
11 #include <asm/cacheflush.h>
12 #include <asm/asm-compat.h>
13 #include <linux/netdevice.h>
14 #include <linux/filter.h>
15 #include <linux/if_vlan.h>
16 #include <asm/kprobes.h>
17 #include <linux/bpf.h>
18
19 #include "bpf_jit.h"
20
21 static void bpf_jit_fill_ill_insns(void *area, unsigned int size)
22 {
23         memset32(area, BREAKPOINT_INSTRUCTION, size / 4);
24 }
25
26 /* Fix the branch target addresses for subprog calls */
27 static int bpf_jit_fixup_subprog_calls(struct bpf_prog *fp, u32 *image,
28                                        struct codegen_context *ctx, u32 *addrs)
29 {
30         const struct bpf_insn *insn = fp->insnsi;
31         bool func_addr_fixed;
32         u64 func_addr;
33         u32 tmp_idx;
34         int i, ret;
35
36         for (i = 0; i < fp->len; i++) {
37                 /*
38                  * During the extra pass, only the branch target addresses for
39                  * the subprog calls need to be fixed. All other instructions
40                  * can left untouched.
41                  *
42                  * The JITed image length does not change because we already
43                  * ensure that the JITed instruction sequence for these calls
44                  * are of fixed length by padding them with NOPs.
45                  */
46                 if (insn[i].code == (BPF_JMP | BPF_CALL) &&
47                     insn[i].src_reg == BPF_PSEUDO_CALL) {
48                         ret = bpf_jit_get_func_addr(fp, &insn[i], true,
49                                                     &func_addr,
50                                                     &func_addr_fixed);
51                         if (ret < 0)
52                                 return ret;
53
54                         /*
55                          * Save ctx->idx as this would currently point to the
56                          * end of the JITed image and set it to the offset of
57                          * the instruction sequence corresponding to the
58                          * subprog call temporarily.
59                          */
60                         tmp_idx = ctx->idx;
61                         ctx->idx = addrs[i] / 4;
62                         bpf_jit_emit_func_call_rel(image, ctx, func_addr);
63
64                         /*
65                          * Restore ctx->idx here. This is safe as the length
66                          * of the JITed sequence remains unchanged.
67                          */
68                         ctx->idx = tmp_idx;
69                 }
70         }
71
72         return 0;
73 }
74
75 struct powerpc64_jit_data {
76         struct bpf_binary_header *header;
77         u32 *addrs;
78         u8 *image;
79         u32 proglen;
80         struct codegen_context ctx;
81 };
82
83 bool bpf_jit_needs_zext(void)
84 {
85         return true;
86 }
87
88 struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp)
89 {
90         u32 proglen;
91         u32 alloclen;
92         u8 *image = NULL;
93         u32 *code_base;
94         u32 *addrs;
95         struct powerpc64_jit_data *jit_data;
96         struct codegen_context cgctx;
97         int pass;
98         int flen;
99         struct bpf_binary_header *bpf_hdr;
100         struct bpf_prog *org_fp = fp;
101         struct bpf_prog *tmp_fp;
102         bool bpf_blinded = false;
103         bool extra_pass = false;
104
105         if (!fp->jit_requested)
106                 return org_fp;
107
108         tmp_fp = bpf_jit_blind_constants(org_fp);
109         if (IS_ERR(tmp_fp))
110                 return org_fp;
111
112         if (tmp_fp != org_fp) {
113                 bpf_blinded = true;
114                 fp = tmp_fp;
115         }
116
117         jit_data = fp->aux->jit_data;
118         if (!jit_data) {
119                 jit_data = kzalloc(sizeof(*jit_data), GFP_KERNEL);
120                 if (!jit_data) {
121                         fp = org_fp;
122                         goto out;
123                 }
124                 fp->aux->jit_data = jit_data;
125         }
126
127         flen = fp->len;
128         addrs = jit_data->addrs;
129         if (addrs) {
130                 cgctx = jit_data->ctx;
131                 image = jit_data->image;
132                 bpf_hdr = jit_data->header;
133                 proglen = jit_data->proglen;
134                 alloclen = proglen + FUNCTION_DESCR_SIZE;
135                 extra_pass = true;
136                 goto skip_init_ctx;
137         }
138
139         addrs = kcalloc(flen + 1, sizeof(*addrs), GFP_KERNEL);
140         if (addrs == NULL) {
141                 fp = org_fp;
142                 goto out_addrs;
143         }
144
145         memset(&cgctx, 0, sizeof(struct codegen_context));
146         memcpy(cgctx.b2p, b2p, sizeof(cgctx.b2p));
147
148         /* Make sure that the stack is quadword aligned. */
149         cgctx.stack_size = round_up(fp->aux->stack_depth, 16);
150
151         /* Scouting faux-generate pass 0 */
152         if (bpf_jit_build_body(fp, 0, &cgctx, addrs, false)) {
153                 /* We hit something illegal or unsupported. */
154                 fp = org_fp;
155                 goto out_addrs;
156         }
157
158         /*
159          * If we have seen a tail call, we need a second pass.
160          * This is because bpf_jit_emit_common_epilogue() is called
161          * from bpf_jit_emit_tail_call() with a not yet stable ctx->seen.
162          */
163         if (cgctx.seen & SEEN_TAILCALL) {
164                 cgctx.idx = 0;
165                 if (bpf_jit_build_body(fp, 0, &cgctx, addrs, false)) {
166                         fp = org_fp;
167                         goto out_addrs;
168                 }
169         }
170
171         bpf_jit_realloc_regs(&cgctx);
172         /*
173          * Pretend to build prologue, given the features we've seen.  This will
174          * update ctgtx.idx as it pretends to output instructions, then we can
175          * calculate total size from idx.
176          */
177         bpf_jit_build_prologue(0, &cgctx);
178         bpf_jit_build_epilogue(0, &cgctx);
179
180         proglen = cgctx.idx * 4;
181         alloclen = proglen + FUNCTION_DESCR_SIZE;
182
183         bpf_hdr = bpf_jit_binary_alloc(alloclen, &image, 4, bpf_jit_fill_ill_insns);
184         if (!bpf_hdr) {
185                 fp = org_fp;
186                 goto out_addrs;
187         }
188
189 skip_init_ctx:
190         code_base = (u32 *)(image + FUNCTION_DESCR_SIZE);
191
192         if (extra_pass) {
193                 /*
194                  * Do not touch the prologue and epilogue as they will remain
195                  * unchanged. Only fix the branch target address for subprog
196                  * calls in the body.
197                  *
198                  * This does not change the offsets and lengths of the subprog
199                  * call instruction sequences and hence, the size of the JITed
200                  * image as well.
201                  */
202                 bpf_jit_fixup_subprog_calls(fp, code_base, &cgctx, addrs);
203
204                 /* There is no need to perform the usual passes. */
205                 goto skip_codegen_passes;
206         }
207
208         /* Code generation passes 1-2 */
209         for (pass = 1; pass < 3; pass++) {
210                 /* Now build the prologue, body code & epilogue for real. */
211                 cgctx.idx = 0;
212                 bpf_jit_build_prologue(code_base, &cgctx);
213                 bpf_jit_build_body(fp, code_base, &cgctx, addrs, extra_pass);
214                 bpf_jit_build_epilogue(code_base, &cgctx);
215
216                 if (bpf_jit_enable > 1)
217                         pr_info("Pass %d: shrink = %d, seen = 0x%x\n", pass,
218                                 proglen - (cgctx.idx * 4), cgctx.seen);
219         }
220
221 skip_codegen_passes:
222         if (bpf_jit_enable > 1)
223                 /*
224                  * Note that we output the base address of the code_base
225                  * rather than image, since opcodes are in code_base.
226                  */
227                 bpf_jit_dump(flen, proglen, pass, code_base);
228
229 #ifdef PPC64_ELF_ABI_v1
230         /* Function descriptor nastiness: Address + TOC */
231         ((u64 *)image)[0] = (u64)code_base;
232         ((u64 *)image)[1] = local_paca->kernel_toc;
233 #endif
234
235         fp->bpf_func = (void *)image;
236         fp->jited = 1;
237         fp->jited_len = alloclen;
238
239         bpf_flush_icache(bpf_hdr, (u8 *)bpf_hdr + (bpf_hdr->pages * PAGE_SIZE));
240         bpf_jit_binary_lock_ro(bpf_hdr);
241         if (!fp->is_func || extra_pass) {
242                 bpf_prog_fill_jited_linfo(fp, addrs);
243 out_addrs:
244                 kfree(addrs);
245                 kfree(jit_data);
246                 fp->aux->jit_data = NULL;
247         } else {
248                 jit_data->addrs = addrs;
249                 jit_data->ctx = cgctx;
250                 jit_data->proglen = proglen;
251                 jit_data->image = image;
252                 jit_data->header = bpf_hdr;
253         }
254
255 out:
256         if (bpf_blinded)
257                 bpf_jit_prog_release_other(fp, fp == org_fp ? tmp_fp : org_fp);
258
259         return fp;
260 }