projects/linux·blob master · refs

114 lines · 2.1 KiB

1// SPDX-License-Identifier: GPL-2.0
2/* Copyright (c) 2026 Meta Platforms, Inc. and affiliates. */
3
4#include <vmlinux.h>
5#include <bpf/bpf_helpers.h>
6#include "../test_kmods/bpf_testmod_kfunc.h"
7#include "bpf_misc.h"
8
9#if defined(__BPF_FEATURE_STACK_ARGUMENT)
10
11SEC("tc")
12__failure __msg("Unrecognized *(R11-8) type STRUCT")
13int test_stack_arg_big(struct __sk_buff *skb)
14{
15 struct prog_test_big_arg s = { .a = 1, .b = 2 };
16
17 return bpf_kfunc_call_stack_arg_big(1, 2, 3, 4, 5, s);
18}
19
20SEC("socket")
21__description("r11 in ALU instruction")
22__failure __msg("R11 is invalid")
23__naked void r11_alu_reject(void)
24{
25 asm volatile (
26 "r11 += 1;"
27 "r0 = 0;"
28 "exit;"
29 ::: __clobber_all);
30}
31
32SEC("socket")
33__description("r11 store with non-DW size")
34__failure __msg("R11 is invalid")
35__naked void r11_store_non_dw(void)
36{
37 asm volatile (
38 "*(u32 *)(r11 - 8) = r1;"
39 "r0 = 0;"
40 "exit;"
41 ::: __clobber_all);
42}
43
44SEC("socket")
45__description("r11 store with unaligned offset")
46__failure __msg("R11 is invalid")
47__naked void r11_store_unaligned(void)
48{
49 asm volatile (
50 "*(u64 *)(r11 - 4) = r1;"
51 "r0 = 0;"
52 "exit;"
53 ::: __clobber_all);
54}
55
56SEC("socket")
57__description("r11 store with positive offset")
58__failure __msg("R11 is invalid")
59__naked void r11_store_positive_off(void)
60{
61 asm volatile (
62 "*(u64 *)(r11 + 8) = r1;"
63 "r0 = 0;"
64 "exit;"
65 ::: __clobber_all);
66}
67
68SEC("socket")
69__description("r11 load with negative offset")
70__failure __msg("R11 is invalid")
71__naked void r11_load_negative_off(void)
72{
73 asm volatile (
74 "r0 = *(u64 *)(r11 - 8);"
75 "exit;"
76 ::: __clobber_all);
77}
78
79SEC("socket")
80__description("r11 load with non-DW size")
81__failure __msg("R11 is invalid")
82__naked void r11_load_non_dw(void)
83{
84 asm volatile (
85 "r0 = *(u32 *)(r11 + 8);"
86 "exit;"
87 ::: __clobber_all);
88}
89
90SEC("socket")
91__description("r11 store with zero offset")
92__failure __msg("R11 is invalid")
93__naked void r11_store_zero_off(void)
94{
95 asm volatile (
96 "*(u64 *)(r11 + 0) = r1;"
97 "r0 = 0;"
98 "exit;"
99 ::: __clobber_all);
100}
101
102#else
103
104SEC("tc")
105__description("stack_arg_fail: not supported, dummy test")
106__success
107int test_stack_arg_big(struct __sk_buff *skb)
108{
109 return 0;
110}
111
112#endif
113
114char _license[] SEC("license") = "GPL";