mirror of
https://github.com/varun-r-mallya/Python-BPF.git
synced 2025-12-31 21:06:25 +00:00
add ringbuf submit function. commit does not verify on input, but the mirror C code does not as well.
This commit is contained in:
@ -20,6 +20,7 @@ class BPFHelperID(Enum):
|
||||
BPF_GET_CURRENT_PID_TGID = 14
|
||||
BPF_PERF_EVENT_OUTPUT = 25
|
||||
BPF_RINGBUF_RESERVE = 131
|
||||
BPF_RINGBUF_SUBMIT = 132
|
||||
|
||||
|
||||
@HelperHandlerRegistry.register("ktime")
|
||||
@ -181,6 +182,54 @@ def bpf_map_update_elem_emitter(
|
||||
|
||||
return result, None
|
||||
|
||||
@HelperHandlerRegistry.register("submit")
|
||||
def bpf_ringbuf_submit_emitter(
|
||||
call,
|
||||
map_ptr,
|
||||
module,
|
||||
builder,
|
||||
func,
|
||||
local_sym_tab=None,
|
||||
struct_sym_tab=None,
|
||||
local_var_metadata=None,
|
||||
):
|
||||
"""
|
||||
Emit LLVM IR for bpf_ringbuf_submit helper function call.
|
||||
Expected call signature: ringbuf.submit(data, flags=0)
|
||||
"""
|
||||
if not call.args or len(call.args) < 1 or len(call.args) > 2:
|
||||
raise ValueError(
|
||||
"Ringbuf submit expects 1 or 2 args (data, flags), "
|
||||
f"got {len(call.args)}"
|
||||
)
|
||||
|
||||
data_arg = call.args[0]
|
||||
data_ptr = get_or_create_ptr_from_arg(data_arg, builder, local_sym_tab)
|
||||
|
||||
# Get flags argument (default to 0)
|
||||
flags_arg = call.args[1] if len(call.args) > 1 else None
|
||||
flags_val = get_flags_val(flags_arg, builder, local_sym_tab)
|
||||
|
||||
# Returns: void
|
||||
# Args: (void* data, u64 flags)
|
||||
fn_type = ir.FunctionType(
|
||||
ir.VoidType(),
|
||||
[ir.PointerType(), ir.IntType(64)],
|
||||
var_arg=False,
|
||||
)
|
||||
fn_ptr_type = ir.PointerType(fn_type)
|
||||
|
||||
fn_addr = ir.Constant(ir.IntType(64), BPFHelperID.BPF_RINGBUF_SUBMIT.value)
|
||||
fn_ptr = builder.inttoptr(fn_addr, fn_ptr_type)
|
||||
|
||||
if isinstance(flags_val, int):
|
||||
flags_const = ir.Constant(ir.IntType(64), flags_val)
|
||||
else:
|
||||
flags_const = flags_val
|
||||
|
||||
builder.call(fn_ptr, [data_ptr, flags_const], tail=True)
|
||||
|
||||
return None
|
||||
|
||||
@HelperHandlerRegistry.register("reserve")
|
||||
def bpf_ringbuf_reserve_emitter(
|
||||
|
||||
Reference in New Issue
Block a user