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 struct pt_regs; 418b1cb1c9SAndrii Nakryiko 428b1cb1c9SAndrii Nakryiko struct trace_sys_enter { 438b1cb1c9SAndrii Nakryiko struct pt_regs *regs; 448b1cb1c9SAndrii Nakryiko long id; 458b1cb1c9SAndrii Nakryiko }; 468b1cb1c9SAndrii Nakryiko 478b1cb1c9SAndrii Nakryiko SEC("tp_btf/sys_enter") test_core_bitfields_direct(void * ctx)488b1cb1c9SAndrii Nakryikoint test_core_bitfields_direct(void *ctx) 498b1cb1c9SAndrii Nakryiko { 508b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields *in = (void *)&data.in; 518b1cb1c9SAndrii Nakryiko struct core_reloc_bitfields_output *out = (void *)&data.out; 528b1cb1c9SAndrii Nakryiko 538b1cb1c9SAndrii Nakryiko out->ub1 = BPF_CORE_READ_BITFIELD(in, ub1); 548b1cb1c9SAndrii Nakryiko out->ub2 = BPF_CORE_READ_BITFIELD(in, ub2); 558b1cb1c9SAndrii Nakryiko out->ub7 = BPF_CORE_READ_BITFIELD(in, ub7); 568b1cb1c9SAndrii Nakryiko out->sb4 = BPF_CORE_READ_BITFIELD(in, sb4); 578b1cb1c9SAndrii Nakryiko out->sb20 = BPF_CORE_READ_BITFIELD(in, sb20); 588b1cb1c9SAndrii Nakryiko out->u32 = BPF_CORE_READ_BITFIELD(in, u32); 598b1cb1c9SAndrii Nakryiko out->s32 = BPF_CORE_READ_BITFIELD(in, s32); 608b1cb1c9SAndrii Nakryiko 618b1cb1c9SAndrii Nakryiko return 0; 628b1cb1c9SAndrii Nakryiko } 638b1cb1c9SAndrii Nakryiko 64