...

Text file src/github.com/cilium/ebpf/btf/testdata/relocs_read.c

Documentation: github.com/cilium/ebpf/btf/testdata

     1#include "../../testdata/common.h"
     2#include "bpf_core_read.h"
     3
     4#define core_access __builtin_preserve_access_index
     5
     6// Struct with the members declared in the wrong order. Accesses need
     7// a successful CO-RE relocation against the type in relocs_read_tgt.c
     8// for the test below to pass.
     9struct s {
    10	char b;
    11	char a;
    12};
    13
    14typedef unsigned char u8;
    15typedef unsigned short u16;
    16typedef unsigned int u32;
    17typedef unsigned long u64;
    18
    19// Struct with bitfields.
    20struct bits {
    21	int x;
    22	u8 a : 4, b : 2;
    23	u16 c : 1;
    24	unsigned int d : 2;
    25	enum { ZERO = 0, ONE = 1 } e : 1;
    26	u64 f : 16, g : 30;
    27};
    28
    29struct nonexist {
    30	int non_exist;
    31};
    32
    33enum nonexist_enum { NON_EXIST = 1 };
    34
    35// Perform a read from a subprog to ensure CO-RE relocations
    36// occurring there are tracked and executed in the final linked program.
    37__attribute__((noinline)) int read_subprog() {
    38	struct s foo = {
    39		.a = 0,
    40		.b = 1,
    41	};
    42
    43	if (core_access(foo.a) == 0)
    44		return __LINE__;
    45
    46	if (core_access(foo.b) == 1)
    47		return __LINE__;
    48
    49	struct bits bar;
    50	char *p = (char *)&bar;
    51	/* Target:
    52	 * [4] STRUCT 'bits' size=8 vlen=7
    53	 * 'b' type_id=5 bits_offset=0 bitfield_size=2
    54	 * 'a' type_id=5 bits_offset=2 bitfield_size=4
    55	 * 'd' type_id=7 bits_offset=6 bitfield_size=2
    56	 * 'c' type_id=9 bits_offset=8 bitfield_size=1
    57	 * 'e' type_id=11 bits_offset=9 bitfield_size=1
    58	 * 'f' type_id=9 bits_offset=16
    59	 * 'g' type_id=12 bits_offset=32 bitfield_size=30
    60	 */
    61	*p++ = 0xff; // a, b, d
    62	*p++ = 0x00; // c, e
    63	*p++ = 0x56; // f
    64	*p++ = 0x56; // f
    65#ifdef __BIG_ENDIAN__
    66	*p++ = 0x55; // g
    67	*p++ = 0x44; // g
    68	*p++ = 0x33; // g
    69	*p++ = 0x22; // g
    70#else
    71	*p++ = 0x22; // g
    72	*p++ = 0x33; // g
    73	*p++ = 0x44; // g
    74	*p++ = 0x55; // g
    75#endif
    76
    77	if (BPF_CORE_READ_BITFIELD(&bar, a) != (1 << 4) - 1)
    78		return __LINE__;
    79
    80	if (BPF_CORE_READ_BITFIELD(&bar, b) != (1 << 2) - 1)
    81		return __LINE__;
    82
    83	if (BPF_CORE_READ_BITFIELD(&bar, d) != (1 << 2) - 1)
    84		return __LINE__;
    85
    86	if (BPF_CORE_READ_BITFIELD(&bar, c) != 0)
    87		return __LINE__;
    88
    89	if (BPF_CORE_READ_BITFIELD(&bar, e) != 0)
    90		return __LINE__;
    91
    92	if (BPF_CORE_READ_BITFIELD(&bar, f) != 0x5656)
    93		return __LINE__;
    94
    95	if (BPF_CORE_READ_BITFIELD(&bar, g) != 0x15443322)
    96		return __LINE__;
    97
    98	if (bpf_core_type_exists(struct nonexist) != 0)
    99		return __LINE__;
   100
   101	if (bpf_core_field_exists(((struct nonexist *)0)->non_exist) != 0)
   102		return __LINE__;
   103
   104	if (bpf_core_enum_value_exists(enum nonexist_enum, NON_EXIST) != 0)
   105		return __LINE__;
   106
   107	return 0;
   108}
   109
   110__section("socket") int reads() {
   111	int ret = read_subprog();
   112	if (ret)
   113		return ret;
   114
   115	return 0;
   116}

View as plain text