1 // SPDX-License-Identifier: GPL-2.0 2 // Copyright (c) 2019 Facebook 3 4 #include <linux/bpf.h> 5 #include <stdint.h> 6 #include <bpf/bpf_helpers.h> 7 #include <bpf/bpf_core_read.h> 8 9 char _license[] SEC("license") = "GPL"; 10 11 struct { 12 char in[256]; 13 char out[256]; 14 } data = {}; 15 16 struct core_reloc_size_output { 17 int int_sz; 18 int int_off; 19 int struct_sz; 20 int struct_off; 21 int union_sz; 22 int union_off; 23 int arr_sz; 24 int arr_off; 25 int arr_elem_sz; 26 int arr_elem_off; 27 int ptr_sz; 28 int ptr_off; 29 int enum_sz; 30 int enum_off; 31 int float_sz; 32 int float_off; 33 }; 34 35 struct core_reloc_size { 36 int int_field; 37 struct { int x; } struct_field; 38 union { int x; } union_field; 39 int arr_field[4]; 40 void *ptr_field; 41 enum { VALUE = 123 } enum_field; 42 float float_field; 43 }; 44 45 SEC("raw_tracepoint/sys_enter") 46 int test_core_size(void *ctx) 47 { 48 struct core_reloc_size *in = (void *)&data.in; 49 struct core_reloc_size_output *out = (void *)&data.out; 50 51 out->int_sz = bpf_core_field_size(in->int_field); 52 out->int_off = bpf_core_field_offset(in->int_field); 53 54 out->struct_sz = bpf_core_field_size(in->struct_field); 55 out->struct_off = bpf_core_field_offset(in->struct_field); 56 57 out->union_sz = bpf_core_field_size(in->union_field); 58 out->union_off = bpf_core_field_offset(in->union_field); 59 60 out->arr_sz = bpf_core_field_size(in->arr_field); 61 out->arr_off = bpf_core_field_offset(in->arr_field); 62 63 out->arr_elem_sz = bpf_core_field_size(struct core_reloc_size, arr_field[1]); 64 out->arr_elem_off = bpf_core_field_offset(struct core_reloc_size, arr_field[1]); 65 66 out->ptr_sz = bpf_core_field_size(struct core_reloc_size, ptr_field); 67 out->ptr_off = bpf_core_field_offset(struct core_reloc_size, ptr_field); 68 69 out->enum_sz = bpf_core_field_size(struct core_reloc_size, enum_field); 70 out->enum_off = bpf_core_field_offset(struct core_reloc_size, enum_field); 71 72 out->float_sz = bpf_core_field_size(struct core_reloc_size, float_field); 73 out->float_off = bpf_core_field_offset(struct core_reloc_size, float_field); 74 75 return 0; 76 } 77 78