Loading...
Note: File does not exist in v4.6.
1// SPDX-License-Identifier: GPL-2.0
2
3#include <linux/bpf.h>
4#include <stdint.h>
5
6#include <bpf/bpf_helpers.h>
7#include <bpf/bpf_core_read.h>
8
9#include "bpf_misc.h"
10
11struct core_reloc_bitfields {
12 /* unsigned bitfields */
13 uint8_t ub1: 1;
14 uint8_t ub2: 2;
15 uint32_t ub7: 7;
16 /* signed bitfields */
17 int8_t sb4: 4;
18 int32_t sb20: 20;
19 /* non-bitfields */
20 uint32_t u32;
21 int32_t s32;
22} __attribute__((preserve_access_index));
23
24SEC("tc")
25__description("single CO-RE bitfield roundtrip")
26__btf_path("btf__core_reloc_bitfields.bpf.o")
27__success
28__retval(3)
29int single_field_roundtrip(struct __sk_buff *ctx)
30{
31 struct core_reloc_bitfields bitfields;
32
33 __builtin_memset(&bitfields, 0, sizeof(bitfields));
34 BPF_CORE_WRITE_BITFIELD(&bitfields, ub2, 3);
35 return BPF_CORE_READ_BITFIELD(&bitfields, ub2);
36}
37
38SEC("tc")
39__description("multiple CO-RE bitfield roundtrip")
40__btf_path("btf__core_reloc_bitfields.bpf.o")
41__success
42__retval(0x3FD)
43int multiple_field_roundtrip(struct __sk_buff *ctx)
44{
45 struct core_reloc_bitfields bitfields;
46 uint8_t ub2;
47 int8_t sb4;
48
49 __builtin_memset(&bitfields, 0, sizeof(bitfields));
50 BPF_CORE_WRITE_BITFIELD(&bitfields, ub2, 1);
51 BPF_CORE_WRITE_BITFIELD(&bitfields, sb4, -1);
52
53 ub2 = BPF_CORE_READ_BITFIELD(&bitfields, ub2);
54 sb4 = BPF_CORE_READ_BITFIELD(&bitfields, sb4);
55
56 return (((uint8_t)sb4) << 2) | ub2;
57}
58
59SEC("tc")
60__description("adjacent CO-RE bitfield roundtrip")
61__btf_path("btf__core_reloc_bitfields.bpf.o")
62__success
63__retval(7)
64int adjacent_field_roundtrip(struct __sk_buff *ctx)
65{
66 struct core_reloc_bitfields bitfields;
67 uint8_t ub1, ub2;
68
69 __builtin_memset(&bitfields, 0, sizeof(bitfields));
70 BPF_CORE_WRITE_BITFIELD(&bitfields, ub1, 1);
71 BPF_CORE_WRITE_BITFIELD(&bitfields, ub2, 3);
72
73 ub1 = BPF_CORE_READ_BITFIELD(&bitfields, ub1);
74 ub2 = BPF_CORE_READ_BITFIELD(&bitfields, ub2);
75
76 return (ub2 << 1) | ub1;
77}
78
79SEC("tc")
80__description("multibyte CO-RE bitfield roundtrip")
81__btf_path("btf__core_reloc_bitfields.bpf.o")
82__success
83__retval(0x21)
84int multibyte_field_roundtrip(struct __sk_buff *ctx)
85{
86 struct core_reloc_bitfields bitfields;
87 uint32_t ub7;
88 uint8_t ub1;
89
90 __builtin_memset(&bitfields, 0, sizeof(bitfields));
91 BPF_CORE_WRITE_BITFIELD(&bitfields, ub1, 1);
92 BPF_CORE_WRITE_BITFIELD(&bitfields, ub7, 16);
93
94 ub1 = BPF_CORE_READ_BITFIELD(&bitfields, ub1);
95 ub7 = BPF_CORE_READ_BITFIELD(&bitfields, ub7);
96
97 return (ub7 << 1) | ub1;
98}
99
100char _license[] SEC("license") = "GPL";