[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <b44b9ca8187f2ebeea8e03f0c215d4383112fdf5.1682673543.git.houwenlong.hwl@antgroup.com>
Date: Fri, 28 Apr 2023 17:51:10 +0800
From: "Hou Wenlong" <houwenlong.hwl@...group.com>
To: linux-kernel@...r.kernel.org
Cc: "Thomas Garnier" <thgarnie@...omium.org>,
"Lai Jiangshan" <jiangshan.ljs@...group.com>,
"Kees Cook" <keescook@...omium.org>,
"Hou Wenlong" <houwenlong.hwl@...group.com>,
"Alexei Starovoitov" <ast@...nel.org>,
"Daniel Borkmann" <daniel@...earbox.net>,
"Andrii Nakryiko" <andrii@...nel.org>,
"Martin KaFai Lau" <martin.lau@...ux.dev>,
"Song Liu" <song@...nel.org>, "Yonghong Song" <yhs@...com>,
"John Fastabend" <john.fastabend@...il.com>,
"KP Singh" <kpsingh@...nel.org>,
"Stanislav Fomichev" <sdf@...gle.com>,
"Hao Luo" <haoluo@...gle.com>, "Jiri Olsa" <jolsa@...nel.org>,
"David S. Miller" <davem@...emloft.net>,
"David Ahern" <dsahern@...nel.org>,
"Thomas Gleixner" <tglx@...utronix.de>,
"Ingo Molnar" <mingo@...hat.com>, "Borislav Petkov" <bp@...en8.de>,
"Dave Hansen" <dave.hansen@...ux.intel.com>, <x86@...nel.org>,
"H. Peter Anvin" <hpa@...or.com>, <bpf@...r.kernel.org>,
<netdev@...r.kernel.org>
Subject: [PATCH RFC 30/43] x86/bpf: Adapt BPF_CALL JIT codegen for PIE support
If image is NULL, ip calculated is in bottom address and func is in
kernel image address, then the offset is valid when the kernel stays in
the top 2G address space. However, PIE kernel image could be below top
2G, which makes the offset out of range. Since the length of
PC-relative call instruction is fixed, it's pointless to calculate the
offset without the proper image base (it has been zero until the last
pass). Use 1 as the dummy offset to generate the instruction in the
first pass.
Signed-off-by: Hou Wenlong <houwenlong.hwl@...group.com>
Cc: Thomas Garnier <thgarnie@...omium.org>
Cc: Lai Jiangshan <jiangshan.ljs@...group.com>
Cc: Kees Cook <keescook@...omium.org>
---
arch/x86/net/bpf_jit_comp.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/arch/x86/net/bpf_jit_comp.c b/arch/x86/net/bpf_jit_comp.c
index 1056bbf55b17..0da41833e426 100644
--- a/arch/x86/net/bpf_jit_comp.c
+++ b/arch/x86/net/bpf_jit_comp.c
@@ -1549,8 +1549,21 @@ st: if (is_imm8(insn->off))
return -EINVAL;
offs = x86_call_depth_emit_accounting(&prog, func);
}
- if (emit_call(&prog, func, image + addrs[i - 1] + offs))
- return -EINVAL;
+ /*
+ * If image is NULL, ip is in bottom address and func
+ * is in kernel image address (top 2G), so the offset
+ * is valid. However, PIE kernel image could be below
+ * top 2G, then the offset would be out of range. Since
+ * the length of PC-relative call(0xe8) is fixed, so it's
+ * pointless to calculate the offset until the last pass.
+ * Use 1 as the dummy offset if image is NULL.
+ */
+ if (image)
+ err = emit_call(&prog, func, image + addrs[i - 1] + offs);
+ else
+ err = emit_call(&prog, (void *)(X86_PATCH_SIZE + 1UL), 0);
+ if (err)
+ return err;
break;
}
--
2.31.1
Powered by blists - more mailing lists