mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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
					
				
					 4 changed files with 3834 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -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 a new issue