10b163565SAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0 20b163565SAndrii Nakryiko // Copyright (c) 2019 Facebook 30b163565SAndrii Nakryiko 40b163565SAndrii Nakryiko #include <linux/bpf.h> 50b163565SAndrii 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> 80b163565SAndrii Nakryiko 90b163565SAndrii Nakryiko char _license[] SEC("license") = "GPL"; 100b163565SAndrii Nakryiko 11393cdfbeSAndrii Nakryiko struct { 120b163565SAndrii Nakryiko char in[256]; 130b163565SAndrii Nakryiko char out[256]; 14393cdfbeSAndrii Nakryiko } data = {}; 150b163565SAndrii Nakryiko 160b163565SAndrii Nakryiko struct core_reloc_size_output { 170b163565SAndrii Nakryiko int int_sz; 18*785c3342SAndrii Nakryiko int int_off; 190b163565SAndrii Nakryiko int struct_sz; 20*785c3342SAndrii Nakryiko int struct_off; 210b163565SAndrii Nakryiko int union_sz; 22*785c3342SAndrii Nakryiko int union_off; 230b163565SAndrii Nakryiko int arr_sz; 24*785c3342SAndrii Nakryiko int arr_off; 250b163565SAndrii Nakryiko int arr_elem_sz; 26*785c3342SAndrii Nakryiko int arr_elem_off; 270b163565SAndrii Nakryiko int ptr_sz; 28*785c3342SAndrii Nakryiko int ptr_off; 290b163565SAndrii Nakryiko int enum_sz; 30*785c3342SAndrii Nakryiko int enum_off; 313fcd50d6SIlya Leoshkevich int float_sz; 32*785c3342SAndrii Nakryiko int float_off; 330b163565SAndrii Nakryiko }; 340b163565SAndrii Nakryiko 350b163565SAndrii Nakryiko struct core_reloc_size { 360b163565SAndrii Nakryiko int int_field; 370b163565SAndrii Nakryiko struct { int x; } struct_field; 380b163565SAndrii Nakryiko union { int x; } union_field; 390b163565SAndrii Nakryiko int arr_field[4]; 400b163565SAndrii Nakryiko void *ptr_field; 410b163565SAndrii Nakryiko enum { VALUE = 123 } enum_field; 423fcd50d6SIlya Leoshkevich float float_field; 430b163565SAndrii Nakryiko }; 440b163565SAndrii Nakryiko 450b163565SAndrii Nakryiko SEC("raw_tracepoint/sys_enter") test_core_size(void * ctx)460b163565SAndrii Nakryikoint test_core_size(void *ctx) 470b163565SAndrii Nakryiko { 480b163565SAndrii Nakryiko struct core_reloc_size *in = (void *)&data.in; 490b163565SAndrii Nakryiko struct core_reloc_size_output *out = (void *)&data.out; 500b163565SAndrii Nakryiko 510b163565SAndrii Nakryiko out->int_sz = bpf_core_field_size(in->int_field); 52*785c3342SAndrii Nakryiko out->int_off = bpf_core_field_offset(in->int_field); 53*785c3342SAndrii Nakryiko 540b163565SAndrii Nakryiko out->struct_sz = bpf_core_field_size(in->struct_field); 55*785c3342SAndrii Nakryiko out->struct_off = bpf_core_field_offset(in->struct_field); 56*785c3342SAndrii Nakryiko 570b163565SAndrii Nakryiko out->union_sz = bpf_core_field_size(in->union_field); 58*785c3342SAndrii Nakryiko out->union_off = bpf_core_field_offset(in->union_field); 59*785c3342SAndrii Nakryiko 600b163565SAndrii Nakryiko out->arr_sz = bpf_core_field_size(in->arr_field); 61*785c3342SAndrii Nakryiko out->arr_off = bpf_core_field_offset(in->arr_field); 62*785c3342SAndrii Nakryiko 63*785c3342SAndrii Nakryiko out->arr_elem_sz = bpf_core_field_size(struct core_reloc_size, arr_field[1]); 64*785c3342SAndrii Nakryiko out->arr_elem_off = bpf_core_field_offset(struct core_reloc_size, arr_field[1]); 65*785c3342SAndrii Nakryiko 662a4ca46bSAndrii Nakryiko out->ptr_sz = bpf_core_field_size(struct core_reloc_size, ptr_field); 67*785c3342SAndrii Nakryiko out->ptr_off = bpf_core_field_offset(struct core_reloc_size, ptr_field); 68*785c3342SAndrii Nakryiko 692a4ca46bSAndrii Nakryiko out->enum_sz = bpf_core_field_size(struct core_reloc_size, enum_field); 70*785c3342SAndrii Nakryiko out->enum_off = bpf_core_field_offset(struct core_reloc_size, enum_field); 71*785c3342SAndrii Nakryiko 722a4ca46bSAndrii Nakryiko out->float_sz = bpf_core_field_size(struct core_reloc_size, float_field); 73*785c3342SAndrii Nakryiko out->float_off = bpf_core_field_offset(struct core_reloc_size, float_field); 740b163565SAndrii Nakryiko 750b163565SAndrii Nakryiko return 0; 760b163565SAndrii Nakryiko } 770b163565SAndrii Nakryiko 78