Skip to content

Commit 2257c17

Browse files
committed
Implement BPF_PROBE_READ helper
1 parent 5bf60d6 commit 2257c17

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

pythonbpf/helper/bpf_helper_handler.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
get_buffer_ptr_and_size,
1111
get_char_array_ptr_and_size,
1212
get_ptr_from_arg,
13+
get_int_value_from_arg,
1314
)
1415
from .printk_formatter import simple_string_print, handle_fstring_print
1516

@@ -457,6 +458,64 @@ def bpf_get_prandom_u32_emitter(
457458
return result, ir.IntType(32)
458459

459460

461+
@HelperHandlerRegistry.register("probe_read")
462+
def bpf_probe_read_emitter(
463+
call,
464+
map_ptr,
465+
module,
466+
builder,
467+
func,
468+
local_sym_tab=None,
469+
struct_sym_tab=None,
470+
map_sym_tab=None,
471+
):
472+
"""
473+
Emit LLVM IR for bpf_probe_read helper function
474+
"""
475+
476+
if len(call.args) != 3:
477+
logger.warn("Expected 3 args for probe_read helper")
478+
return
479+
dst_ptr, _ = get_ptr_from_arg(
480+
call.args[0], func, module, builder, local_sym_tab, map_sym_tab, struct_sym_tab
481+
)
482+
size_val = (
483+
get_int_value_from_arg(
484+
call.args[1],
485+
func,
486+
module,
487+
builder,
488+
local_sym_tab,
489+
map_sym_tab,
490+
struct_sym_tab,
491+
)
492+
& 0xFFFFFFFF
493+
)
494+
src_ptr, _ = get_ptr_from_arg(
495+
call.args[2], func, module, builder, local_sym_tab, map_sym_tab, struct_sym_tab
496+
)
497+
fn_type = ir.FunctionType(
498+
ir.IntType(64),
499+
[ir.PointerType(), ir.IntType(32), ir.PointerType()],
500+
var_arg=False,
501+
)
502+
fn_ptr = builder.inttoptr(
503+
ir.Constant(ir.IntType(64), BPFHelperID.BPF_PROBE_READ.value),
504+
ir.PointerType(fn_type),
505+
)
506+
result = builder.call(
507+
fn_ptr,
508+
[
509+
builder.bitcast(dst_ptr, ir.PointerType()),
510+
ir.Constant(ir.IntType(32), size_val),
511+
builder.bitcast(src_ptr, ir.PointerType()),
512+
],
513+
tail=False,
514+
)
515+
logger.info(f"Emitted bpf_probe_read (size={size_val})")
516+
return result, ir.IntType(64)
517+
518+
460519
def handle_helper_call(
461520
call,
462521
module,

pythonbpf/helper/helper_utils.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,3 +274,23 @@ def get_ptr_from_arg(
274274
raise ValueError(f"Expected pointer type, got {val_type}")
275275

276276
return val, val_type
277+
278+
279+
def get_int_value_from_arg(
280+
arg, func, module, builder, local_sym_tab, map_sym_tab, struct_sym_tab
281+
):
282+
"""Evaluate argument and return integer value"""
283+
284+
result = eval_expr(
285+
func, module, builder, arg, local_sym_tab, map_sym_tab, struct_sym_tab
286+
)
287+
288+
if not result:
289+
raise ValueError("Failed to evaluate argument")
290+
291+
val, val_type = result
292+
293+
if not isinstance(val_type, ir.IntType):
294+
raise ValueError(f"Expected integer type, got {val_type}")
295+
296+
return val

0 commit comments

Comments
 (0)