Something went wrong. Try again.
(I'm so sorry!) Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145// SPDX-License-Identifier: GPL-2.0
// Copyright (C) 2025 Google LLC.
use crate::transaction::Transaction;
use core::ptr;
use kernel::bindings::{rust_binder_transaction, task_struct};use kernel::error::Result;use kernel::ffi::{c_int, c_uint, c_ulong};use kernel::task::Task;use kernel::tracepoint::declare_trace;
declare_trace! { unsafe fn binder_ioctl(cmd: c_uint, arg: c_ulong); unsafe fn binder_ioctl_done(ret: c_int); unsafe fn binder_read_done(ret: c_int); unsafe fn binder_write_done(ret: c_int); unsafe fn binder_wait_for_work(proc_work: bool, transaction_stack: bool, thread_todo: bool); unsafe fn binder_transaction(reply: bool, t: rust_binder_transaction, thread: *mut task_struct); unsafe fn binder_transaction_received(t: rust_binder_transaction); unsafe fn binder_transaction_fd_send(t_debug_id: c_int, fd: c_int, offset: usize); unsafe fn binder_transaction_fd_recv(t_debug_id: c_int, fd: c_int, offset: usize); unsafe fn binder_command(cmd: u32); unsafe fn binder_return(ret: u32); unsafe fn binder_transaction_alloc_buf( debug_id: c_int,data_size: usize, offset_size: usize, extra_buffers_size: usize); unsafe fn binder_transaction_buffer_release(debug_id: c_int); unsafe fn binder_transaction_failed_buffer_release(debug_id: c_int); unsafe fn binder_transaction_update_buffer_release(debug_id: c_int);}
#[inline]fn raw_transaction(t: &Transaction) -> rust_binder_transaction { ptr::from_ref(t).cast_mut().cast()}
#[inline]fn to_errno(ret: Result) -> i32 { match ret { Ok(()) => 0, Err(err) => err.to_errno(), }}
#[inline]pub(crate) fn trace_ioctl(cmd: u32, arg: usize) { // SAFETY: Always safe to call. unsafe { binder_ioctl(cmd, arg as c_ulong) }}
#[inline]pub(crate) fn trace_ioctl_done(ret: Result) { // SAFETY: Always safe to call. unsafe { binder_ioctl_done(to_errno(ret)) }}#[inline]pub(crate) fn trace_read_done(ret: Result) { // SAFETY: Always safe to call. unsafe { binder_read_done(to_errno(ret)) }}#[inline]pub(crate) fn trace_write_done(ret: Result) { // SAFETY: Always safe to call. unsafe { binder_write_done(to_errno(ret)) }}
#[inline]pub(crate) fn trace_wait_for_work(proc_work: bool, transaction_stack: bool, thread_todo: bool) { // SAFETY: Always safe to call. unsafe { binder_wait_for_work(proc_work, transaction_stack, thread_todo) }}
#[inline]pub(crate) fn trace_transaction(reply: bool, t: &Transaction, thread: Option<&Task>) { let thread = match thread { Some(thread) => thread.as_ptr(), None => core::ptr::null_mut(), }; // SAFETY: The raw transaction is valid for the duration of this call. The thread pointer is // valid or null. unsafe { binder_transaction(reply, raw_transaction(t), thread) }}
#[inline]pub(crate) fn trace_transaction_received(t: &Transaction) { // SAFETY: The raw transaction is valid for the duration of this call. unsafe { binder_transaction_received(raw_transaction(t)) }}
#[inline]pub(crate) fn trace_transaction_fd_send(t_debug_id: usize, fd: u32, offset: usize) { // SAFETY: This function is always safe to call. unsafe { binder_transaction_fd_send(t_debug_id as c_int, fd as c_int, offset) }}#[inline]pub(crate) fn trace_transaction_fd_recv(t_debug_id: usize, fd: u32, offset: usize) { // SAFETY: This function is always safe to call. unsafe { binder_transaction_fd_recv(t_debug_id as c_int, fd as c_int, offset) }}
#[inline]pub(crate) fn trace_command(cmd: u32) { // SAFETY: This function is always safe to call. unsafe { binder_command(cmd) }}#[inline]pub(crate) fn trace_return(ret: u32) { // SAFETY: This function is always safe to call. unsafe { binder_return(ret) }}#[inline]pub(crate) fn trace_transaction_alloc_buf( debug_id: usize, data_size: usize, offset_size: usize, extra_buffers_size: usize,) { // SAFETY: The `data` pointer is valid. unsafe { binder_transaction_alloc_buf( debug_id as c_int, data_size, offset_size, extra_buffers_size, ) }}#[inline]pub(crate) fn trace_transaction_buffer_release(debug_id: usize) { // SAFETY: This function is always safe to call. unsafe { binder_transaction_buffer_release(debug_id as c_int) }}#[inline]pub(crate) fn trace_transaction_failed_buffer_release(debug_id: usize) { // SAFETY: This function is always safe to call. unsafe { binder_transaction_failed_buffer_release(debug_id as c_int) }}#[inline]pub(crate) fn trace_transaction_update_buffer_release(debug_id: usize) { // SAFETY: This function is always safe to call. unsafe { binder_transaction_update_buffer_release(debug_id as c_int) }}