|
10 | 10 | get_buffer_ptr_and_size, |
11 | 11 | get_char_array_ptr_and_size, |
12 | 12 | get_ptr_from_arg, |
| 13 | + get_int_value_from_arg, |
13 | 14 | ) |
14 | 15 | from .printk_formatter import simple_string_print, handle_fstring_print |
15 | 16 |
|
@@ -457,6 +458,64 @@ def bpf_get_prandom_u32_emitter( |
457 | 458 | return result, ir.IntType(32) |
458 | 459 |
|
459 | 460 |
|
| 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 | + |
460 | 519 | def handle_helper_call( |
461 | 520 | call, |
462 | 521 | module, |
|
0 commit comments