/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _LINUX_BINDER_INTERNAL_H #define _LINUX_BINDER_INTERNAL_H #include #include #include #include #include #include #include #include #include #ifdef CONFIG_ANDROID_BINDER_USER_TRACKING #include #include #endif struct binder_context { struct binder_node *binder_context_mgr_node; struct mutex context_mgr_node_lock; kuid_t binder_context_mgr_uid; const char *name; }; /** * struct binder_device - information about a binder device node * @hlist: list of binder devices (only used for devices requested via * CONFIG_ANDROID_BINDER_DEVICES) * @miscdev: information about a binder character device node * @context: binder context information * @binderfs_inode: This is the inode of the root dentry of the super block * belonging to a binderfs mount. */ struct binder_device { struct hlist_node hlist; struct miscdevice miscdev; struct binder_context context; struct inode *binderfs_inode; refcount_t ref; }; /** * binderfs_mount_opts - mount options for binderfs * @max: maximum number of allocatable binderfs binder devices * @stats_mode: enable binder stats in binderfs. */ struct binderfs_mount_opts { int max; int stats_mode; }; /** * binderfs_info - information about a binderfs mount * @ipc_ns: The ipc namespace the binderfs mount belongs to. * @control_dentry: This records the dentry of this binderfs mount * binder-control device. * @root_uid: uid that needs to be used when a new binder device is * created. * @root_gid: gid that needs to be used when a new binder device is * created. * @mount_opts: The mount options in use. * @device_count: The current number of allocated binder devices. * @proc_log_dir: Pointer to the directory dentry containing process-specific * logs. */ struct binderfs_info { struct ipc_namespace *ipc_ns; struct dentry *control_dentry; kuid_t root_uid; kgid_t root_gid; struct binderfs_mount_opts mount_opts; int device_count; struct dentry *proc_log_dir; }; extern const struct file_operations binder_fops; extern char *binder_devices_param; #ifdef CONFIG_ANDROID_BINDERFS extern bool is_binderfs_device(const struct inode *inode); extern struct dentry *binderfs_create_file(struct dentry *dir, const char *name, const struct file_operations *fops, void *data); extern void binderfs_remove_file(struct dentry *dentry); #else static inline bool is_binderfs_device(const struct inode *inode) { return false; } static inline struct dentry *binderfs_create_file(struct dentry *dir, const char *name, const struct file_operations *fops, void *data) { return NULL; } static inline void binderfs_remove_file(struct dentry *dentry) {} #endif #ifdef CONFIG_ANDROID_BINDERFS extern int __init init_binderfs(void); #else static inline int __init init_binderfs(void) { return 0; } #endif int binder_stats_show(struct seq_file *m, void *unused); DEFINE_SHOW_ATTRIBUTE(binder_stats); int binder_state_show(struct seq_file *m, void *unused); DEFINE_SHOW_ATTRIBUTE(binder_state); int binder_transactions_show(struct seq_file *m, void *unused); DEFINE_SHOW_ATTRIBUTE(binder_transactions); int binder_transaction_log_show(struct seq_file *m, void *unused); DEFINE_SHOW_ATTRIBUTE(binder_transaction_log); struct binder_transaction_log_entry { int debug_id; int debug_id_done; int call_type; int from_proc; int from_thread; int target_handle; int to_proc; int to_thread; int to_node; int data_size; int offsets_size; int return_error_line; uint32_t return_error; uint32_t return_error_param; const char *context_name; #ifdef CONFIG_ANDROID_BINDER_USER_TRACKING struct timespec timestamp; struct timeval tv; #endif }; struct binder_transaction_log { atomic_t cur; bool full; struct binder_transaction_log_entry entry[32]; }; extern struct binder_transaction_log binder_transaction_log; extern struct binder_transaction_log binder_transaction_log_failed; #endif /* _LINUX_BINDER_INTERNAL_H */