xref: /DragonOS/kernel/src/bpf/helper/print.rs (revision 55e6f0b65f91b32638fd56581f711a816eccdcd1)
1 use core::{
2     ffi::{c_char, c_int},
3     fmt::Write,
4 };
5 
6 use printf_compat::{format, output};
7 
8 /// Printf according to the format string, function will return the number of bytes written(including '\0')
9 pub unsafe extern "C" fn printf(w: &mut impl Write, str: *const c_char, mut args: ...) -> c_int {
10     let bytes_written = format(str as _, args.as_va_list(), output::fmt_write(w));
11     bytes_written + 1
12 }
13 
14 struct TerminalOut;
15 impl Write for TerminalOut {
16     fn write_str(&mut self, s: &str) -> core::fmt::Result {
17         print!("{}", s);
18         Ok(())
19     }
20 }
21 
22 /// See https://ebpf-docs.dylanreimerink.nl/linux/helper-function/bpf_trace_printk/
23 pub fn trace_printf(fmt_ptr: u64, _fmt_len: u64, arg3: u64, arg4: u64, arg5: u64) -> u64 {
24     unsafe { printf(&mut TerminalOut, fmt_ptr as _, arg3, arg4, arg5) as u64 }
25 }
26