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


Quelle  trace_btf.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
#include <linux/btf.h>
#include <linux/kernel.h>
#include <linux/slab.h>

#include "trace_btf.h"

/*
 * Find a function proto type by name, and return the btf_type with its btf
 * in *@btf_p. Return NULL if not found.
 * Note that caller has to call btf_put(*@btf_p) after using the btf_type.
 */

const struct btf_type *btf_find_func_proto(const char *func_name, struct btf **btf_p)
{
 const struct btf_type *t;
 s32 id;

 id = bpf_find_btf_id(func_name, BTF_KIND_FUNC, btf_p);
 if (id < 0)
  return NULL;

 /* Get BTF_KIND_FUNC type */
 t = btf_type_by_id(*btf_p, id);
 if (!t || !btf_type_is_func(t))
  goto err;

 /* The type of BTF_KIND_FUNC is BTF_KIND_FUNC_PROTO */
 t = btf_type_by_id(*btf_p, t->type);
 if (!t || !btf_type_is_func_proto(t))
  goto err;

 return t;
err:
 btf_put(*btf_p);
 return NULL;
}

/*
 * Get function parameter with the number of parameters.
 * This can return NULL if the function has no parameters.
 * It can return -EINVAL if the @func_proto is not a function proto type.
 */

const struct btf_param *btf_get_func_param(const struct btf_type *func_proto, s32 *nr)
{
 if (!btf_type_is_func_proto(func_proto))
  return ERR_PTR(-EINVAL);

 *nr = btf_type_vlen(func_proto);
 if (*nr > 0)
  return (const struct btf_param *)(func_proto + 1);
 else
  return NULL;
}

#define BTF_ANON_STACK_MAX 16

struct btf_anon_stack {
 u32 tid;
 u32 offset;
};

/*
 * Find a member of data structure/union by name and return it.
 * Return NULL if not found, or -EINVAL if parameter is invalid.
 * If the member is an member of anonymous union/structure, the offset
 * of that anonymous union/structure is stored into @anon_offset. Caller
 * can calculate the correct offset from the root data structure by
 * adding anon_offset to the member's offset.
 */

const struct btf_member *btf_find_struct_member(struct btf *btf,
      const struct btf_type *type,
      const char *member_name,
      u32 *anon_offset)
{
 struct btf_anon_stack *anon_stack;
 const struct btf_member *member;
 u32 tid, cur_offset = 0;
 const char *name;
 int i, top = 0;

 anon_stack = kcalloc(BTF_ANON_STACK_MAX, sizeof(*anon_stack), GFP_KERNEL);
 if (!anon_stack)
  return ERR_PTR(-ENOMEM);

retry:
 if (!btf_type_is_struct(type)) {
  member = ERR_PTR(-EINVAL);
  goto out;
 }

 for_each_member(i, type, member) {
  if (!member->name_off) {
   /* Anonymous union/struct: push it for later use */
   if (btf_type_skip_modifiers(btf, member->type, &tid) &&
       top < BTF_ANON_STACK_MAX) {
    anon_stack[top].tid = tid;
    anon_stack[top++].offset =
     cur_offset + member->offset;
   }
  } else {
   name = btf_name_by_offset(btf, member->name_off);
   if (name && !strcmp(member_name, name)) {
    if (anon_offset)
     *anon_offset = cur_offset;
    goto out;
   }
  }
 }
 if (top > 0) {
  /* Pop from the anonymous stack and retry */
  tid = anon_stack[--top].tid;
  cur_offset = anon_stack[top].offset;
  type = btf_type_by_id(btf, tid);
  goto retry;
 }
 member = NULL;

out:
 kfree(anon_stack);
 return member;
}


Messung V0.5
C=96 H=93 G=94

¤ Dauer der Verarbeitung: 0.0 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