Thread (8 messages) flat view 8 messages, 3 authors, 2018-07-11

Re: [PATCH bpf-next v4 2/3] bpf: btf: add btf print functionality

From: Okash Khawaja <hidden>
Date: 2018-07-11 21:21:23
Also in: lkml

On Wed, Jul 11, 2018 at 10:08:35PM +0200, Daniel Borkmann wrote:
On 07/11/2018 09:10 PM, Jakub Kicinski wrote:
quoted
Thank you for all the changes made so far.

On Tue, 10 Jul 2018 20:21:10 -0700, Okash Khawaja wrote:
quoted
--- /dev/null
+++ b/tools/bpf/bpftool/btf_dumper.c
@@ -0,0 +1,248 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2018 Facebook */
+
+#include <linux/btf.h>
+#include <linux/err.h>
+#include <stdio.h> /* for (FILE *) used by json_writer */
+#include <linux/bitops.h>
+#include <string.h>
+#include <ctype.h>
Again, please sort the headers the way I suggested.  Otherwise as the
list of includes grows it's hard to know what's already there.
quoted
+#include "btf.h"
+#include "json_writer.h"
+#include "main.h"
+
+#define BITS_PER_BYTE_MASK (BITS_PER_BYTE - 1)
+#define BITS_PER_BYTE_MASKED(bits) ((bits) & BITS_PER_BYTE_MASK)
+#define BITS_ROUNDDOWN_BYTES(bits) ((bits) >> 3)
+#define BITS_ROUNDUP_BYTES(bits) \
+	(BITS_ROUNDDOWN_BYTES(bits) + !!BITS_PER_BYTE_MASKED(bits))
+
+static int btf_dumper_do_type(const struct btf_dumper *d, __u32 type_id,
+			      __u8 bit_offset, const void *data);
+
+static void btf_dumper_ptr(const void *data, json_writer_t *jw,
+			   bool is_plain_text)
+{
+	if (is_plain_text)
+		jsonw_printf(jw, "%p", *((unsigned long *)data));
+	else
+		jsonw_printf(jw, "%u", *((unsigned long *)data));
Again, please drop the extraneous parens. 
quoted
+}
+
quoted
+static void btf_dumper_int_bits(__u32 int_type, __u8 bit_offset,
+				const void *data, json_writer_t *jw,
+				bool is_plain_text)
+{
+	int left_shift_bits, right_shift_bits;
+	int nr_bits = BTF_INT_BITS(int_type);
+	int total_bits_offset;
+	int bytes_to_copy;
+	int bits_to_copy;
+	__u64 print_num;
+
+	total_bits_offset = bit_offset + BTF_INT_OFFSET(int_type);
+	data += BITS_ROUNDDOWN_BYTES(total_bits_offset);
+	bit_offset = BITS_PER_BYTE_MASKED(total_bits_offset);
+	bits_to_copy = bit_offset + nr_bits;
+	bytes_to_copy = BITS_ROUNDUP_BYTES(bits_to_copy);
+
+	print_num = 0;
+	memcpy(&print_num, data, bytes_to_copy);
+#ifdef __BIG_ENDIAN_BITFIELD
+	left_shift_bits = bit_offset;
+#else
+	left_shift_bits = 64 - bits_to_copy;
+#endif
+	right_shift_bits = 64 - nr_bits;
Please include <asm/byteorder.h> as I suggested to you previously.
This is dead code right now, look:

$ git diff
diff --git a/tools/bpf/bpftool/btf_dumper.c b/tools/bpf/bpftool/btf_dumper.c
index c64465094b92..045add07b721 100644
--- a/tools/bpf/bpftool/btf_dumper.c
+++ b/tools/bpf/bpftool/btf_dumper.c
@@ -91,7 +91,8 @@ static void btf_dumper_int_bits(__u32 int_type, __u8 bit_offset,
 
        print_num = 0;
        memcpy(&print_num, data, bytes_to_copy);
-#ifdef __BIG_ENDIAN_BITFIELD
+#ifndef __LITTLE_ENDIAN_BITFIELD
+#error "abc"
        left_shift_bits = bit_offset;
 #else
        left_shift_bits = 64 - bits_to_copy;
$ make -C tools/bpf/bpftool/ CC=gcc-8
make: Entering directory '/home/jkicinski/devel/linux/tools/bpf/bpftool'
  CC       btf_dumper.o
btf_dumper.c: In function ‘btf_dumper_int_bits’:
btf_dumper.c:95:2: error: #error "abc"
 #error "abc"
  ^~~~~
Makefile:96: recipe for target 'btf_dumper.o' failed
make: *** [btf_dumper.o] Error 1
make: Leaving directory '/home/jkicinski/devel/linux/tools/bpf/bpftool'
You could also easily test this on s390x (big endian) through a LinuxONE
test instance, this is how I usually test changes related to their JIT.
Thanks. I've been using MIPS qemu set up. This will definitely help.
Thanks,
Daniel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help