poke-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] pickles: btf: add support for BTF_KIND_ENUM64 type


From: Guillermo E. Martinez
Subject: [PATCH] pickles: btf: add support for BTF_KIND_ENUM64 type
Date: Mon, 29 Aug 2022 17:48:22 -0500

Hello poke team,

This patch add support to decode `BTF_KIND_ENUM64' types.

I'll really appreciate your comments and suggestions.

Kind regards,
guillermo
--

        * pickles/btf-dump.pk (btf_dump_enum): Update function signature
        to print appropriately signed/unsigned enumerators values,
        depending of `info.kind_flag'.
        (btf_dump_enum64): New function.
        * pickles/btf.pk: Add BTF_KIND_ENUM64 type and `BTF_Enum64'
        definition.
        (btf_kind_names): New `enum64' entry.
        (BTF_Type): New `_enum64' field of `BTF_Enum64' type.
---
 pickles/btf-dump.pk | 32 +++++++++++++++++++++++++++-----
 pickles/btf.pk      | 18 +++++++++++++++---
 2 files changed, 42 insertions(+), 8 deletions(-)

diff --git a/pickles/btf-dump.pk b/pickles/btf-dump.pk
index f18479d0..a3c77253 100644
--- a/pickles/btf-dump.pk
+++ b/pickles/btf-dump.pk
@@ -38,13 +38,34 @@ fun btf_dump_array = (BTF_Array arr) void:
 
 /* Dump enumerators.  */
 
-fun btf_dump_enum = (BTF_Section btf, BTF_Enum[] e) void:
+fun btf_dump_enum = (BTF_Section btf, BTF_Type t) void:
   {
+    var e = BTF_Enum[]();
+    e = t.data._enum;
+
+    for (member in e)
+        printf ("\n\t '%s'(%v) value=%s",
+                btf.get_string (member.name),
+                member.name,
+                t.info.kind_flag == 1
+                  ? format ("%i32d", member.val)
+                  : format ("%u32d", member.val));
+  }
+
+/* Dump 64 bits enumerators.  */
+
+fun btf_dump_enum64 = (BTF_Section btf, BTF_Type t) void:
+  {
+    var e = BTF_Enum64[]();
+    e = t.data._enum64;
+
     for (member in e)
-      printf ("\n\t '%s'(%v) value=%i32d",
+      printf ("\n\t '%s'(%v) value=%s",
               btf.get_string (member.name),
               member.name,
-              member.val);
+              t.info.kind_flag == 1
+                ? format ("%i64d", (member.val_hi32 as int<64> <<. 32) + 
member.val_lo32)
+                : format ("%u64d", (member.val_hi32 as uint<64> <<. 32) + 
member.val_lo32));
   }
 
 /* Dump function prototype members.  */
@@ -118,11 +139,12 @@ fun btf_dump_type_vdata = (BTF_Section btf, BTF_Type t) 
void:
 
     ({ btf_dump_int (t.data.integer); } ?! E_elem)
       && ({ btf_dump_array (t.data.array); } ?! E_elem)
-      && ({ btf_dump_enum (btf, t.data._enum); } ?! E_elem)
+      && ({ btf_dump_enum (btf, t); } ?! E_elem)
       && ({ btf_dump_proto (btf, t.data.func_proto.params); } ?! E_elem)
       && ({ btf_dump_var (t.data.variable); } ?! E_elem)
       && ({ btf_dump_sou (btf, t); } ?! E_elem)
-      && ({ btf_dump_datasec (t.data.datasec); } ?! E_elem);
+      && ({ btf_dump_datasec (t.data.datasec); } ?! E_elem)
+      && ({ btf_dump_enum64 (btf, t); } ?! E_elem);
   }
 
 /* Dump a complete BTF type. Includes lookup and display of any strings
diff --git a/pickles/btf.pk b/pickles/btf.pk
index e40be31d..a732ebba 100644
--- a/pickles/btf.pk
+++ b/pickles/btf.pk
@@ -38,12 +38,14 @@ var BTF_KIND_UNKNOWN = 0,
     BTF_KIND_DATASEC = 15,
     BTF_KIND_FLOAT = 16,
     BTF_KIND_DECL_TAG = 17,
-    BTF_KIND_TYPE_TAG = 18;
+    BTF_KIND_TYPE_TAG = 18,
+    BTF_KIND_ENUM64 = 19;
 
 var btf_kind_names =
   ["unkn", "int", "ptr", "array", "struct", "union", "enum",
    "fwd", "typedef", "volatile", "const", "restrict", "func",
-   "func_proto", "var", "datasec", "float", "decl_tag", "type_tag"];
+   "func_proto", "var", "datasec", "float", "decl_tag", "type_tag",
+   "enum64"];
 
 var BTF_VAR_STATIC = 0,
     BTF_VAR_GLOBAL_ALLOCATED = 1,
@@ -128,6 +130,14 @@ type BTF_Decl_Tag =
     int<32> component_idx;
   };
 
+type BTF_Enum64 =
+  struct
+  {
+    offset<uint<32>,B> name;
+    uint<32> val_lo32;
+    uint<32> val_hi32;
+  };
+
 type BTF_Type =
   struct
   {
@@ -159,7 +169,8 @@ type BTF_Type =
                                                BTF_KIND_ENUM,
                                                BTF_KIND_STRUCT,
                                                BTF_KIND_UNION,
-                                               BTF_KIND_DATASEC]);
+                                               BTF_KIND_DATASEC,
+                                               BTF_KIND_ENUM64]);
       BTF_Type_Id type_id;
     } attrs;
 
@@ -199,6 +210,7 @@ type BTF_Type =
                                             || info.kind == BTF_KIND_STRUCT);
       BTF_Var_SecInfo[info.vlen] datasec : info.kind == BTF_KIND_DATASEC;
       BTF_Decl_Tag decl_tag              : info.kind == BTF_KIND_DECL_TAG;
+      BTF_Enum64[info.vlen] _enum64      : info.kind == BTF_KIND_ENUM64;
 
       struct {} nothing;
     } data;
-- 
2.35.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]