1002d3afcSAndrii Nakryiko // SPDX-License-Identifier: GPL-2.0 2002d3afcSAndrii Nakryiko // Copyright (c) 2019 Facebook 3002d3afcSAndrii Nakryiko 4002d3afcSAndrii Nakryiko #include <linux/bpf.h> 5002d3afcSAndrii 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> 8002d3afcSAndrii Nakryiko 9002d3afcSAndrii Nakryiko char _license[] SEC("license") = "GPL"; 10002d3afcSAndrii Nakryiko 11393cdfbeSAndrii Nakryiko struct { 12002d3afcSAndrii Nakryiko char in[256]; 13002d3afcSAndrii Nakryiko char out[256]; 14393cdfbeSAndrii Nakryiko } data = {}; 15002d3afcSAndrii Nakryiko 16002d3afcSAndrii Nakryiko struct core_reloc_flavors { 17002d3afcSAndrii Nakryiko int a; 18002d3afcSAndrii Nakryiko int b; 19002d3afcSAndrii Nakryiko int c; 20002d3afcSAndrii Nakryiko }; 21002d3afcSAndrii Nakryiko 22002d3afcSAndrii Nakryiko /* local flavor with reversed layout */ 23002d3afcSAndrii Nakryiko struct core_reloc_flavors___reversed { 24002d3afcSAndrii Nakryiko int c; 25002d3afcSAndrii Nakryiko int b; 26002d3afcSAndrii Nakryiko int a; 27002d3afcSAndrii Nakryiko }; 28002d3afcSAndrii Nakryiko 29002d3afcSAndrii Nakryiko /* local flavor with nested/overlapping layout */ 30002d3afcSAndrii Nakryiko struct core_reloc_flavors___weird { 31002d3afcSAndrii Nakryiko struct { 32002d3afcSAndrii Nakryiko int b; 33002d3afcSAndrii Nakryiko }; 34002d3afcSAndrii Nakryiko /* a and c overlap in local flavor, but this should still work 35002d3afcSAndrii Nakryiko * correctly with target original flavor 36002d3afcSAndrii Nakryiko */ 37002d3afcSAndrii Nakryiko union { 38002d3afcSAndrii Nakryiko int a; 39002d3afcSAndrii Nakryiko int c; 40002d3afcSAndrii Nakryiko }; 41002d3afcSAndrii Nakryiko }; 42002d3afcSAndrii Nakryiko 43694731e8SAndrii Nakryiko #define CORE_READ(dst, src) bpf_core_read(dst, sizeof(*(dst)), src) 44694731e8SAndrii Nakryiko 45002d3afcSAndrii Nakryiko SEC("raw_tracepoint/sys_enter") test_core_flavors(void * ctx)46002d3afcSAndrii Nakryikoint test_core_flavors(void *ctx) 47002d3afcSAndrii Nakryiko { 48002d3afcSAndrii Nakryiko struct core_reloc_flavors *in_orig = (void *)&data.in; 49002d3afcSAndrii Nakryiko struct core_reloc_flavors___reversed *in_rev = (void *)&data.in; 50002d3afcSAndrii Nakryiko struct core_reloc_flavors___weird *in_weird = (void *)&data.in; 51002d3afcSAndrii Nakryiko struct core_reloc_flavors *out = (void *)&data.out; 52002d3afcSAndrii Nakryiko 53002d3afcSAndrii Nakryiko /* read a using weird layout */ 54694731e8SAndrii Nakryiko if (CORE_READ(&out->a, &in_weird->a)) 55002d3afcSAndrii Nakryiko return 1; 56002d3afcSAndrii Nakryiko /* read b using reversed layout */ 57694731e8SAndrii Nakryiko if (CORE_READ(&out->b, &in_rev->b)) 58002d3afcSAndrii Nakryiko return 1; 59002d3afcSAndrii Nakryiko /* read c using original layout */ 60694731e8SAndrii Nakryiko if (CORE_READ(&out->c, &in_orig->c)) 61002d3afcSAndrii Nakryiko return 1; 62002d3afcSAndrii Nakryiko 63002d3afcSAndrii Nakryiko return 0; 64002d3afcSAndrii Nakryiko } 65002d3afcSAndrii Nakryiko 66