summaryrefslogtreecommitdiff
path: root/tools/lib
diff options
context:
space:
mode:
authorLuke Nelson <lukenels@cs.washington.edu>2020-04-07 01:16:04 +0300
committerDaniel Borkmann <daniel@iogearbox.net>2020-04-08 01:53:41 +0300
commit489553dd13a88d8a882db10622ba8b9b58582ce4 (patch)
treee63f93ad112d4eccb8ea2e11d31e3c98b6dcd2e3 /tools/lib
parent0ac16296ffc638f5163f9aeeeb1fe447268e449f (diff)
downloadlinux-489553dd13a88d8a882db10622ba8b9b58582ce4.tar.xz
riscv, bpf: Fix offset range checking for auipc+jalr on RV64
The existing code in emit_call on RV64 checks that the PC-relative offset to the function fits in 32 bits before calling emit_jump_and_link to emit an auipc+jalr pair. However, this check is incorrect because offsets in the range [2^31 - 2^11, 2^31 - 1] cannot be encoded using auipc+jalr on RV64 (see discussion [1]). The RISC-V spec has recently been updated to reflect this fact [2, 3]. This patch fixes the problem by moving the check on the offset into emit_jump_and_link and modifying it to the correct range of encodable offsets, which is [-2^31 - 2^11, 2^31 - 2^11). This also enforces the check on the offset to other uses of emit_jump_and_link (e.g., BPF_JA) as well. Currently, this bug is unlikely to be triggered, because the memory region from which JITed images are allocated is close enough to kernel text for the offsets to not become too large; and because the bounds on BPF program size are small enough. This patch prevents this problem from becoming an issue if either of these change. [1]: https://groups.google.com/a/groups.riscv.org/forum/#!topic/isa-dev/bwWFhBnnZFQ [2]: https://github.com/riscv/riscv-isa-manual/commit/b1e42e09ac55116dbf9de5e4fb326a5a90e4a993 [3]: https://github.com/riscv/riscv-isa-manual/commit/4c1b2066ebd2965a422e41eb262d0a208a7fea07 Signed-off-by: Luke Nelson <luke.r.nels@gmail.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20200406221604.18547-1-luke.r.nels@gmail.com
Diffstat (limited to 'tools/lib')
0 files changed, 0 insertions, 0 deletions