From 73862f0084ccd2e6e756079a4d9dbf49d9f06352 Mon Sep 17 00:00:00 2001 From: Pragyansh Chaturvedi Date: Sat, 20 Sep 2025 03:15:09 +0530 Subject: [PATCH] Make max_entries optional in map BTF, add PerfEventArray to execve5 --- examples/execve5.py | 6 ++++- pythonbpf/maps_pass.py | 55 +++++++++++++++++++++++------------------- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/examples/execve5.py b/examples/execve5.py index ca37e4b..e016728 100644 --- a/examples/execve5.py +++ b/examples/execve5.py @@ -1,9 +1,13 @@ from pythonbpf import bpf, map, section, bpfglobal, compile from pythonbpf.helpers import ktime, pid -from pythonbpf.maps import HashMap +from pythonbpf.maps import PerfEventArray from ctypes import c_void_p, c_int64, c_int32, c_uint64 +@bpf +@map +def events() -> PerfEventArray: + return PerfEventArray(key_type=c_uint64, value_type=c_uint64) @bpf @section("tracepoint/syscalls/sys_enter_clone") diff --git a/pythonbpf/maps_pass.py b/pythonbpf/maps_pass.py index ef42da0..6157ccc 100644 --- a/pythonbpf/maps_pass.py +++ b/pythonbpf/maps_pass.py @@ -87,15 +87,6 @@ def create_map_debug_info(module, map_global, map_name, map_params): "elements": [array_subrange] }) - array_subrange_max_entries = module.add_debug_info( - "DISubrange", {"count": map_params["max_entries"]}) - array_type_max_entries = module.add_debug_info("DICompositeType", { - "tag": dc.DW_TAG_array_type, - "baseType": uint_type, - "size": 32, - "elements": [array_subrange_max_entries] - }) - # Create pointer types type_ptr = module.add_debug_info("DIDerivedType", { "tag": dc.DW_TAG_pointer_type, @@ -103,12 +94,6 @@ def create_map_debug_info(module, map_global, map_name, map_params): "size": 64 }) - max_entries_ptr = module.add_debug_info("DIDerivedType", { - "tag": dc.DW_TAG_pointer_type, - "baseType": array_type_max_entries, - "size": 64 - }) - key_ptr = module.add_debug_info("DIDerivedType", { "tag": dc.DW_TAG_pointer_type, "baseType": uint_type, # Adjust based on actual key type @@ -121,6 +106,8 @@ def create_map_debug_info(module, map_global, map_name, map_params): "size": 64 }) + elements_arr = [] + # Create struct members # scope field does not appear for some reason type_member = module.add_debug_info("DIDerivedType", { @@ -131,15 +118,31 @@ def create_map_debug_info(module, map_global, map_name, map_params): "size": 64, "offset": 0 }) + elements_arr.append(type_member) - max_entries_member = module.add_debug_info("DIDerivedType", { - "tag": dc.DW_TAG_member, - "name": "max_entries", - "file": file_metadata, - "baseType": max_entries_ptr, - "size": 64, - "offset": 64 - }) + if "max_entries" in map_params: + array_subrange_max_entries = module.add_debug_info( + "DISubrange", {"count": map_params["max_entries"]}) + array_type_max_entries = module.add_debug_info("DICompositeType", { + "tag": dc.DW_TAG_array_type, + "baseType": uint_type, + "size": 32, + "elements": [array_subrange_max_entries] + }) + max_entries_ptr = module.add_debug_info("DIDerivedType", { + "tag": dc.DW_TAG_pointer_type, + "baseType": array_type_max_entries, + "size": 64 + }) + max_entries_member = module.add_debug_info("DIDerivedType", { + "tag": dc.DW_TAG_member, + "name": "max_entries", + "file": file_metadata, + "baseType": max_entries_ptr, + "size": 64, + "offset": 64 + }) + elements_arr.append(max_entries_member) key_member = module.add_debug_info("DIDerivedType", { "tag": dc.DW_TAG_member, @@ -149,6 +152,7 @@ def create_map_debug_info(module, map_global, map_name, map_params): "size": 64, "offset": 128 }) + elements_arr.append(key_member) value_member = module.add_debug_info("DIDerivedType", { "tag": dc.DW_TAG_member, @@ -158,13 +162,14 @@ def create_map_debug_info(module, map_global, map_name, map_params): "size": 64, "offset": 192 }) + elements_arr.append(value_member) # Create the struct type struct_type = module.add_debug_info("DICompositeType", { "tag": dc.DW_TAG_structure_type, "file": file_metadata, - "size": 256, # 4 * 64-bit pointers - "elements": [type_member, max_entries_member, key_member, value_member] + "size": 64 * len(elements_arr), # 4 * 64-bit pointers + "elements": elements_arr, }, is_distinct=True) # Create global variable debug info