defs.rs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (C) 2025 Google LLC.
  3. use core::mem::MaybeUninit;
  4. use core::ops::{Deref, DerefMut};
  5. use kernel::{
  6. transmute::{AsBytes, FromBytes},
  7. uapi::{self, *},
  8. };
  9. macro_rules! pub_no_prefix {
  10. ($prefix:ident, $($newname:ident),+ $(,)?) => {
  11. $(pub(crate) const $newname: u32 = kernel::macros::concat_idents!($prefix, $newname);)+
  12. };
  13. }
  14. pub_no_prefix!(
  15. binder_driver_return_protocol_,
  16. BR_TRANSACTION,
  17. BR_TRANSACTION_SEC_CTX,
  18. BR_REPLY,
  19. BR_DEAD_REPLY,
  20. BR_FAILED_REPLY,
  21. BR_FROZEN_REPLY,
  22. BR_NOOP,
  23. BR_SPAWN_LOOPER,
  24. BR_TRANSACTION_COMPLETE,
  25. BR_TRANSACTION_PENDING_FROZEN,
  26. BR_ONEWAY_SPAM_SUSPECT,
  27. BR_OK,
  28. BR_ERROR,
  29. BR_INCREFS,
  30. BR_ACQUIRE,
  31. BR_RELEASE,
  32. BR_DECREFS,
  33. BR_DEAD_BINDER,
  34. BR_CLEAR_DEATH_NOTIFICATION_DONE,
  35. BR_FROZEN_BINDER,
  36. BR_CLEAR_FREEZE_NOTIFICATION_DONE,
  37. );
  38. pub_no_prefix!(
  39. binder_driver_command_protocol_,
  40. BC_TRANSACTION,
  41. BC_TRANSACTION_SG,
  42. BC_REPLY,
  43. BC_REPLY_SG,
  44. BC_FREE_BUFFER,
  45. BC_ENTER_LOOPER,
  46. BC_EXIT_LOOPER,
  47. BC_REGISTER_LOOPER,
  48. BC_INCREFS,
  49. BC_ACQUIRE,
  50. BC_RELEASE,
  51. BC_DECREFS,
  52. BC_INCREFS_DONE,
  53. BC_ACQUIRE_DONE,
  54. BC_REQUEST_DEATH_NOTIFICATION,
  55. BC_CLEAR_DEATH_NOTIFICATION,
  56. BC_DEAD_BINDER_DONE,
  57. BC_REQUEST_FREEZE_NOTIFICATION,
  58. BC_CLEAR_FREEZE_NOTIFICATION,
  59. BC_FREEZE_NOTIFICATION_DONE,
  60. );
  61. pub_no_prefix!(
  62. flat_binder_object_flags_,
  63. FLAT_BINDER_FLAG_ACCEPTS_FDS,
  64. FLAT_BINDER_FLAG_TXN_SECURITY_CTX
  65. );
  66. pub_no_prefix!(
  67. transaction_flags_,
  68. TF_ONE_WAY,
  69. TF_ACCEPT_FDS,
  70. TF_CLEAR_BUF,
  71. TF_UPDATE_TXN
  72. );
  73. pub(crate) use uapi::{
  74. BINDER_TYPE_BINDER, BINDER_TYPE_FD, BINDER_TYPE_FDA, BINDER_TYPE_HANDLE, BINDER_TYPE_PTR,
  75. BINDER_TYPE_WEAK_BINDER, BINDER_TYPE_WEAK_HANDLE,
  76. };
  77. macro_rules! decl_wrapper {
  78. ($newname:ident, $wrapped:ty) => {
  79. // Define a wrapper around the C type. Use `MaybeUninit` to enforce that the value of
  80. // padding bytes must be preserved.
  81. #[derive(Copy, Clone)]
  82. #[repr(transparent)]
  83. pub(crate) struct $newname(MaybeUninit<$wrapped>);
  84. // SAFETY: This macro is only used with types where this is ok.
  85. unsafe impl FromBytes for $newname {}
  86. // SAFETY: This macro is only used with types where this is ok.
  87. unsafe impl AsBytes for $newname {}
  88. impl Deref for $newname {
  89. type Target = $wrapped;
  90. fn deref(&self) -> &Self::Target {
  91. // SAFETY: We use `MaybeUninit` only to preserve padding. The value must still
  92. // always be valid.
  93. unsafe { self.0.assume_init_ref() }
  94. }
  95. }
  96. impl DerefMut for $newname {
  97. fn deref_mut(&mut self) -> &mut Self::Target {
  98. // SAFETY: We use `MaybeUninit` only to preserve padding. The value must still
  99. // always be valid.
  100. unsafe { self.0.assume_init_mut() }
  101. }
  102. }
  103. impl Default for $newname {
  104. fn default() -> Self {
  105. // Create a new value of this type where all bytes (including padding) are zeroed.
  106. Self(MaybeUninit::zeroed())
  107. }
  108. }
  109. };
  110. }
  111. decl_wrapper!(BinderNodeDebugInfo, uapi::binder_node_debug_info);
  112. decl_wrapper!(BinderNodeInfoForRef, uapi::binder_node_info_for_ref);
  113. decl_wrapper!(FlatBinderObject, uapi::flat_binder_object);
  114. decl_wrapper!(BinderFdObject, uapi::binder_fd_object);
  115. decl_wrapper!(BinderFdArrayObject, uapi::binder_fd_array_object);
  116. decl_wrapper!(BinderObjectHeader, uapi::binder_object_header);
  117. decl_wrapper!(BinderBufferObject, uapi::binder_buffer_object);
  118. decl_wrapper!(BinderTransactionData, uapi::binder_transaction_data);
  119. decl_wrapper!(
  120. BinderTransactionDataSecctx,
  121. uapi::binder_transaction_data_secctx
  122. );
  123. decl_wrapper!(BinderTransactionDataSg, uapi::binder_transaction_data_sg);
  124. decl_wrapper!(BinderWriteRead, uapi::binder_write_read);
  125. decl_wrapper!(BinderVersion, uapi::binder_version);
  126. decl_wrapper!(BinderFrozenStatusInfo, uapi::binder_frozen_status_info);
  127. decl_wrapper!(BinderFreezeInfo, uapi::binder_freeze_info);
  128. decl_wrapper!(BinderFrozenStateInfo, uapi::binder_frozen_state_info);
  129. decl_wrapper!(BinderHandleCookie, uapi::binder_handle_cookie);
  130. decl_wrapper!(ExtendedError, uapi::binder_extended_error);
  131. impl BinderVersion {
  132. pub(crate) fn current() -> Self {
  133. Self(MaybeUninit::new(uapi::binder_version {
  134. protocol_version: BINDER_CURRENT_PROTOCOL_VERSION as _,
  135. }))
  136. }
  137. }
  138. impl BinderTransactionData {
  139. pub(crate) fn with_buffers_size(self, buffers_size: u64) -> BinderTransactionDataSg {
  140. BinderTransactionDataSg(MaybeUninit::new(uapi::binder_transaction_data_sg {
  141. transaction_data: *self,
  142. buffers_size,
  143. }))
  144. }
  145. }
  146. impl BinderTransactionDataSecctx {
  147. /// View the inner data as wrapped in `BinderTransactionData`.
  148. pub(crate) fn tr_data(&mut self) -> &mut BinderTransactionData {
  149. // SAFETY: Transparent wrapper is safe to transmute.
  150. unsafe {
  151. &mut *(&mut self.transaction_data as *mut uapi::binder_transaction_data
  152. as *mut BinderTransactionData)
  153. }
  154. }
  155. }
  156. impl ExtendedError {
  157. pub(crate) fn new(id: u32, command: u32, param: i32) -> Self {
  158. Self(MaybeUninit::new(uapi::binder_extended_error {
  159. id,
  160. command,
  161. param,
  162. }))
  163. }
  164. }