hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/kernel/bpf/disasm.c
....@@ -1,14 +1,6 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com
23 * 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.
124 */
135
146 #include <linux/bpf.h>
....@@ -67,7 +59,7 @@
6759 [BPF_STX] = "stx",
6860 [BPF_ALU] = "alu",
6961 [BPF_JMP] = "jmp",
70
- [BPF_RET] = "BUG",
62
+ [BPF_JMP32] = "jmp32",
7163 [BPF_ALU64] = "alu64",
7264 };
7365
....@@ -136,23 +128,22 @@
136128 else
137129 print_bpf_end_insn(verbose, cbs->private_data, insn);
138130 } 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',
142134 insn->dst_reg);
143135 } 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',
146138 insn->dst_reg,
147139 bpf_alu_string[BPF_OP(insn->code) >> 4],
148
- class == BPF_ALU ? "(u32) " : "",
140
+ class == BPF_ALU ? 'w' : 'r',
149141 insn->src_reg);
150142 } 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',
153145 insn->dst_reg,
154146 bpf_alu_string[BPF_OP(insn->code) >> 4],
155
- class == BPF_ALU ? "(u32) " : "",
156147 insn->imm);
157148 }
158149 } else if (class == BPF_STX) {
....@@ -208,10 +199,11 @@
208199 * part of the ldimm64 insn is accessible.
209200 */
210201 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;
212204 char tmp[64];
213205
214
- if (map_ptr && !allow_ptr_leaks)
206
+ if (is_ptr && !allow_ptr_leaks)
215207 imm = 0;
216208
217209 verbose(cbs->private_data, "(%02x) r%d = %s\n",
....@@ -222,7 +214,7 @@
222214 verbose(cbs->private_data, "BUG_ld_%02x\n", insn->code);
223215 return;
224216 }
225
- } else if (class == BPF_JMP) {
217
+ } else if (class == BPF_JMP32 || class == BPF_JMP) {
226218 u8 opcode = BPF_OP(insn->code);
227219
228220 if (opcode == BPF_CALL) {
....@@ -246,13 +238,18 @@
246238 } else if (insn->code == (BPF_JMP | BPF_EXIT)) {
247239 verbose(cbs->private_data, "(%02x) exit\n", insn->code);
248240 } 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,
251245 bpf_jmp_string[BPF_OP(insn->code) >> 4],
246
+ class == BPF_JMP32 ? 'w' : 'r',
252247 insn->src_reg, insn->off);
253248 } 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,
256253 bpf_jmp_string[BPF_OP(insn->code) >> 4],
257254 insn->imm, insn->off);
258255 }