-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests/bpf: Add a selftest for checking subreg equality
Add a selftest to ensure subreg equality if source register upper 32bit is 0. Without previous patch, the test will fail verification. Acked-by: Eduard Zingerman <eddyz87@gmail.com> Signed-off-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/r/20230417222139.360607-1-yhs@fb.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
- Loading branch information
Yonghong Song
authored and
Alexei Starovoitov
committed
Apr 17, 2023
1 parent
3be49f7
commit 49859de
Showing
2 changed files
with
60 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
|
||
#include <linux/bpf.h> | ||
#include <bpf/bpf_helpers.h> | ||
#include "bpf_misc.h" | ||
|
||
SEC("socket") | ||
__description("check w reg equal if r reg upper32 bits 0") | ||
__success | ||
__naked void subreg_equality_1(void) | ||
{ | ||
asm volatile (" \ | ||
call %[bpf_ktime_get_ns]; \ | ||
*(u64 *)(r10 - 8) = r0; \ | ||
r2 = *(u32 *)(r10 - 8); \ | ||
/* At this point upper 4-bytes of r2 are 0, \ | ||
* thus insn w3 = w2 should propagate reg id, \ | ||
* and w2 < 9 comparison would also propagate \ | ||
* the range for r3. \ | ||
*/ \ | ||
w3 = w2; \ | ||
if w2 < 9 goto l0_%=; \ | ||
exit; \ | ||
l0_%=: if r3 < 9 goto l1_%=; \ | ||
/* r1 read is illegal at this point */ \ | ||
r0 -= r1; \ | ||
l1_%=: exit; \ | ||
" : | ||
: __imm(bpf_ktime_get_ns) | ||
: __clobber_all); | ||
} | ||
|
||
SEC("socket") | ||
__description("check w reg not equal if r reg upper32 bits not 0") | ||
__failure __msg("R1 !read_ok") | ||
__naked void subreg_equality_2(void) | ||
{ | ||
asm volatile (" \ | ||
call %[bpf_ktime_get_ns]; \ | ||
r2 = r0; \ | ||
/* Upper 4-bytes of r2 may not be 0, thus insn \ | ||
* w3 = w2 should not propagate reg id, and \ | ||
* w2 < 9 comparison should not propagate \ | ||
* the range for r3 either. \ | ||
*/ \ | ||
w3 = w2; \ | ||
if w2 < 9 goto l0_%=; \ | ||
exit; \ | ||
l0_%=: if r3 < 9 goto l1_%=; \ | ||
/* r1 read is illegal at this point */ \ | ||
r0 -= r1; \ | ||
l1_%=: exit; \ | ||
" : | ||
: __imm(bpf_ktime_get_ns) | ||
: __clobber_all); | ||
} | ||
|
||
char _license[] SEC("license") = "GPL"; |