mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
feat:non struct field values can be cast
This commit is contained in:
@ -666,13 +666,17 @@ def _handle_vmlinux_cast(
|
||||
# Cast the integer/value to a pointer to the struct
|
||||
# If arg_val is an integer type, we need to inttoptr it
|
||||
ptr_type = ir.PointerType()
|
||||
# TODO: add a integer check here later
|
||||
if ctypes_to_ir(arg_type.type.__name__):
|
||||
# Cast integer to pointer
|
||||
casted_ptr = builder.inttoptr(arg_val, ptr_type)
|
||||
# TODO: add a field value type check here
|
||||
print(arg_type)
|
||||
if isinstance(arg_type, Field):
|
||||
if ctypes_to_ir(arg_type.type.__name__):
|
||||
# Cast integer to pointer
|
||||
casted_ptr = builder.inttoptr(arg_val, ptr_type)
|
||||
else:
|
||||
logger.error(f"Unsupported type for vmlinux cast: {arg_type}")
|
||||
return None
|
||||
else:
|
||||
logger.error(f"Unsupported type for vmlinux cast: {arg_type}")
|
||||
return None
|
||||
casted_ptr = builder.inttoptr(arg_val, ptr_type)
|
||||
|
||||
return casted_ptr, vmlinux_struct_type
|
||||
|
||||
|
||||
@ -18,6 +18,8 @@ mapping = {
|
||||
"c_longlong": ir.IntType(64),
|
||||
"c_uint": ir.IntType(32),
|
||||
"c_int": ir.IntType(32),
|
||||
"c_ushort": ir.IntType(16),
|
||||
"c_short": ir.IntType(16),
|
||||
# Not so sure about this one
|
||||
"str": ir.PointerType(ir.IntType(8)),
|
||||
}
|
||||
|
||||
@ -121,7 +121,12 @@ class VmlinuxHandler:
|
||||
|
||||
# Use bpf_probe_read_kernel for non-context struct field access
|
||||
field_value = self.load_struct_field(
|
||||
builder, struct_ptr, globvar_ir, field_data, struct_name
|
||||
builder,
|
||||
struct_ptr,
|
||||
globvar_ir,
|
||||
field_data,
|
||||
struct_name,
|
||||
local_sym_tab,
|
||||
)
|
||||
# Return field value and field type
|
||||
return field_value, field_data
|
||||
@ -130,7 +135,12 @@ class VmlinuxHandler:
|
||||
|
||||
@staticmethod
|
||||
def load_struct_field(
|
||||
builder, struct_ptr_int, offset_global, field_data, struct_name=None
|
||||
builder,
|
||||
struct_ptr_int,
|
||||
offset_global,
|
||||
field_data,
|
||||
struct_name=None,
|
||||
local_sym_tab=None,
|
||||
):
|
||||
"""
|
||||
Generate LLVM IR to load a field from a regular (non-context) struct using bpf_probe_read_kernel.
|
||||
@ -204,6 +214,7 @@ class VmlinuxHandler:
|
||||
logger.warning("Complex vmlinux field type, using default 64 bits")
|
||||
|
||||
# Allocate local storage for the field value
|
||||
# TODO: CRITICAL BUG. alloca cannot be used anywhere other than the basic block
|
||||
local_storage = builder.alloca(ir.IntType(int_width))
|
||||
local_storage_i8_ptr = builder.bitcast(local_storage, i8_ptr_type)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user