tools/testing/selftests/bpf/progs/test_ldsx_insn.c

Source file repositories/reference/linux-study-clean/tools/testing/selftests/bpf/progs/test_ldsx_insn.c

File Facts

System
Linux kernel
Corpus path
tools/testing/selftests/bpf/progs/test_ldsx_insn.c
Extension
.c
Size
2431 bytes
Lines
126
Domain
Support Tooling And Documentation
Bucket
tools
Inferred role
Support Tooling And Documentation: implementation source
Status
source implementation candidate

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

struct bpf_testmod_struct_arg_1 {
	int a;
};

long long int_member;

SEC("?fentry/bpf_testmod_test_arg_ptr_to_struct")
int BPF_PROG2(test_ptr_struct_arg, struct bpf_testmod_struct_arg_1 *, p)
{
	/* probed memory access */
	int_member = p->a;
        return 0;
}

long long set_optlen, set_retval;

SEC("?cgroup/getsockopt")
int _getsockopt(volatile struct bpf_sockopt *ctx)
{
	int old_optlen, old_retval;

	old_optlen = ctx->optlen;
	old_retval = ctx->retval;

	ctx->optlen = -1;
	ctx->retval = -1;

	/* sign extension for ctx member */
	set_optlen = ctx->optlen;
	set_retval = ctx->retval;

	ctx->optlen = old_optlen;
	ctx->retval = old_retval;

	return 0;
}

long long set_mark;

SEC("?tc")
int _tc(volatile struct __sk_buff *skb)
{
	long long tmp_mark;
	int old_mark;

	old_mark = skb->mark;

	skb->mark = 0xf6fe;

	/* narrowed sign extension for ctx member */
#if __clang_major__ >= 18
	/* force narrow one-byte signed load. Otherwise, compiler may
	 * generate a 32-bit unsigned load followed by an s8 movsx.
	 */
	asm volatile ("r1 = *(s8 *)(%[ctx] + %[off_mark])\n\t"
		      "%[tmp_mark] = r1"
		      : [tmp_mark]"=r"(tmp_mark)
		      : [ctx]"r"(skb),
			[off_mark]"i"(offsetof(struct __sk_buff, mark)
#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
			+ sizeof(skb->mark) - 1
#endif
			)
		      : "r1");
#else
	tmp_mark = (char)skb->mark;
#endif
	set_mark = tmp_mark;

	skb->mark = old_mark;

	return 0;
}

char _license[] SEC("license") = "GPL";

Annotation

Implementation Notes