Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  resolve_btfids.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0

#include <linux/err.h>
#include <string.h>
#include <bpf/btf.h>
#include <bpf/libbpf.h>
#include <linux/btf.h>
#include <linux/kernel.h>
#define CONFIG_DEBUG_INFO_BTF
#include <linux/btf_ids.h>
#include "test_progs.h"

static int duration;

struct symbol {
 const char *name;
 int   type;
 int   id;
};

struct symbol test_symbols[] = {
 { "unused",  BTF_KIND_UNKN,     0 },
 { "S",       BTF_KIND_TYPEDEF, -1 },
 { "T",       BTF_KIND_TYPEDEF, -1 },
 { "U",       BTF_KIND_TYPEDEF, -1 },
 { "S",       BTF_KIND_STRUCT,  -1 },
 { "U",       BTF_KIND_UNION,   -1 },
 { "func",    BTF_KIND_FUNC,    -1 },
};

/* Align the .BTF_ids section to 4 bytes */
asm (
".pushsection " BTF_IDS_SECTION " ,\"a\"; \n"
".balign 4, 0; \n"
".popsection; \n");

BTF_ID_LIST(test_list_local)
BTF_ID_UNUSED
BTF_ID(typedef, S)
BTF_ID(typedef, T)
BTF_ID(typedef, U)
BTF_ID(struct,  S)
BTF_ID(union,   U)
BTF_ID(func,    func)

extern __u32 test_list_global[];
BTF_ID_LIST_GLOBAL(test_list_global, 1)
BTF_ID_UNUSED
BTF_ID(typedef, S)
BTF_ID(typedef, T)
BTF_ID(typedef, U)
BTF_ID(struct,  S)
BTF_ID(union,   U)
BTF_ID(func,    func)

BTF_SET_START(test_set)
BTF_ID(typedef, S)
BTF_ID(typedef, T)
BTF_ID(typedef, U)
BTF_ID(struct,  S)
BTF_ID(union,   U)
BTF_ID(func,    func)
BTF_SET_END(test_set)

static int
__resolve_symbol(struct btf *btf, int type_id)
{
 const struct btf_type *type;
 const char *str;
 unsigned int i;

 type = btf__type_by_id(btf, type_id);
 if (!type) {
  PRINT_FAIL("Failed to get type for ID %d\n", type_id);
  return -1;
 }

 for (i = 0; i < ARRAY_SIZE(test_symbols); i++) {
  if (test_symbols[i].id >= 0)
   continue;

  if (BTF_INFO_KIND(type->info) != test_symbols[i].type)
   continue;

  str = btf__name_by_offset(btf, type->name_off);
  if (!str) {
   PRINT_FAIL("Failed to get name for BTF ID %d\n", type_id);
   return -1;
  }

  if (!strcmp(str, test_symbols[i].name))
   test_symbols[i].id = type_id;
 }

 return 0;
}

static int resolve_symbols(void)
{
 struct btf *btf;
 int type_id;
 __u32 nr;

 btf = btf__parse_elf("btf_data.bpf.o", NULL);
 if (CHECK(libbpf_get_error(btf), "resolve",
    "Failed to load BTF from btf_data.bpf.o\n"))
  return -1;

 nr = btf__type_cnt(btf);

 for (type_id = 1; type_id < nr; type_id++) {
  if (__resolve_symbol(btf, type_id))
   break;
 }

 btf__free(btf);
 return 0;
}

void test_resolve_btfids(void)
{
 __u32 *test_list, *test_lists[] = { test_list_local, test_list_global };
 unsigned int i, j;
 int ret = 0;

 if (resolve_symbols())
  return;

 /* Check BTF_ID_LIST(test_list_local) and
 * BTF_ID_LIST_GLOBAL(test_list_global) IDs
 */

 for (j = 0; j < ARRAY_SIZE(test_lists); j++) {
  test_list = test_lists[j];
  for (i = 0; i < ARRAY_SIZE(test_symbols); i++) {
   ret = CHECK(test_list[i] != test_symbols[i].id,
        "id_check",
        "wrong ID for %s (%d != %d)\n",
        test_symbols[i].name,
        test_list[i], test_symbols[i].id);
   if (ret)
    return;
  }
 }

 /* Check BTF_SET_START(test_set) IDs */
 for (i = 0; i < test_set.cnt; i++) {
  bool found = false;

  for (j = 0; j < ARRAY_SIZE(test_symbols); j++) {
   if (test_symbols[j].id != test_set.ids[i])
    continue;
   found = true;
   break;
  }

  ret = CHECK(!found, "id_check",
       "ID %d not found in test_symbols\n",
       test_set.ids[i]);
  if (ret)
   break;

  if (i > 0) {
   if (!ASSERT_LE(test_set.ids[i - 1], test_set.ids[i], "sort_check"))
    return;
  }
 }
}

Messung V0.5
C=93 H=92 G=92

¤ Dauer der Verarbeitung: 0.13 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge