linux/tools/testing/selftests/bpf/progs/test_core_reloc_misc.c
<<
>>
Prefs
   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
   9char _license[] SEC("license") = "GPL";
  10
  11struct {
  12        char in[256];
  13        char out[256];
  14} data = {};
  15
  16struct core_reloc_misc_output {
  17        int a, b, c;
  18};
  19
  20struct core_reloc_misc___a {
  21        int a1;
  22        int a2;
  23};
  24
  25struct core_reloc_misc___b {
  26        int b1;
  27        int b2;
  28};
  29
  30/* fixed two first members, can be extended with new fields */
  31struct core_reloc_misc_extensible {
  32        int a;
  33        int b;
  34};
  35
  36#define CORE_READ(dst, src) bpf_core_read(dst, sizeof(*(dst)), src)
  37
  38SEC("raw_tracepoint/sys_enter")
  39int test_core_misc(void *ctx)
  40{
  41        struct core_reloc_misc___a *in_a = (void *)&data.in;
  42        struct core_reloc_misc___b *in_b = (void *)&data.in;
  43        struct core_reloc_misc_extensible *in_ext = (void *)&data.in;
  44        struct core_reloc_misc_output *out = (void *)&data.out;
  45
  46        /* record two different relocations with the same accessor string */
  47        if (CORE_READ(&out->a, &in_a->a1) ||            /* accessor: 0:0 */
  48            CORE_READ(&out->b, &in_b->b1))              /* accessor: 0:0 */
  49                return 1;
  50
  51        /* Validate relocations capture array-only accesses for structs with
  52         * fixed header, but with potentially extendable tail. This will read
  53         * first 4 bytes of 2nd element of in_ext array of potentially
  54         * variably sized struct core_reloc_misc_extensible. */ 
  55        if (CORE_READ(&out->c, &in_ext[2]))             /* accessor: 2 */
  56                return 1;
  57
  58        return 0;
  59}
  60
  61