// SPDX-License-Identifier: GPL-2.0
|
// Copyright (c) 2019 Facebook
|
|
#include <linux/bpf.h>
|
#include <stdint.h>
|
#include <bpf/bpf_helpers.h>
|
#include <bpf/bpf_core_read.h>
|
|
char _license[] SEC("license") = "GPL";
|
|
struct {
|
char in[256];
|
char out[256];
|
} data = {};
|
|
struct core_reloc_bitfields {
|
/* unsigned bitfields */
|
uint8_t ub1: 1;
|
uint8_t ub2: 2;
|
uint32_t ub7: 7;
|
/* signed bitfields */
|
int8_t sb4: 4;
|
int32_t sb20: 20;
|
/* non-bitfields */
|
uint32_t u32;
|
int32_t s32;
|
};
|
|
/* bitfield read results, all as plain integers */
|
struct core_reloc_bitfields_output {
|
int64_t ub1;
|
int64_t ub2;
|
int64_t ub7;
|
int64_t sb4;
|
int64_t sb20;
|
int64_t u32;
|
int64_t s32;
|
};
|
|
struct pt_regs;
|
|
struct trace_sys_enter {
|
struct pt_regs *regs;
|
long id;
|
};
|
|
SEC("tp_btf/sys_enter")
|
int test_core_bitfields_direct(void *ctx)
|
{
|
struct core_reloc_bitfields *in = (void *)&data.in;
|
struct core_reloc_bitfields_output *out = (void *)&data.out;
|
|
out->ub1 = BPF_CORE_READ_BITFIELD(in, ub1);
|
out->ub2 = BPF_CORE_READ_BITFIELD(in, ub2);
|
out->ub7 = BPF_CORE_READ_BITFIELD(in, ub7);
|
out->sb4 = BPF_CORE_READ_BITFIELD(in, sb4);
|
out->sb20 = BPF_CORE_READ_BITFIELD(in, sb20);
|
out->u32 = BPF_CORE_READ_BITFIELD(in, u32);
|
out->s32 = BPF_CORE_READ_BITFIELD(in, s32);
|
|
return 0;
|
}
|