xref: /linux/drivers/android/binder/trace.rs (revision 94c37d42cb7ca362aee9633bec2dbeed787edf3e)
1 // SPDX-License-Identifier: GPL-2.0
2 
3 // Copyright (C) 2025 Google LLC.
4 
5 use crate::transaction::Transaction;
6 
7 use kernel::bindings::{rust_binder_transaction, task_struct};
8 use kernel::ffi::{c_uint, c_ulong};
9 use kernel::task::Task;
10 use kernel::tracepoint::declare_trace;
11 
12 declare_trace! {
13     unsafe fn rust_binder_ioctl(cmd: c_uint, arg: c_ulong);
14     unsafe fn rust_binder_transaction(reply: bool, t: rust_binder_transaction, thread: *mut task_struct);
15 }
16 
17 #[inline]
18 fn raw_transaction(t: &Transaction) -> rust_binder_transaction {
19     t as *const Transaction as rust_binder_transaction
20 }
21 
22 #[inline]
23 pub(crate) fn trace_ioctl(cmd: u32, arg: usize) {
24     // SAFETY: Always safe to call.
25     unsafe { rust_binder_ioctl(cmd, arg as c_ulong) }
26 }
27 
28 #[inline]
29 pub(crate) fn trace_transaction(reply: bool, t: &Transaction, thread: Option<&Task>) {
30     let thread = match thread {
31         Some(thread) => thread.as_ptr(),
32         None => core::ptr::null_mut(),
33     };
34     // SAFETY: The raw transaction is valid for the duration of this call. The thread pointer is
35     // valid or null.
36     unsafe { rust_binder_transaction(reply, raw_transaction(t), thread) }
37 }
38