.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com |
---|
2 | 3 | * Copyright (c) 2016 Facebook |
---|
3 | | - * |
---|
4 | | - * This program is free software; you can redistribute it and/or |
---|
5 | | - * modify it under the terms of version 2 of the GNU General Public |
---|
6 | | - * License as published by the Free Software Foundation. |
---|
7 | | - * |
---|
8 | | - * This program is distributed in the hope that it will be useful, but |
---|
9 | | - * WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
10 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
---|
11 | | - * General Public License for more details. |
---|
12 | 4 | */ |
---|
13 | 5 | |
---|
14 | 6 | #include <linux/bpf.h> |
---|
.. | .. |
---|
67 | 59 | [BPF_STX] = "stx", |
---|
68 | 60 | [BPF_ALU] = "alu", |
---|
69 | 61 | [BPF_JMP] = "jmp", |
---|
70 | | - [BPF_RET] = "BUG", |
---|
| 62 | + [BPF_JMP32] = "jmp32", |
---|
71 | 63 | [BPF_ALU64] = "alu64", |
---|
72 | 64 | }; |
---|
73 | 65 | |
---|
.. | .. |
---|
136 | 128 | else |
---|
137 | 129 | print_bpf_end_insn(verbose, cbs->private_data, insn); |
---|
138 | 130 | } else if (BPF_OP(insn->code) == BPF_NEG) { |
---|
139 | | - verbose(cbs->private_data, "(%02x) r%d = %s-r%d\n", |
---|
140 | | - insn->code, insn->dst_reg, |
---|
141 | | - class == BPF_ALU ? "(u32) " : "", |
---|
| 131 | + verbose(cbs->private_data, "(%02x) %c%d = -%c%d\n", |
---|
| 132 | + insn->code, class == BPF_ALU ? 'w' : 'r', |
---|
| 133 | + insn->dst_reg, class == BPF_ALU ? 'w' : 'r', |
---|
142 | 134 | insn->dst_reg); |
---|
143 | 135 | } else if (BPF_SRC(insn->code) == BPF_X) { |
---|
144 | | - verbose(cbs->private_data, "(%02x) %sr%d %s %sr%d\n", |
---|
145 | | - insn->code, class == BPF_ALU ? "(u32) " : "", |
---|
| 136 | + verbose(cbs->private_data, "(%02x) %c%d %s %c%d\n", |
---|
| 137 | + insn->code, class == BPF_ALU ? 'w' : 'r', |
---|
146 | 138 | insn->dst_reg, |
---|
147 | 139 | bpf_alu_string[BPF_OP(insn->code) >> 4], |
---|
148 | | - class == BPF_ALU ? "(u32) " : "", |
---|
| 140 | + class == BPF_ALU ? 'w' : 'r', |
---|
149 | 141 | insn->src_reg); |
---|
150 | 142 | } else { |
---|
151 | | - verbose(cbs->private_data, "(%02x) %sr%d %s %s%d\n", |
---|
152 | | - insn->code, class == BPF_ALU ? "(u32) " : "", |
---|
| 143 | + verbose(cbs->private_data, "(%02x) %c%d %s %d\n", |
---|
| 144 | + insn->code, class == BPF_ALU ? 'w' : 'r', |
---|
153 | 145 | insn->dst_reg, |
---|
154 | 146 | bpf_alu_string[BPF_OP(insn->code) >> 4], |
---|
155 | | - class == BPF_ALU ? "(u32) " : "", |
---|
156 | 147 | insn->imm); |
---|
157 | 148 | } |
---|
158 | 149 | } else if (class == BPF_STX) { |
---|
.. | .. |
---|
208 | 199 | * part of the ldimm64 insn is accessible. |
---|
209 | 200 | */ |
---|
210 | 201 | u64 imm = ((u64)(insn + 1)->imm << 32) | (u32)insn->imm; |
---|
211 | | - bool map_ptr = insn->src_reg == BPF_PSEUDO_MAP_FD; |
---|
| 202 | + bool is_ptr = insn->src_reg == BPF_PSEUDO_MAP_FD || |
---|
| 203 | + insn->src_reg == BPF_PSEUDO_MAP_VALUE; |
---|
212 | 204 | char tmp[64]; |
---|
213 | 205 | |
---|
214 | | - if (map_ptr && !allow_ptr_leaks) |
---|
| 206 | + if (is_ptr && !allow_ptr_leaks) |
---|
215 | 207 | imm = 0; |
---|
216 | 208 | |
---|
217 | 209 | verbose(cbs->private_data, "(%02x) r%d = %s\n", |
---|
.. | .. |
---|
222 | 214 | verbose(cbs->private_data, "BUG_ld_%02x\n", insn->code); |
---|
223 | 215 | return; |
---|
224 | 216 | } |
---|
225 | | - } else if (class == BPF_JMP) { |
---|
| 217 | + } else if (class == BPF_JMP32 || class == BPF_JMP) { |
---|
226 | 218 | u8 opcode = BPF_OP(insn->code); |
---|
227 | 219 | |
---|
228 | 220 | if (opcode == BPF_CALL) { |
---|
.. | .. |
---|
246 | 238 | } else if (insn->code == (BPF_JMP | BPF_EXIT)) { |
---|
247 | 239 | verbose(cbs->private_data, "(%02x) exit\n", insn->code); |
---|
248 | 240 | } else if (BPF_SRC(insn->code) == BPF_X) { |
---|
249 | | - verbose(cbs->private_data, "(%02x) if r%d %s r%d goto pc%+d\n", |
---|
250 | | - insn->code, insn->dst_reg, |
---|
| 241 | + verbose(cbs->private_data, |
---|
| 242 | + "(%02x) if %c%d %s %c%d goto pc%+d\n", |
---|
| 243 | + insn->code, class == BPF_JMP32 ? 'w' : 'r', |
---|
| 244 | + insn->dst_reg, |
---|
251 | 245 | bpf_jmp_string[BPF_OP(insn->code) >> 4], |
---|
| 246 | + class == BPF_JMP32 ? 'w' : 'r', |
---|
252 | 247 | insn->src_reg, insn->off); |
---|
253 | 248 | } else { |
---|
254 | | - verbose(cbs->private_data, "(%02x) if r%d %s 0x%x goto pc%+d\n", |
---|
255 | | - insn->code, insn->dst_reg, |
---|
| 249 | + verbose(cbs->private_data, |
---|
| 250 | + "(%02x) if %c%d %s 0x%x goto pc%+d\n", |
---|
| 251 | + insn->code, class == BPF_JMP32 ? 'w' : 'r', |
---|
| 252 | + insn->dst_reg, |
---|
256 | 253 | bpf_jmp_string[BPF_OP(insn->code) >> 4], |
---|
257 | 254 | insn->imm, insn->off); |
---|
258 | 255 | } |
---|