18b1cb1c9SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0
28b1cb1c9SAndrii Nakryiko // Copyright (c) 2019 Facebook
38b1cb1c9SAndrii Nakryiko 
48b1cb1c9SAndrii Nakryiko #include <linux/bpf.h>
58b1cb1c9SAndrii Nakryiko #include <stdint.h>
63e689141SToke Høiland-Jørgensen #include <bpf/bpf_helpers.h>
73e689141SToke Høiland-Jørgensen #include <bpf/bpf_core_read.h>
88b1cb1c9SAndrii Nakryiko 
98b1cb1c9SAndrii Nakryiko char _license[] SEC("license") = "GPL";
108b1cb1c9SAndrii Nakryiko 
11393cdfbeSAndrii Nakryiko struct {
128b1cb1c9SAndrii Nakryiko 	char in[256];
138b1cb1c9SAndrii Nakryiko 	char out[256];
14393cdfbeSAndrii Nakryiko } data = {};
158b1cb1c9SAndrii Nakryiko 
168b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields {
178b1cb1c9SAndrii Nakryiko 	/* unsigned bitfields */
188b1cb1c9SAndrii Nakryiko 	uint8_t		ub1: 1;
198b1cb1c9SAndrii Nakryiko 	uint8_t		ub2: 2;
208b1cb1c9SAndrii Nakryiko 	uint32_t	ub7: 7;
218b1cb1c9SAndrii Nakryiko 	/* signed bitfields */
228b1cb1c9SAndrii Nakryiko 	int8_t		sb4: 4;
238b1cb1c9SAndrii Nakryiko 	int32_t		sb20: 20;
248b1cb1c9SAndrii Nakryiko 	/* non-bitfields */
258b1cb1c9SAndrii Nakryiko 	uint32_t	u32;
268b1cb1c9SAndrii Nakryiko 	int32_t		s32;
278b1cb1c9SAndrii Nakryiko };
288b1cb1c9SAndrii Nakryiko 
298b1cb1c9SAndrii Nakryiko /* bitfield read results, all as plain integers */
308b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields_output {
318b1cb1c9SAndrii Nakryiko 	int64_t		ub1;
328b1cb1c9SAndrii Nakryiko 	int64_t		ub2;
338b1cb1c9SAndrii Nakryiko 	int64_t		ub7;
348b1cb1c9SAndrii Nakryiko 	int64_t		sb4;
358b1cb1c9SAndrii Nakryiko 	int64_t		sb20;
368b1cb1c9SAndrii Nakryiko 	int64_t		u32;
378b1cb1c9SAndrii Nakryiko 	int64_t		s32;
388b1cb1c9SAndrii Nakryiko };
398b1cb1c9SAndrii Nakryiko 
408b1cb1c9SAndrii Nakryiko SEC("raw_tracepoint/sys_enter")
test_core_bitfields(void * ctx)418b1cb1c9SAndrii Nakryiko int test_core_bitfields(void *ctx)
428b1cb1c9SAndrii Nakryiko {
438b1cb1c9SAndrii Nakryiko 	struct core_reloc_bitfields *in = (void *)&data.in;
448b1cb1c9SAndrii Nakryiko 	struct core_reloc_bitfields_output *out = (void *)&data.out;
458b1cb1c9SAndrii Nakryiko 
46ed578021SAndrii Nakryiko 	out->ub1 = BPF_CORE_READ_BITFIELD_PROBED(in, ub1);
47ed578021SAndrii Nakryiko 	out->ub2 = BPF_CORE_READ_BITFIELD_PROBED(in, ub2);
48ed578021SAndrii Nakryiko 	out->ub7 = BPF_CORE_READ_BITFIELD_PROBED(in, ub7);
49ed578021SAndrii Nakryiko 	out->sb4 = BPF_CORE_READ_BITFIELD_PROBED(in, sb4);
50ed578021SAndrii Nakryiko 	out->sb20 = BPF_CORE_READ_BITFIELD_PROBED(in, sb20);
51ed578021SAndrii Nakryiko 	out->u32 = BPF_CORE_READ_BITFIELD_PROBED(in, u32);
52ed578021SAndrii Nakryiko 	out->s32 = BPF_CORE_READ_BITFIELD_PROBED(in, s32);
538b1cb1c9SAndrii Nakryiko 
548b1cb1c9SAndrii Nakryiko 	return 0;
558b1cb1c9SAndrii Nakryiko }
568b1cb1c9SAndrii Nakryiko 
57