@@ -19,6 +19,7 @@ class BPFHelperID(Enum):
1919 BPF_PRINTK = 6
2020 BPF_GET_CURRENT_PID_TGID = 14
2121 BPF_PERF_EVENT_OUTPUT = 25
22+ BPF_RINGBUF_RESERVE = 131
2223
2324
2425@HelperHandlerRegistry .register ("ktime" )
@@ -181,6 +182,66 @@ def bpf_map_update_elem_emitter(
181182 return result , None
182183
183184
185+ @HelperHandlerRegistry .register ("reserve" )
186+ def bpf_ringbuf_reserve_emitter (
187+ call ,
188+ map_ptr ,
189+ module ,
190+ builder ,
191+ func ,
192+ local_sym_tab = None ,
193+ struct_sym_tab = None ,
194+ local_var_metadata = None ,
195+ ):
196+ """
197+ Emit LLVM IR for bpf_ringbuf_reserve helper function call.
198+ Expected call signature: ringbuf.reserve(size, flags=0)
199+ """
200+ if not call .args or len (call .args ) < 1 or len (call .args ) > 2 :
201+ raise ValueError (
202+ "Ringbuf reserve expects 1 or 2 args (size, flags), "
203+ f"got { len (call .args )} "
204+ )
205+
206+ # TODO: here, getting length of stuff does not actually work. need to fix this.
207+ size_arg = call .args [0 ]
208+ if isinstance (size_arg , ast .Constant ):
209+ size_val = ir .Constant (ir .IntType (64 ), size_arg .value )
210+ elif isinstance (size_arg , ast .Name ):
211+ if size_arg .id not in local_sym_tab :
212+ raise ValueError (
213+ f"Variable '{ size_arg .id } ' not found in local symbol table"
214+ )
215+ size_val = builder .load (local_sym_tab [size_arg .id ])
216+ else :
217+ raise NotImplementedError (f"Unsupported size argument type: { type (size_arg )} " )
218+
219+ flags_arg = call .args [1 ] if len (call .args ) > 1 else None
220+ flags_val = get_flags_val (flags_arg , builder , local_sym_tab )
221+
222+ map_void_ptr = builder .bitcast (map_ptr , ir .PointerType ())
223+
224+ # Args: (void* ringbuf, u64 size, u64 flags)
225+ fn_type = ir .FunctionType (
226+ ir .PointerType (),
227+ [ir .PointerType (), ir .IntType (64 ), ir .IntType (64 )],
228+ var_arg = False ,
229+ )
230+ fn_ptr_type = ir .PointerType (fn_type )
231+
232+ fn_addr = ir .Constant (ir .IntType (64 ), BPFHelperID .BPF_RINGBUF_RESERVE .value )
233+ fn_ptr = builder .inttoptr (fn_addr , fn_ptr_type )
234+
235+ if isinstance (flags_val , int ):
236+ flags_const = ir .Constant (ir .IntType (64 ), flags_val )
237+ else :
238+ flags_const = flags_val
239+
240+ result = builder .call (fn_ptr , [map_void_ptr , size_val , flags_const ], tail = True )
241+
242+ return result , ir .PointerType ()
243+
244+
184245@HelperHandlerRegistry .register ("delete" )
185246def bpf_map_delete_elem_emitter (
186247 call ,
0 commit comments