1 /* SPDX-License-Identifier: GPL-2.0 */ 2 3 #ifndef _LINUX_BINDER_INTERNAL_H 4 #define _LINUX_BINDER_INTERNAL_H 5 6 #include <linux/export.h> 7 #include <linux/fs.h> 8 #include <linux/list.h> 9 #include <linux/miscdevice.h> 10 #include <linux/mutex.h> 11 #include <linux/refcount.h> 12 #include <linux/stddef.h> 13 #include <linux/types.h> 14 #include <linux/uidgid.h> 15 16 struct binder_context { 17 struct binder_node *binder_context_mgr_node; 18 struct mutex context_mgr_node_lock; 19 kuid_t binder_context_mgr_uid; 20 const char *name; 21 }; 22 23 /** 24 * struct binder_device - information about a binder device node 25 * @hlist: list of binder devices (only used for devices requested via 26 * CONFIG_ANDROID_BINDER_DEVICES) 27 * @miscdev: information about a binder character device node 28 * @context: binder context information 29 * @binderfs_inode: This is the inode of the root dentry of the super block 30 * belonging to a binderfs mount. 31 */ 32 struct binder_device { 33 struct hlist_node hlist; 34 struct miscdevice miscdev; 35 struct binder_context context; 36 struct inode *binderfs_inode; 37 refcount_t ref; 38 }; 39 40 /** 41 * binderfs_mount_opts - mount options for binderfs 42 * @max: maximum number of allocatable binderfs binder devices 43 * @stats_mode: enable binder stats in binderfs. 44 */ 45 struct binderfs_mount_opts { 46 int max; 47 int stats_mode; 48 }; 49 50 /** 51 * binderfs_info - information about a binderfs mount 52 * @ipc_ns: The ipc namespace the binderfs mount belongs to. 53 * @control_dentry: This records the dentry of this binderfs mount 54 * binder-control device. 55 * @root_uid: uid that needs to be used when a new binder device is 56 * created. 57 * @root_gid: gid that needs to be used when a new binder device is 58 * created. 59 * @mount_opts: The mount options in use. 60 * @device_count: The current number of allocated binder devices. 61 * @proc_log_dir: Pointer to the directory dentry containing process-specific 62 * logs. 63 */ 64 struct binderfs_info { 65 struct ipc_namespace *ipc_ns; 66 struct dentry *control_dentry; 67 kuid_t root_uid; 68 kgid_t root_gid; 69 struct binderfs_mount_opts mount_opts; 70 int device_count; 71 struct dentry *proc_log_dir; 72 }; 73 74 extern const struct file_operations binder_fops; 75 76 extern char *binder_devices_param; 77 78 #ifdef CONFIG_ANDROID_BINDERFS 79 extern bool is_binderfs_device(const struct inode *inode); 80 extern struct dentry *binderfs_create_file(struct dentry *dir, const char *name, 81 const struct file_operations *fops, 82 void *data); 83 extern void binderfs_remove_file(struct dentry *dentry); 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 static inline void binderfs_remove_file(struct dentry *dentry) {} 97 #endif 98 99 #ifdef CONFIG_ANDROID_BINDERFS 100 extern int __init init_binderfs(void); 101 #else 102 static inline int __init init_binderfs(void) 103 { 104 return 0; 105 } 106 #endif 107 108 int binder_stats_show(struct seq_file *m, void *unused); 109 DEFINE_SHOW_ATTRIBUTE(binder_stats); 110 111 int binder_state_show(struct seq_file *m, void *unused); 112 DEFINE_SHOW_ATTRIBUTE(binder_state); 113 114 int binder_transactions_show(struct seq_file *m, void *unused); 115 DEFINE_SHOW_ATTRIBUTE(binder_transactions); 116 117 int binder_transaction_log_show(struct seq_file *m, void *unused); 118 DEFINE_SHOW_ATTRIBUTE(binder_transaction_log); 119 120 struct binder_transaction_log_entry { 121 int debug_id; 122 int debug_id_done; 123 int call_type; 124 int from_proc; 125 int from_thread; 126 int target_handle; 127 int to_proc; 128 int to_thread; 129 int to_node; 130 int data_size; 131 int offsets_size; 132 int return_error_line; 133 uint32_t return_error; 134 uint32_t return_error_param; 135 char context_name[BINDERFS_MAX_NAME + 1]; 136 }; 137 138 struct binder_transaction_log { 139 atomic_t cur; 140 bool full; 141 struct binder_transaction_log_entry entry[32]; 142 }; 143 144 extern struct binder_transaction_log binder_transaction_log; 145 extern struct binder_transaction_log binder_transaction_log_failed; 146 #endif /* _LINUX_BINDER_INTERNAL_H */ 147