Staging: android: add binder driver
It builds, but not as a module, and with lots of warnings. I also had to fix up a few syntax errors to get it to build properly, I'm doubting that anyone has built it in a while :( Signed-off-by: Arve Hjønnevåg <arve@android.com> Signed-off-by: Brian Swetland <swetland@google.com> Cc: Robert Love <rlove@google.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
		
							parent
							
								
									6dc9c9e8b0
								
							
						
					
					
						commit
						457b9a6f09
					
				| @ -6,4 +6,8 @@ config ANDROID | ||||
| 	---help--- | ||||
| 	  Enable support for various drivers needed on the Android platform | ||||
| 
 | ||||
| config ANDROID_BINDER_IPC | ||||
| 	tristate "Android Binder IPC Driver" | ||||
| 	default y | ||||
| 
 | ||||
| endmenu | ||||
|  | ||||
| @ -1 +1,2 @@ | ||||
| obj-$(CONFIG_ANDROID)			+= android.o | ||||
| obj-$(CONFIG_ANDROID_BINDER_IPC)	+= binder.o | ||||
|  | ||||
							
								
								
									
										3499
									
								
								drivers/staging/android/binder.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3499
									
								
								drivers/staging/android/binder.c
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										330
									
								
								drivers/staging/android/binder.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										330
									
								
								drivers/staging/android/binder.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,330 @@ | ||||
| /*
 | ||||
|  * Copyright (C) 2008 Google, Inc. | ||||
|  * | ||||
|  * Based on, but no longer compatible with, the original | ||||
|  * OpenBinder.org binder driver interface, which is: | ||||
|  * | ||||
|  * Copyright (c) 2005 Palmsource, Inc. | ||||
|  * | ||||
|  * This software is licensed under the terms of the GNU General Public | ||||
|  * License version 2, as published by the Free Software Foundation, and | ||||
|  * may be copied, distributed, and modified under those terms. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  */ | ||||
| 
 | ||||
| #ifndef _LINUX_BINDER_H | ||||
| #define _LINUX_BINDER_H | ||||
| 
 | ||||
| #include <linux/ioctl.h> | ||||
| 
 | ||||
| #define B_PACK_CHARS(c1, c2, c3, c4) \ | ||||
| 	((((c1)<<24)) | (((c2)<<16)) | (((c3)<<8)) | (c4)) | ||||
| #define B_TYPE_LARGE 0x85 | ||||
| 
 | ||||
| enum { | ||||
| 	BINDER_TYPE_BINDER	= B_PACK_CHARS('s', 'b', '*', B_TYPE_LARGE), | ||||
| 	BINDER_TYPE_WEAK_BINDER	= B_PACK_CHARS('w', 'b', '*', B_TYPE_LARGE), | ||||
| 	BINDER_TYPE_HANDLE	= B_PACK_CHARS('s', 'h', '*', B_TYPE_LARGE), | ||||
| 	BINDER_TYPE_WEAK_HANDLE	= B_PACK_CHARS('w', 'h', '*', B_TYPE_LARGE), | ||||
| 	BINDER_TYPE_FD		= B_PACK_CHARS('f', 'd', '*', B_TYPE_LARGE), | ||||
| }; | ||||
| 
 | ||||
