| 1 |
|
| 2 |
|
| 3 | #ifndef _LINUX_BINDER_INTERNAL_H
|
| 4 | #define _LINUX_BINDER_INTERNAL_H
|
| 5 |
|
| 6 | #include <linux/fs.h>
|
| 7 | #include <linux/list.h>
|
| 8 | #include <linux/miscdevice.h>
|
| 9 | #include <linux/mutex.h>
|
| 10 | #include <linux/refcount.h>
|
| 11 | #include <linux/stddef.h>
|
| 12 | #include <linux/types.h>
|
| 13 | #include <linux/uidgid.h>
|
| 14 | #include <uapi/linux/android/binderfs.h>
|
| 15 | #include "binder_alloc.h"
|
| 16 | #include "dbitmap.h"
|
| 17 |
|
| 18 | struct binder_context {
|
| 19 | struct binder_node *binder_context_mgr_node;
|
| 20 | struct mutex context_mgr_node_lock;
|
| 21 | kuid_t binder_context_mgr_uid;
|
| 22 | const char *name;
|
| 23 | };
|
| 24 |
|
| 25 | |
| 26 | * struct binder_device - information about a binder device node
|
| 27 | * @hlist: list of binder devices
|
| 28 | * @miscdev: information about a binder character device node
|
| 29 | * @context: binder context information
|
| 30 | * @binderfs_inode: This is the inode of the root dentry of the super block
|
| 31 | * belonging to a binderfs mount.
|
| 32 |
|
| 33 | struct binder_device {
|
| 34 | struct hlist_node hlist;
|
| 35 | struct miscdevice miscdev;
|
| 36 | struct binder_context context;
|
| 37 | struct inode *binderfs_inode;
|
| 38 | refcount_t ref;
|
| 39 | };
|
| 40 |
|
| 41 | |
| 42 | * binderfs_mount_opts - mount options for binderfs
|
| 43 | * @max: maximum number of allocatable binderfs binder devices
|
| 44 | * @stats_mode: enable binder stats in binderfs.
|
| 45 |
|
| 46 | struct binderfs_mount_opts {
|
| 47 | int max;
|
| 48 | int stats_mode;
|
| 49 | };
|
| 50 |
|
| 51 | |
| 52 | * binderfs_info - information about a binderfs mount
|
| 53 | * @ipc_ns: The ipc namespace the binderfs mount belongs to.
|
| 54 | * @control_dentry: This records the dentry of this binderfs mount
|
| 55 | * binder-control device.
|
| 56 | * @root_uid: uid that needs to be used when a new binder device is
|
| 57 | * created.
|
| 58 | * @root_gid: gid that needs to be used when a new binder device is
|
| 59 | * created.
|
| 60 | * @mount_opts: The mount options in use.
|
| 61 | * @device_count: The current number of allocated binder devices.
|
| 62 | * @proc_log_dir: Pointer to the directory dentry containing process-specific
|
| 63 | * logs.
|
| 64 |
|
| 65 | struct binderfs_info {
|
| 66 | struct ipc_namespace *ipc_ns;
|
| 67 | struct dentry *control_dentry;
|
| 68 | kuid_t root_uid;
|
| 69 | kgid_t root_gid;
|
| 70 | struct binderfs_mount_opts mount_opts;
|
| 71 | int device_count;
|
| 72 | struct dentry *proc_log_dir;
|
| 73 | };
|
| 74 |
|
| 75 | extern const struct file_operations binder_fops;
|
| 76 |
|
| 77 | extern char *binder_devices_param;
|
| 78 |
|
| 79 | #ifdef CONFIG_ANDROID_BINDERFS
|
| 80 | extern bool is_binderfs_device(const struct inode *inode);
|
| 81 | extern struct dentry *binderfs_create_file(struct dentry *dir, const char *name,
|
| 82 | const struct file_operations *fops,
|
| 83 | void *data);
|
| 84 | #else
|
| 85 | static inline bool is_binderfs_device(const struct inode *inode)
|
| 86 | {
|
| 87 | return false;
|
| 88 | }
|
| 89 | static inline struct dentry *binderfs_create_file(struct dentry *dir,
|
| 90 | const char *name,
|
| 91 | const struct file_operations *fops,
|
| 92 | void *data)
|
| 93 | {
|
| 94 | return NULL;
|
| 95 | }
|
| 96 | #endif
|
| 97 |
|
| 98 | #ifdef CONFIG_ANDROID_BINDERFS
|
| 99 | extern int __init init_binderfs(void);
|
| 100 | #else
|
| 101 | static inline int __init init_binderfs(void)
|
| 102 | {
|
| 103 | return 0;
|
| 104 | }
|
| 105 | #endif
|
| 106 |
|
| 107 | struct binder_debugfs_entry {
|
| 108 | const char *name;
|
| 109 | umode_t mode;
|
| 110 | const struct file_operations *fops;
|
| 111 | void *data;
|
| 112 | };
|
| 113 |
|
| 114 | extern const struct binder_debugfs_entry binder_debugfs_entries[];
|
| 115 |
|
| 116 | #define binder_for_each_debugfs_entry(entry) \
|
| 117 | for ((entry) = binder_debugfs_entries; \
|
| 118 | (entry)->name; \
|
| 119 | (entry)++)
|
| 120 |
|
| 121 | enum binder_stat_types {
|
| 122 | BINDER_STAT_PROC,
|
| 123 | BINDER_STAT_THREAD,
|
| 124 | BINDER_STAT_NODE,
|
| 125 | BINDER_STAT_REF,
|
| 126 | BINDER_STAT_DEATH,
|
| 127 | BINDER_STAT_TRANSACTION,
|
| 128 | BINDER_STAT_TRANSACTION_COMPLETE,
|
| 129 | BINDER_STAT_FREEZE,
|
| 130 | BINDER_STAT_COUNT
|
| 131 | };
|
| 132 |
|
| 133 | struct binder_stats {
|
| 134 | atomic_t br[_IOC_NR(BR_CLEAR_FREEZE_NOTIFICATION_DONE) + 1];
|
| 135 | atomic_t bc[_IOC_NR(BC_FREEZE_NOTIFICATION_DONE) + 1];
|
| 136 | atomic_t obj_created[BINDER_STAT_COUNT];
|
| 137 | atomic_t obj_deleted[BINDER_STAT_COUNT];
|
| 138 | };
|
| 139 |
|
| 140 | |
| 141 | * struct binder_work - work enqueued on a worklist
|
| 142 | * @entry: node enqueued on list
|
| 143 | * @type: type of work to be performed
|
| 144 | *
|
| 145 | * There are separate work lists for proc, thread, and node (async).
|
| 146 |
|
| 147 | struct binder_work {
|
| 148 | struct list_head entry;
|
| 149 |
|
| 150 | enum binder_work_type {
|
| 151 | BINDER_WORK_TRANSACTION = 1,
|
| 152 | BINDER_WORK_TRANSACTION_COMPLETE,
|
| 153 | BINDER_WORK_TRANSACTION_PENDING,
|
| 154 | BINDER_WORK_TRANSACTION_ONEWAY_SPAM_SUSPECT,
|
| 155 | BINDER_WORK_RETURN_ERROR,
|
| 156 | BINDER_WORK_NODE,
|
| 157 | BINDER_WORK_DEAD_BINDER,
|
| 158 | BINDER_WORK_DEAD_BINDER_AND_CLEAR,
|
| 159 | BINDER_WORK_CLEAR_DEATH_NOTIFICATION,
|
| 160 | BINDER_WORK_FROZEN_BINDER,
|
| 161 | BINDER_WORK_CLEAR_FREEZE_NOTIFICATION,
|
| 162 | } type;
|
| 163 | };
|
| 164 |
|
| 165 | struct binder_error {
|
| 166 | struct binder_work work;
|
| 167 | uint32_t cmd;
|
| 168 | };
|
| 169 |
|
| 170 | |
| 171 | * struct binder_node - binder node bookkeeping
|
| 172 | * @debug_id: unique ID for debugging
|
| 173 | * (invariant after initialized)
|
| 174 | * @lock: lock for node fields
|
| 175 | * @work: worklist element for node work
|
| 176 | * (protected by @proc->inner_lock)
|
| 177 | * @rb_node: element for proc->nodes tree
|
| 178 | * (protected by @proc->inner_lock)
|
| 179 | * @dead_node: element for binder_dead_nodes list
|
| 180 | * (protected by binder_dead_nodes_lock)
|
| 181 | * @proc: binder_proc that owns this node
|
| 182 | * (invariant after initialized)
|
| 183 | * @refs: list of references on this node
|
| 184 | * (protected by @lock)
|
| 185 | * @internal_strong_refs: used to take strong references when
|
| 186 | * initiating a transaction
|
| 187 | * (protected by @proc->inner_lock if @proc
|
| 188 | * and by @lock)
|
| 189 | * @local_weak_refs: weak user refs from local process
|
| 190 | * (protected by @proc->inner_lock if @proc
|
| 191 | * and by @lock)
|
| 192 | * @local_strong_refs: strong user refs from local process
|
| 193 | * (protected by @proc->inner_lock if @proc
|
| 194 | * and by @lock)
|
| 195 | * @tmp_refs: temporary kernel refs
|
| 196 | * (protected by @proc->inner_lock while @proc
|
| 197 | * is valid, and by binder_dead_nodes_lock
|
| 198 | * if @proc is NULL. During inc/dec and node release
|
| 199 | * it is also protected by @lock to provide safety
|
| 200 | * as the node dies and @proc becomes NULL)
|
| 201 | * @ptr: userspace pointer for node
|
| 202 | * (invariant, no lock needed)
|
| 203 | * @cookie: userspace cookie for node
|
| 204 | * (invariant, no lock needed)
|
| 205 | * @has_strong_ref: userspace notified of strong ref
|
| 206 | * (protected by @proc->inner_lock if @proc
|
| 207 | * and by @lock)
|
| 208 | * @pending_strong_ref: userspace has acked notification of strong ref
|
| 209 | * (protected by @proc->inner_lock if @proc
|
| 210 | * and by @lock)
|
| 211 | * @has_weak_ref: userspace notified of weak ref
|
| 212 | * (protected by @proc->inner_lock if @proc
|
| 213 | * and by @lock)
|
| 214 | * @pending_weak_ref: userspace has acked notification of weak ref
|
| 215 | * (protected by @proc->inner_lock if @proc
|
| 216 | * and by @lock)
|
| 217 | * @has_async_transaction: async transaction to node in progress
|
| 218 | * (protected by @lock)
|
| 219 | * @accept_fds: file descriptor operations supported for node
|
| 220 | * (invariant after initialized)
|
| 221 | * @min_priority: minimum scheduling priority
|
| 222 | * (invariant after initialized)
|
| 223 | * @txn_security_ctx: require sender's security context
|
| 224 | * (invariant after initialized)
|
| 225 | * @async_todo: list of async work items
|
| 226 | * (protected by @proc->inner_lock)
|
| 227 | *
|
| 228 | * Bookkeeping structure for binder nodes.
|
| 229 |
|
| 230 | struct binder_node {
|
| 231 | int debug_id;
|
| 232 | spinlock_t lock;
|
| 233 | struct binder_work work;
|
| 234 | union {
|
| 235 | struct rb_node rb_node;
|
| 236 | struct hlist_node dead_node;
|
| 237 | };
|
| 238 | struct binder_proc *proc;
|
| 239 | struct hlist_head refs;
|
| 240 | int internal_strong_refs;
|
| 241 | int local_weak_refs;
|
| 242 | int local_strong_refs;
|
| 243 | int tmp_refs;
|
| 244 | binder_uintptr_t ptr;
|
| 245 | binder_uintptr_t cookie;
|
| 246 | struct {
|
| 247 | |
| 248 | * bitfield elements protected by
|
| 249 | * proc inner_lock
|
| 250 |
|
| 251 | u8 has_strong_ref:1;
|
| 252 | u8 pending_strong_ref:1;
|
| 253 | u8 has_weak_ref:1;
|
| 254 | u8 pending_weak_ref:1;
|
| 255 | };
|
| 256 | struct {
|
| 257 | |
| 258 | * invariant after initialization
|
| 259 |
|
| 260 | u8 accept_fds:1;
|
| 261 | u8 txn_security_ctx:1;
|
| 262 | u8 min_priority;
|
| 263 | };
|
| 264 | bool has_async_transaction;
|
| 265 | struct list_head async_todo;
|
| 266 | };
|
| 267 |
|
| 268 | struct binder_ref_death {
|
| 269 | |
| 270 | * @work: worklist element for death notifications
|
| 271 | * (protected by inner_lock of the proc that
|
| 272 | * this ref belongs to)
|
| 273 |
|
| 274 | struct binder_work work;
|
| 275 | binder_uintptr_t cookie;
|
| 276 | };
|
| 277 |
|
| 278 | struct binder_ref_freeze {
|
| 279 | struct binder_work work;
|
| 280 | binder_uintptr_t cookie;
|
| 281 | bool is_frozen:1;
|
| 282 | bool sent:1;
|
| 283 | bool resend:1;
|
| 284 | };
|
| 285 |
|
| 286 | |
| 287 | * struct binder_ref_data - binder_ref counts and id
|
| 288 | * @debug_id: unique ID for the ref
|
| 289 | * @desc: unique userspace handle for ref
|
| 290 | * @strong: strong ref count (debugging only if not locked)
|
| 291 | * @weak: weak ref count (debugging only if not locked)
|
| 292 | *
|
| 293 | * Structure to hold ref count and ref id information. Since
|
| 294 | * the actual ref can only be accessed with a lock, this structure
|
| 295 | * is used to return information about the ref to callers of
|
| 296 | * ref inc/dec functions.
|
| 297 |
|
| 298 | struct binder_ref_data {
|
| 299 | int debug_id;
|
| 300 | uint32_t desc;
|
| 301 | int strong;
|
| 302 | int weak;
|
| 303 | };
|
| 304 |
|
| 305 | |
| 306 | * struct binder_ref - struct to track references on nodes
|
| 307 | * @data: binder_ref_data containing id, handle, and current refcounts
|
| 308 | * @rb_node_desc: node for lookup by @data.desc in proc's rb_tree
|
| 309 | * @rb_node_node: node for lookup by @node in proc's rb_tree
|
| 310 | * @node_entry: list entry for node->refs list in target node
|
| 311 | * (protected by @node->lock)
|
| 312 | * @proc: binder_proc containing ref
|
| 313 | * @node: binder_node of target node. When cleaning up a
|
| 314 | * ref for deletion in binder_cleanup_ref, a non-NULL
|
| 315 | * @node indicates the node must be freed
|
| 316 | * @death: pointer to death notification (ref_death) if requested
|
| 317 | * (protected by @node->lock)
|
| 318 | * @freeze: pointer to freeze notification (ref_freeze) if requested
|
| 319 | * (protected by @node->lock)
|
| 320 | *
|
| 321 | * Structure to track references from procA to target node (on procB). This
|
| 322 | * structure is unsafe to access without holding @proc->outer_lock.
|
| 323 |
|
| 324 | struct binder_ref {
|
| 325 |
|
| 326 |
|
| 327 |
|
| 328 |
|
| 329 | struct binder_ref_data data;
|
| 330 | struct rb_node rb_node_desc;
|
| 331 | struct rb_node rb_node_node;
|
| 332 | struct hlist_node node_entry;
|
| 333 | struct binder_proc *proc;
|
| 334 | struct binder_node *node;
|
| 335 | struct binder_ref_death *death;
|
| 336 | struct binder_ref_freeze *freeze;
|
| 337 | };
|
| 338 |
|
| 339 | |
| 340 | * struct binder_proc - binder process bookkeeping
|
| 341 | * @proc_node: element for binder_procs list
|
| 342 | * @threads: rbtree of binder_threads in this proc
|
| 343 | * (protected by @inner_lock)
|
| 344 | * @nodes: rbtree of binder nodes associated with
|
| 345 | * this proc ordered by node->ptr
|
| 346 | * (protected by @inner_lock)
|
| 347 | * @refs_by_desc: rbtree of refs ordered by ref->desc
|
| 348 | * (protected by @outer_lock)
|
| 349 | * @refs_by_node: rbtree of refs ordered by ref->node
|
| 350 | * (protected by @outer_lock)
|
| 351 | * @waiting_threads: threads currently waiting for proc work
|
| 352 | * (protected by @inner_lock)
|
| 353 | * @pid PID of group_leader of process
|
| 354 | * (invariant after initialized)
|
| 355 | * @tsk task_struct for group_leader of process
|
| 356 | * (invariant after initialized)
|
| 357 | * @cred struct cred associated with the `struct file`
|
| 358 | * in binder_open()
|
| 359 | * (invariant after initialized)
|
| 360 | * @deferred_work_node: element for binder_deferred_list
|
| 361 | * (protected by binder_deferred_lock)
|
| 362 | * @deferred_work: bitmap of deferred work to perform
|
| 363 | * (protected by binder_deferred_lock)
|
| 364 | * @outstanding_txns: number of transactions to be transmitted before
|
| 365 | * processes in freeze_wait are woken up
|
| 366 | * (protected by @inner_lock)
|
| 367 | * @is_dead: process is dead and awaiting free
|
| 368 | * when outstanding transactions are cleaned up
|
| 369 | * (protected by @inner_lock)
|
| 370 | * @is_frozen: process is frozen and unable to service
|
| 371 | * binder transactions
|
| 372 | * (protected by @inner_lock)
|
| 373 | * @sync_recv: process received sync transactions since last frozen
|
| 374 | * bit 0: received sync transaction after being frozen
|
| 375 | * bit 1: new pending sync transaction during freezing
|
| 376 | * (protected by @inner_lock)
|
| 377 | * @async_recv: process received async transactions since last frozen
|
| 378 | * (protected by @inner_lock)
|
| 379 | * @freeze_wait: waitqueue of processes waiting for all outstanding
|
| 380 | * transactions to be processed
|
| 381 | * (protected by @inner_lock)
|
| 382 | * @dmap dbitmap to manage available reference descriptors
|
| 383 | * (protected by @outer_lock)
|
| 384 | * @todo: list of work for this process
|
| 385 | * (protected by @inner_lock)
|
| 386 | * @stats: per-process binder statistics
|
| 387 | * (atomics, no lock needed)
|
| 388 | * @delivered_death: list of delivered death notification
|
| 389 | * (protected by @inner_lock)
|
| 390 | * @delivered_freeze: list of delivered freeze notification
|
| 391 | * (protected by @inner_lock)
|
| 392 | * @max_threads: cap on number of binder threads
|
| 393 | * (protected by @inner_lock)
|
| 394 | * @requested_threads: number of binder threads requested but not
|
| 395 | * yet started. In current implementation, can
|
| 396 | * only be 0 or 1.
|
| 397 | * (protected by @inner_lock)
|
| 398 | * @requested_threads_started: number binder threads started
|
| 399 | * (protected by @inner_lock)
|
| 400 | * @tmp_ref: temporary reference to indicate proc is in use
|
| 401 | * (protected by @inner_lock)
|
| 402 | * @default_priority: default scheduler priority
|
| 403 | * (invariant after initialized)
|
| 404 | * @debugfs_entry: debugfs node
|
| 405 | * @alloc: binder allocator bookkeeping
|
| 406 | * @context: binder_context for this proc
|
| 407 | * (invariant after initialized)
|
| 408 | * @inner_lock: can nest under outer_lock and/or node lock
|
| 409 | * @outer_lock: no nesting under innor or node lock
|
| 410 | * Lock order: 1) outer, 2) node, 3) inner
|
| 411 | * @binderfs_entry: process-specific binderfs log file
|
| 412 | * @oneway_spam_detection_enabled: process enabled oneway spam detection
|
| 413 | * or not
|
| 414 | *
|
| 415 | * Bookkeeping structure for binder processes
|
| 416 |
|
| 417 | struct binder_proc {
|
| 418 | struct hlist_node proc_node;
|
| 419 | struct rb_root threads;
|
| 420 | struct rb_root nodes;
|
| 421 | struct rb_root refs_by_desc;
|
| 422 | struct rb_root refs_by_node;
|
| 423 | struct list_head waiting_threads;
|
| 424 | int pid;
|
| 425 | struct task_struct *tsk;
|
| 426 | const struct cred *cred;
|
| 427 | struct hlist_node deferred_work_node;
|
| 428 | int deferred_work;
|
| 429 | int outstanding_txns;
|
| 430 | bool is_dead;
|
| 431 | bool is_frozen;
|
| 432 | bool sync_recv;
|
| 433 | bool async_recv;
|
| 434 | wait_queue_head_t freeze_wait;
|
| 435 | struct dbitmap dmap;
|
| 436 | struct list_head todo;
|
| 437 | struct binder_stats stats;
|
| 438 | struct list_head delivered_death;
|
| 439 | struct list_head delivered_freeze;
|
| 440 | u32 max_threads;
|
| 441 | int requested_threads;
|
| 442 | int requested_threads_started;
|
| 443 | int tmp_ref;
|
| 444 | long default_priority;
|
| 445 | struct dentry *debugfs_entry;
|
| 446 | struct binder_alloc alloc;
|
| 447 | struct binder_context *context;
|
| 448 | spinlock_t inner_lock;
|
| 449 | spinlock_t outer_lock;
|
| 450 | struct dentry *binderfs_entry;
|
| 451 | bool oneway_spam_detection_enabled;
|
| 452 | };
|
| 453 |
|
| 454 | |
| 455 | * struct binder_thread - binder thread bookkeeping
|
| 456 | * @proc: binder process for this thread
|
| 457 | * (invariant after initialization)
|
| 458 | * @rb_node: element for proc->threads rbtree
|
| 459 | * (protected by @proc->inner_lock)
|
| 460 | * @waiting_thread_node: element for @proc->waiting_threads list
|
| 461 | * (protected by @proc->inner_lock)
|
| 462 | * @pid: PID for this thread
|
| 463 | * (invariant after initialization)
|
| 464 | * @looper: bitmap of looping state
|
| 465 | * (only accessed by this thread)
|
| 466 | * @looper_needs_return: looping thread needs to exit driver
|
| 467 | * (no lock needed)
|
| 468 | * @transaction_stack: stack of in-progress transactions for this thread
|
| 469 | * (protected by @proc->inner_lock)
|
| 470 | * @todo: list of work to do for this thread
|
| 471 | * (protected by @proc->inner_lock)
|
| 472 | * @process_todo: whether work in @todo should be processed
|
| 473 | * (protected by @proc->inner_lock)
|
| 474 | * @return_error: transaction errors reported by this thread
|
| 475 | * (only accessed by this thread)
|
| 476 | * @reply_error: transaction errors reported by target thread
|
| 477 | * (protected by @proc->inner_lock)
|
| 478 | * @ee: extended error information from this thread
|
| 479 | * (protected by @proc->inner_lock)
|
| 480 | * @wait: wait queue for thread work
|
| 481 | * @stats: per-thread statistics
|
| 482 | * (atomics, no lock needed)
|
| 483 | * @tmp_ref: temporary reference to indicate thread is in use
|
| 484 | * (atomic since @proc->inner_lock cannot
|
| 485 | * always be acquired)
|
| 486 | * @is_dead: thread is dead and awaiting free
|
| 487 | * when outstanding transactions are cleaned up
|
| 488 | * (protected by @proc->inner_lock)
|
| 489 | *
|
| 490 | * Bookkeeping structure for binder threads.
|
| 491 |
|
| 492 | struct binder_thread {
|
| 493 | struct binder_proc *proc;
|
| 494 | struct rb_node rb_node;
|
| 495 | struct list_head waiting_thread_node;
|
| 496 | int pid;
|
| 497 | int looper;
|
| 498 | bool looper_need_return;
|
| 499 | struct binder_transaction *transaction_stack;
|
| 500 | struct list_head todo;
|
| 501 | bool process_todo;
|
| 502 | struct binder_error return_error;
|
| 503 | struct binder_error reply_error;
|
| 504 | struct binder_extended_error ee;
|
| 505 | wait_queue_head_t wait;
|
| 506 | struct binder_stats stats;
|
| 507 | atomic_t tmp_ref;
|
| 508 | bool is_dead;
|
| 509 | };
|
| 510 |
|
| 511 | |
| 512 | * struct binder_txn_fd_fixup - transaction fd fixup list element
|
| 513 | * @fixup_entry: list entry
|
| 514 | * @file: struct file to be associated with new fd
|
| 515 | * @offset: offset in buffer data to this fixup
|
| 516 | * @target_fd: fd to use by the target to install @file
|
| 517 | *
|
| 518 | * List element for fd fixups in a transaction. Since file
|
| 519 | * descriptors need to be allocated in the context of the
|
| 520 | * target process, we pass each fd to be processed in this
|
| 521 | * struct.
|
| 522 |
|
| 523 | struct binder_txn_fd_fixup {
|
| 524 | struct list_head fixup_entry;
|
| 525 | struct file *file;
|
| 526 | size_t offset;
|
| 527 | int target_fd;
|
| 528 | };
|
| 529 |
|
| 530 | struct binder_transaction {
|
| 531 | int debug_id;
|
| 532 | struct binder_work work;
|
| 533 | struct binder_thread *from;
|
| 534 | pid_t from_pid;
|
| 535 | pid_t from_tid;
|
| 536 | struct binder_transaction *from_parent;
|
| 537 | struct binder_proc *to_proc;
|
| 538 | struct binder_thread *to_thread;
|
| 539 | struct binder_transaction *to_parent;
|
| 540 | unsigned is_async:1;
|
| 541 | unsigned is_reply:1;
|
| 542 |
|
| 543 | struct binder_buffer *buffer;
|
| 544 | unsigned int code;
|
| 545 | unsigned int flags;
|
| 546 | long priority;
|
| 547 | long saved_priority;
|
| 548 | kuid_t sender_euid;
|
| 549 | ktime_t start_time;
|
| 550 | struct list_head fd_fixups;
|
| 551 | binder_uintptr_t security_ctx;
|
| 552 | |
| 553 | * @lock: protects @from, @to_proc, and @to_thread
|
| 554 | *
|
| 555 | * @from, @to_proc, and @to_thread can be set to NULL
|
| 556 | * during thread teardown
|
| 557 |
|
| 558 | spinlock_t lock;
|
| 559 | };
|
| 560 |
|
| 561 | |
| 562 | * struct binder_object - union of flat binder object types
|
| 563 | * @hdr: generic object header
|
| 564 | * @fbo: binder object (nodes and refs)
|
| 565 | * @fdo: file descriptor object
|
| 566 | * @bbo: binder buffer pointer
|
| 567 | * @fdao: file descriptor array
|
| 568 | *
|
| 569 | * Used for type-independent object copies
|
| 570 |
|
| 571 | struct binder_object {
|
| 572 | union {
|
| 573 | struct binder_object_header hdr;
|
| 574 | struct flat_binder_object fbo;
|
| 575 | struct binder_fd_object fdo;
|
| 576 | struct binder_buffer_object bbo;
|
| 577 | struct binder_fd_array_object fdao;
|
| 578 | };
|
| 579 | };
|
| 580 |
|
| 581 | |
| 582 | * Add a binder device to binder_devices
|
| 583 | * @device: the new binder device to add to the global list
|
| 584 |
|
| 585 | void binder_add_device(struct binder_device *device);
|
| 586 |
|
| 587 | |
| 588 | * Remove a binder device to binder_devices
|
| 589 | * @device: the binder device to remove from the global list
|
| 590 |
|
| 591 | void binder_remove_device(struct binder_device *device);
|
| 592 |
|
| 593 | #if IS_ENABLED(CONFIG_KUNIT)
|
| 594 | vm_fault_t binder_vm_fault(struct vm_fault *vmf);
|
| 595 | #endif
|
| 596 |
|
| 597 | #endif
|