Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b0970f23 authored by Daniel Borkmann's avatar Daniel Borkmann
Browse files

Merge branch 'bpf-accurate-prog-addr'



Song Liu says:

====================
Changes v1 -> v2:
1. Added main program length to bpf_prog_info->jited_fun_lens (3/3).
2. Updated commit message of 1/3 and 2/3 with more background about the
   address masking, and why it is still save after the changes.
3. Replace "ulong" with "unsigned long".

This set improves bpf program address showed in /proc/kallsyms and in
bpf_prog_info. First, real program address is showed instead of page
address. Second, when there is no subprogram, bpf_prog_info->jited_ksyms
and bpf_prog_info->jited_fun_lens returns the main prog address and
length.
====================

Acked-by: default avatarAlexei Starovoitov <ast@kernel.org>
Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
parents 7de414a9 ff1889fc
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -553,7 +553,6 @@ bool is_bpf_text_address(unsigned long addr)
int bpf_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
		    char *sym)
{
	unsigned long symbol_start, symbol_end;
	struct bpf_prog_aux *aux;
	unsigned int it = 0;
	int ret = -ERANGE;
@@ -566,10 +565,9 @@ int bpf_get_kallsym(unsigned int symnum, unsigned long *value, char *type,
		if (it++ != symnum)
			continue;

		bpf_get_prog_addr_region(aux->prog, &symbol_start, &symbol_end);
		bpf_get_prog_name(aux->prog, sym);

		*value = symbol_start;
		*value = (unsigned long)aux->prog->bpf_func;
		*type  = BPF_SYM_ELF_TYPE;

		ret = 0;
+24 −10
Original line number Diff line number Diff line
@@ -2158,11 +2158,11 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
	}

	ulen = info.nr_jited_ksyms;
	info.nr_jited_ksyms = prog->aux->func_cnt;
	info.nr_jited_ksyms = prog->aux->func_cnt ? : 1;
	if (info.nr_jited_ksyms && ulen) {
		if (bpf_dump_raw_ok()) {
			unsigned long ksym_addr;
			u64 __user *user_ksyms;
			ulong ksym_addr;
			u32 i;

			/* copy the address of the kernel symbol
@@ -2170,10 +2170,17 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
			 */
			ulen = min_t(u32, info.nr_jited_ksyms, ulen);
			user_ksyms = u64_to_user_ptr(info.jited_ksyms);
			if (prog->aux->func_cnt) {
				for (i = 0; i < ulen; i++) {
				ksym_addr = (ulong) prog->aux->func[i]->bpf_func;
				ksym_addr &= PAGE_MASK;
				if (put_user((u64) ksym_addr, &user_ksyms[i]))
					ksym_addr = (unsigned long)
						prog->aux->func[i]->bpf_func;
					if (put_user((u64) ksym_addr,
						     &user_ksyms[i]))
						return -EFAULT;
				}
			} else {
				ksym_addr = (unsigned long) prog->bpf_func;
				if (put_user((u64) ksym_addr, &user_ksyms[0]))
					return -EFAULT;
			}
		} else {
@@ -2182,7 +2189,7 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
	}

	ulen = info.nr_jited_func_lens;
	info.nr_jited_func_lens = prog->aux->func_cnt;
	info.nr_jited_func_lens = prog->aux->func_cnt ? : 1;
	if (info.nr_jited_func_lens && ulen) {
		if (bpf_dump_raw_ok()) {
			u32 __user *user_lens;
@@ -2191,11 +2198,18 @@ static int bpf_prog_get_info_by_fd(struct bpf_prog *prog,
			/* copy the JITed image lengths for each function */
			ulen = min_t(u32, info.nr_jited_func_lens, ulen);
			user_lens = u64_to_user_ptr(info.jited_func_lens);
			if (prog->aux->func_cnt) {
				for (i = 0; i < ulen; i++) {
				func_len = prog->aux->func[i]->jited_len;
					func_len =
						prog->aux->func[i]->jited_len;
					if (put_user(func_len, &user_lens[i]))
						return -EFAULT;
				}
			} else {
				func_len = prog->jited_len;
				if (put_user(func_len, &user_lens[0]))
					return -EFAULT;
			}
		} else {
			info.jited_func_lens = 0;
		}