| enum { | ||||
| 	FLAT_BINDER_FLAG_PRIORITY_MASK = 0xff, | ||||
| 	FLAT_BINDER_FLAG_ACCEPTS_FDS = 0x100, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * This is the flattened representation of a Binder object for transfer | ||||
|  * between processes.  The 'offsets' supplied as part of a binder transaction | ||||
|  * contains offsets into the data where these structures occur.  The Binder | ||||
|  * driver takes care of re-writing the structure type and data as it moves | ||||
|  * between processes. | ||||
|  */ | ||||
| struct flat_binder_object { | ||||
| 	/* 8 bytes for large_flat_header. */ | ||||
| 	unsigned long		type; | ||||
| 	unsigned long		flags; | ||||
| 
 | ||||
| 	/* 8 bytes of data. */ | ||||
| 	union { | ||||
| 		void		*binder;	/* local object */ | ||||
| 		signed long	handle;		/* remote object */ | ||||
| 	}; | ||||
| 
 | ||||
| 	/* extra data associated with local object */ | ||||
| 	void			*cookie; | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * On 64-bit platforms where user code may run in 32-bits the driver must | ||||
|  * translate the buffer (and local binder) addresses apropriately. | ||||
|  */ | ||||
| 
 | ||||
| struct binder_write_read { | ||||
| 	signed long	write_size;	/* bytes to write */ | ||||
| 	signed long	write_consumed;	/* bytes consumed by driver */ | ||||
| 	unsigned long	write_buffer; | ||||
| 	signed long	read_size;	/* bytes to read */ | ||||
| 	signed long	read_consumed;	/* bytes consumed by driver */ | ||||
| 	unsigned long	read_buffer; | ||||
| }; | ||||
| 
 | ||||
| /* Use with BINDER_VERSION, driver fills in fields. */ | ||||
| struct binder_version { | ||||
| 	/* driver protocol version -- increment with incompatible change */ | ||||
| 	signed long	protocol_version; | ||||
| }; | ||||
| 
 | ||||
| /* This is the current protocol version. */ | ||||
| #define BINDER_CURRENT_PROTOCOL_VERSION 7 | ||||
| 
 | ||||
| #define BINDER_WRITE_READ   		_IOWR('b', 1, struct binder_write_read) | ||||
| #define	BINDER_SET_IDLE_TIMEOUT		_IOW('b', 3, int64_t) | ||||
| #define	BINDER_SET_MAX_THREADS		_IOW('b', 5, size_t) | ||||
| #define	BINDER_SET_IDLE_PRIORITY	_IOW('b', 6, int) | ||||
| #define	BINDER_SET_CONTEXT_MGR		_IOW('b', 7, int) | ||||
| #define	BINDER_THREAD_EXIT		_IOW('b', 8, int) | ||||
| #define BINDER_VERSION			_IOWR('b', 9, struct binder_version) | ||||
| 
 | ||||
| /*
 | ||||
|  * NOTE: Two special error codes you should check for when calling | ||||
|  * in to the driver are: | ||||
|  * | ||||
|  * EINTR -- The operation has been interupted.  This should be | ||||
|  * handled by retrying the ioctl() until a different error code | ||||
|  * is returned. | ||||
|  * | ||||
|  * ECONNREFUSED -- The driver is no longer accepting operations | ||||
|  * from your process.  That is, the process is being destroyed. | ||||
|  * You should handle this by exiting from your process.  Note | ||||
|  * that once this error code is returned, all further calls to | ||||
|  * the driver from any thread will return this same code. | ||||
|  */ | ||||
| 
 | ||||
| enum transaction_flags { | ||||
| 	TF_ONE_WAY	= 0x01,	/* this is a one-way call: async, no return */ | ||||
| 	TF_ROOT_OBJECT	= 0x04,	/* contents are the component's root object */ | ||||
| 	TF_STATUS_CODE	= 0x08,	/* contents are a 32-bit status code */ | ||||
| 	TF_ACCEPT_FDS	= 0x10,	/* allow replies with file descriptors */ | ||||
| }; | ||||
| 
 | ||||
| struct binder_transaction_data { | ||||
| 	/* The first two are only used for bcTRANSACTION and brTRANSACTION,
 | ||||
| 	 * identifying the target and contents of the transaction. | ||||
| 	 */ | ||||
| 	union { | ||||
| 		size_t	handle;	/* target descriptor of command transaction */ | ||||
| 		void	*ptr;	/* target descriptor of return transaction */ | ||||
| 	} target; | ||||
| 	void		*cookie;	/* target object cookie */ | ||||
| 	unsigned int	code;		/* transaction command */ | ||||
| 
 | ||||
| 	/* General information about the transaction. */ | ||||
| 	unsigned int	flags; | ||||
| 	pid_t		sender_pid; | ||||
| 	uid_t		sender_euid; | ||||
| 	size_t		data_size;	/* number of bytes of data */ | ||||
| 	size_t		offsets_size;	/* number of bytes of offsets */ | ||||
| 
 | ||||
| 	/* If this transaction is inline, the data immediately
 | ||||
| 	 * follows here; otherwise, it ends with a pointer to | ||||
| 	 * the data buffer. | ||||
| 	 */ | ||||
| 	union { | ||||
| 		struct { | ||||
| 			/* transaction data */ | ||||
| 			const void	*buffer; | ||||
| 			/* offsets from buffer to flat_binder_object structs */ | ||||
| 			const void	*offsets; | ||||
| 		} ptr; | ||||
| 		uint8_t	buf[8]; | ||||
| 	} data; | ||||
| }; | ||||
| 
 | ||||
| struct binder_ptr_cookie { | ||||
| 	void *ptr; | ||||
| 	void *cookie; | ||||
| }; | ||||
| 
 | ||||
| struct binder_pri_desc { | ||||
| 	int priority; | ||||
| 	int desc; | ||||
| }; | ||||
| 
 | ||||
| struct binder_pri_ptr_cookie { | ||||
| 	int priority; | ||||
| 	void *ptr; | ||||
| 	void *cookie; | ||||
| }; | ||||
| 
 | ||||
| enum BinderDriverReturnProtocol { | ||||
| 	BR_ERROR = _IOR('r', 0, int), | ||||
| 	/*
 | ||||
| 	 * int: error code | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_OK = _IO('r', 1), | ||||
| 	/* No parameters! */ | ||||
| 
 | ||||
| 	BR_TRANSACTION = _IOR('r', 2, struct binder_transaction_data), | ||||
| 	BR_REPLY = _IOR('r', 3, struct binder_transaction_data), | ||||
| 	/*
 | ||||
| 	 * binder_transaction_data: the received command. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_ACQUIRE_RESULT = _IOR('r', 4, int), | ||||
| 	/*
 | ||||
| 	 * not currently supported | ||||
| 	 * int: 0 if the last bcATTEMPT_ACQUIRE was not successful. | ||||
| 	 * Else the remote object has acquired a primary reference. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_DEAD_REPLY = _IO('r', 5), | ||||
| 	/*
 | ||||
| 	 * The target of the last transaction (either a bcTRANSACTION or | ||||
| 	 * a bcATTEMPT_ACQUIRE) is no longer with us.  No parameters. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_TRANSACTION_COMPLETE = _IO('r', 6), | ||||
| 	/*
 | ||||
| 	 * No parameters... always refers to the last transaction requested | ||||
| 	 * (including replies).  Note that this will be sent even for | ||||
| 	 * asynchronous transactions. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_INCREFS = _IOR('r', 7, struct binder_ptr_cookie), | ||||
| 	BR_ACQUIRE = _IOR('r', 8, struct binder_ptr_cookie), | ||||
| 	BR_RELEASE = _IOR('r', 9, struct binder_ptr_cookie), | ||||
| 	BR_DECREFS = _IOR('r', 10, struct binder_ptr_cookie), | ||||
| 	/*
 | ||||
| 	 * void *:	ptr to binder | ||||
| 	 * void *: cookie for binder | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_ATTEMPT_ACQUIRE = _IOR('r', 11, struct binder_pri_ptr_cookie), | ||||
| 	/*
 | ||||
| 	 * not currently supported | ||||
| 	 * int:	priority | ||||
| 	 * void *: ptr to binder | ||||
| 	 * void *: cookie for binder | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_NOOP = _IO('r', 12), | ||||
| 	/*
 | ||||
| 	 * No parameters.  Do nothing and examine the next command.  It exists | ||||
| 	 * primarily so that we can replace it with a BR_SPAWN_LOOPER command. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_SPAWN_LOOPER = _IO('r', 13), | ||||
| 	/*
 | ||||
| 	 * No parameters.  The driver has determined that a process has no | ||||
| 	 * threads waiting to service incomming transactions.  When a process | ||||
| 	 * receives this command, it must spawn a new service thread and | ||||
| 	 * register it via bcENTER_LOOPER. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_FINISHED = _IO('r', 14), | ||||
| 	/*
 | ||||
| 	 * not currently supported | ||||
| 	 * stop threadpool thread | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_DEAD_BINDER = _IOR('r', 15, void *), | ||||
| 	/*
 | ||||
| 	 * void *: cookie | ||||
| 	 */ | ||||
| 	BR_CLEAR_DEATH_NOTIFICATION_DONE = _IOR('r', 16, void *), | ||||
| 	/*
 | ||||
| 	 * void *: cookie | ||||
| 	 */ | ||||
| 
 | ||||
| 	BR_FAILED_REPLY = _IO('r', 17), | ||||
| 	/*
 | ||||
| 	 * The the last transaction (either a bcTRANSACTION or | ||||
| 	 * a bcATTEMPT_ACQUIRE) failed (e.g. out of memory).  No parameters. | ||||
| 	 */ | ||||
| }; | ||||
| 
 | ||||
| enum BinderDriverCommandProtocol { | ||||
| 	BC_TRANSACTION = _IOW('c', 0, struct binder_transaction_data), | ||||
| 	BC_REPLY = _IOW('c', 1, struct binder_transaction_data), | ||||
| 	/*
 | ||||
| 	 * binder_transaction_data: the sent command. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_ACQUIRE_RESULT = _IOW('c', 2, int), | ||||
| 	/*
 | ||||
| 	 * not currently supported | ||||
| 	 * int:  0 if the last BR_ATTEMPT_ACQUIRE was not successful. | ||||
| 	 * Else you have acquired a primary reference on the object. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_FREE_BUFFER = _IOW('c', 3, int), | ||||
| 	/*
 | ||||
| 	 * void *: ptr to transaction data received on a read | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_INCREFS = _IOW('c', 4, int), | ||||
| 	BC_ACQUIRE = _IOW('c', 5, int), | ||||
| 	BC_RELEASE = _IOW('c', 6, int), | ||||
| 	BC_DECREFS = _IOW('c', 7, int), | ||||
| 	/*
 | ||||
| 	 * int:	descriptor | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_INCREFS_DONE = _IOW('c', 8, struct binder_ptr_cookie), | ||||
| 	BC_ACQUIRE_DONE = _IOW('c', 9, struct binder_ptr_cookie), | ||||
| 	/*
 | ||||
| 	 * void *: ptr to binder | ||||
| 	 * void *: cookie for binder | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_ATTEMPT_ACQUIRE = _IOW('c', 10, struct binder_pri_desc), | ||||
| 	/*
 | ||||
| 	 * not currently supported | ||||
| 	 * int: priority | ||||
| 	 * int: descriptor | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_REGISTER_LOOPER = _IO('c', 11), | ||||
| 	/*
 | ||||
| 	 * No parameters. | ||||
| 	 * Register a spawned looper thread with the device. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_ENTER_LOOPER = _IO('c', 12), | ||||
| 	BC_EXIT_LOOPER = _IO('c', 13), | ||||
| 	/*
 | ||||
| 	 * No parameters. | ||||
| 	 * These two commands are sent as an application-level thread | ||||
| 	 * enters and exits the binder loop, respectively.  They are | ||||
| 	 * used so the binder can have an accurate count of the number | ||||
| 	 * of looping threads it has available. | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_REQUEST_DEATH_NOTIFICATION = _IOW('c', 14, struct binder_ptr_cookie), | ||||
| 	/*
 | ||||
| 	 * void *: ptr to binder | ||||
| 	 * void *: cookie | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_CLEAR_DEATH_NOTIFICATION = _IOW('c', 15, struct binder_ptr_cookie), | ||||
| 	/*
 | ||||
| 	 * void *: ptr to binder | ||||
| 	 * void *: cookie | ||||
| 	 */ | ||||
| 
 | ||||
| 	BC_DEAD_BINDER_DONE = _IOW('c', 16, void *), | ||||
| 	/*
 | ||||
| 	 * void *: cookie | ||||
| 	 */ | ||||
| }; | ||||
| 
 | ||||
| #endif /* _LINUX_BINDER_H */ | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user