1*6f59deb3SSun Jian // SPDX-License-Identifier: GPL-2.0 2*6f59deb3SSun Jian 3*6f59deb3SSun Jian #include <vmlinux.h> 4*6f59deb3SSun Jian #include <bpf/bpf_helpers.h> 5*6f59deb3SSun Jian #include "bpf_misc.h" 6*6f59deb3SSun Jian 7*6f59deb3SSun Jian SEC("iter/bpf_map_elem") 8*6f59deb3SSun Jian __description("PTR_TO_BUF: reject negative const offset") 9*6f59deb3SSun Jian __failure 10*6f59deb3SSun Jian __msg("invalid negative rdwr buffer offset") ptr_to_buf_reject_negative_const_offset(void)11*6f59deb3SSun Jian__naked void ptr_to_buf_reject_negative_const_offset(void) 12*6f59deb3SSun Jian { 13*6f59deb3SSun Jian asm volatile ("r0 = 0; \ 14*6f59deb3SSun Jian r2 = *(u64 *)(r1 + %[value_off]); \ 15*6f59deb3SSun Jian if r2 == 0 goto l0_%=; \ 16*6f59deb3SSun Jian r2 += -8; \ 17*6f59deb3SSun Jian r0 = *(u64 *)(r2 + 0); \ 18*6f59deb3SSun Jian l0_%=: \ 19*6f59deb3SSun Jian exit; \ 20*6f59deb3SSun Jian " 21*6f59deb3SSun Jian : 22*6f59deb3SSun Jian : __imm_const(value_off, 23*6f59deb3SSun Jian offsetof(struct bpf_iter__bpf_map_elem, value)) 24*6f59deb3SSun Jian : __clobber_all); 25*6f59deb3SSun Jian } 26*6f59deb3SSun Jian 27*6f59deb3SSun Jian char _license[] SEC("license") = "GPL"; 28