diff options
Diffstat (limited to 'tools/bpf/bpftool')
| -rw-r--r-- | tools/bpf/bpftool/btf_dumper.c | 2 | ||||
| -rw-r--r-- | tools/bpf/bpftool/gen.c | 22 | ||||
| -rw-r--r-- | tools/bpf/bpftool/link.c | 4 | ||||
| -rw-r--r-- | tools/bpf/bpftool/main.h | 10 | ||||
| -rw-r--r-- | tools/bpf/bpftool/pids.c | 2 | ||||
| -rw-r--r-- | tools/bpf/bpftool/prog.c | 16 | 
6 files changed, 40 insertions, 16 deletions
| diff --git a/tools/bpf/bpftool/btf_dumper.c b/tools/bpf/bpftool/btf_dumper.c index ede162f83eea..0e9310727281 100644 --- a/tools/bpf/bpftool/btf_dumper.c +++ b/tools/bpf/bpftool/btf_dumper.c @@ -67,7 +67,7 @@ static int dump_prog_id_as_func_ptr(const struct btf_dumper *d,  	if (!info->btf_id || !info->nr_func_info ||  	    btf__get_from_id(info->btf_id, &prog_btf))  		goto print; -	finfo = (struct bpf_func_info *)info->func_info; +	finfo = u64_to_ptr(info->func_info);  	func_type = btf__type_by_id(prog_btf, finfo->type_id);  	if (!func_type || !btf_is_func(func_type))  		goto print; diff --git a/tools/bpf/bpftool/gen.c b/tools/bpf/bpftool/gen.c index 8a4c2b3b0cd6..f61184653633 100644 --- a/tools/bpf/bpftool/gen.c +++ b/tools/bpf/bpftool/gen.c @@ -143,6 +143,20 @@ static int codegen_datasec_def(struct bpf_object *obj,  			      var_name, align);  			return -EINVAL;  		} +		/* Assume 32-bit architectures when generating data section +		 * struct memory layout. Given bpftool can't know which target +		 * host architecture it's emitting skeleton for, we need to be +		 * conservative and assume 32-bit one to ensure enough padding +		 * bytes are generated for pointer and long types. This will +		 * still work correctly for 64-bit architectures, because in +		 * the worst case we'll generate unnecessary padding field, +		 * which on 64-bit architectures is not strictly necessary and +		 * would be handled by natural 8-byte alignment. But it still +		 * will be a correct memory layout, based on recorded offsets +		 * in BTF. +		 */ +		if (align > 4) +			align = 4;  		align_off = (off + align - 1) / align * align;  		if (align_off != need_off) { @@ -397,7 +411,7 @@ static int do_skeleton(int argc, char **argv)  		{							    \n\  			struct %1$s *obj;				    \n\  									    \n\ -			obj = (typeof(obj))calloc(1, sizeof(*obj));	    \n\ +			obj = (struct %1$s *)calloc(1, sizeof(*obj));	    \n\  			if (!obj)					    \n\  				return NULL;				    \n\  			if (%1$s__create_skeleton(obj))			    \n\ @@ -461,7 +475,7 @@ static int do_skeleton(int argc, char **argv)  		{							    \n\  			struct bpf_object_skeleton *s;			    \n\  									    \n\ -			s = (typeof(s))calloc(1, sizeof(*s));		    \n\ +			s = (struct bpf_object_skeleton *)calloc(1, sizeof(*s));\n\  			if (!s)						    \n\  				return -1;				    \n\  			obj->skeleton = s;				    \n\ @@ -479,7 +493,7 @@ static int do_skeleton(int argc, char **argv)  				/* maps */				    \n\  				s->map_cnt = %zu;			    \n\  				s->map_skel_sz = sizeof(*s->maps);	    \n\ -				s->maps = (typeof(s->maps))calloc(s->map_cnt, s->map_skel_sz);\n\ +				s->maps = (struct bpf_map_skeleton *)calloc(s->map_cnt, s->map_skel_sz);\n\  				if (!s->maps)				    \n\  					goto err;			    \n\  			", @@ -515,7 +529,7 @@ static int do_skeleton(int argc, char **argv)  				/* programs */				    \n\  				s->prog_cnt = %zu;			    \n\  				s->prog_skel_sz = sizeof(*s->progs);	    \n\ -				s->progs = (typeof(s->progs))calloc(s->prog_cnt, s->prog_skel_sz);\n\ +				s->progs = (struct bpf_prog_skeleton *)calloc(s->prog_cnt, s->prog_skel_sz);\n\  				if (!s->progs)				    \n\  					goto err;			    \n\  			", diff --git a/tools/bpf/bpftool/link.c b/tools/bpf/bpftool/link.c index 1b793759170e..a89f09e3c848 100644 --- a/tools/bpf/bpftool/link.c +++ b/tools/bpf/bpftool/link.c @@ -106,7 +106,7 @@ static int show_link_close_json(int fd, struct bpf_link_info *info)  	switch (info->type) {  	case BPF_LINK_TYPE_RAW_TRACEPOINT:  		jsonw_string_field(json_wtr, "tp_name", -				   (const char *)info->raw_tracepoint.tp_name); +				   u64_to_ptr(info->raw_tracepoint.tp_name));  		break;  	case BPF_LINK_TYPE_TRACING:  		err = get_prog_info(info->prog_id, &prog_info); @@ -185,7 +185,7 @@ static int show_link_close_plain(int fd, struct bpf_link_info *info)  	switch (info->type) {  	case BPF_LINK_TYPE_RAW_TRACEPOINT:  		printf("\n\ttp '%s'  ", -		       (const char *)info->raw_tracepoint.tp_name); +		       (const char *)u64_to_ptr(info->raw_tracepoint.tp_name));  		break;  	case BPF_LINK_TYPE_TRACING:  		err = get_prog_info(info->prog_id, &prog_info); diff --git a/tools/bpf/bpftool/main.h b/tools/bpf/bpftool/main.h index e3a79b5a9960..c46e52137b87 100644 --- a/tools/bpf/bpftool/main.h +++ b/tools/bpf/bpftool/main.h @@ -21,7 +21,15 @@  /* Make sure we do not use kernel-only integer typedefs */  #pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 -#define ptr_to_u64(ptr)	((__u64)(unsigned long)(ptr)) +static inline __u64 ptr_to_u64(const void *ptr) +{ +	return (__u64)(unsigned long)ptr; +} + +static inline void *u64_to_ptr(__u64 ptr) +{ +	return (void *)(unsigned long)ptr; +}  #define NEXT_ARG()	({ argc--; argv++; if (argc < 0) usage(); })  #define NEXT_ARGP()	({ (*argc)--; (*argv)++; if (*argc < 0) usage(); }) diff --git a/tools/bpf/bpftool/pids.c b/tools/bpf/bpftool/pids.c index e3b116325403..df7d8ec76036 100644 --- a/tools/bpf/bpftool/pids.c +++ b/tools/bpf/bpftool/pids.c @@ -134,6 +134,8 @@ int build_obj_refs_table(struct obj_refs_table *table, enum bpf_obj_type type)  	while (true) {  		ret = read(fd, buf, sizeof(buf));  		if (ret < 0) { +			if (errno == EAGAIN) +				continue;  			err = -errno;  			p_err("failed to read PID iterator output: %d", err);  			goto out; diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index 158995d853b0..d393eb8263a6 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -428,14 +428,14 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,  			p_info("no instructions returned");  			return -1;  		} -		buf = (unsigned char *)(info->jited_prog_insns); +		buf = u64_to_ptr(info->jited_prog_insns);  		member_len = info->jited_prog_len;  	} else {	/* DUMP_XLATED */  		if (info->xlated_prog_len == 0 || !info->xlated_prog_insns) {  			p_err("error retrieving insn dump: kernel.kptr_restrict set?");  			return -1;  		} -		buf = (unsigned char *)info->xlated_prog_insns; +		buf = u64_to_ptr(info->xlated_prog_insns);  		member_len = info->xlated_prog_len;  	} @@ -444,7 +444,7 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,  		return -1;  	} -	func_info = (void *)info->func_info; +	func_info = u64_to_ptr(info->func_info);  	if (info->nr_line_info) {  		prog_linfo = bpf_prog_linfo__new(info); @@ -462,7 +462,7 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,  		n = write(fd, buf, member_len);  		close(fd); -		if (n != member_len) { +		if (n != (ssize_t)member_len) {  			p_err("error writing output file: %s",  			      n < 0 ? strerror(errno) : "short write");  			return -1; @@ -492,13 +492,13 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,  			__u32 i;  			if (info->nr_jited_ksyms) {  				kernel_syms_load(&dd); -				ksyms = (__u64 *) info->jited_ksyms; +				ksyms = u64_to_ptr(info->jited_ksyms);  			}  			if (json_output)  				jsonw_start_array(json_wtr); -			lens = (__u32 *) info->jited_func_lens; +			lens = u64_to_ptr(info->jited_func_lens);  			for (i = 0; i < info->nr_jited_func_lens; i++) {  				if (ksyms) {  					sym = kernel_syms_search(&dd, ksyms[i]); @@ -559,7 +559,7 @@ prog_dump(struct bpf_prog_info *info, enum dump_mode mode,  	} else {  		kernel_syms_load(&dd);  		dd.nr_jited_ksyms = info->nr_jited_ksyms; -		dd.jited_ksyms = (__u64 *) info->jited_ksyms; +		dd.jited_ksyms = u64_to_ptr(info->jited_ksyms);  		dd.btf = btf;  		dd.func_info = func_info;  		dd.finfo_rec_size = info->func_info_rec_size; @@ -1681,7 +1681,7 @@ static char *profile_target_name(int tgt_fd)  		goto out;  	} -	func_info = (struct bpf_func_info *)(info_linear->info.func_info); +	func_info = u64_to_ptr(info_linear->info.func_info);  	t = btf__type_by_id(btf, func_info[0].type_id);  	if (!t) {  		p_err("btf %d doesn't have type %d", |