lkml.org 
[lkml]   [2013]   [Dec]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v1 8/9] staging: android: binder: Add binder compat handling to binder.h
    Date
    This patch adds all the needed compat structures to binder.h. All the
    structures defined in this patch mirror the structure and size of 32bit
    ones.

    Signed-off-by: Serban Constantinescu <serban.constantinescu@arm.com>
    ---
    drivers/staging/android/binder.h | 109 ++++++++++++++++++++++++++++++++++++++
    1 file changed, 109 insertions(+)

    diff --git a/drivers/staging/android/binder.h b/drivers/staging/android/binder.h
    index cbe3451..6c9849d 100644
    --- a/drivers/staging/android/binder.h
    +++ b/drivers/staging/android/binder.h
    @@ -22,6 +22,10 @@

    #include <linux/ioctl.h>

    +#ifdef CONFIG_COMPAT
    +#include <linux/compat.h>
    +#endif
    +
    #define B_PACK_CHARS(c1, c2, c3, c4) \
    ((((c1)<<24)) | (((c2)<<16)) | (((c3)<<8)) | (c4))
    #define B_TYPE_LARGE 0x85
    @@ -326,5 +330,110 @@ enum binder_driver_command_protocol {
    */
    };

    +/* Support for 32bit userspace on a 64bit system */
    +#ifdef CONFIG_COMPAT
    +struct compat_flat_binder_object {
    + /* 8 bytes for large_flat_header. */
    + __u32 type;
    + __u32 flags;
    +
    + /* 8 bytes of data. */
    + union {
    + compat_uptr_t binder; /* local object */
    + __u32 handle; /* remote object */
    + };
    +
    + /* extra data associated with local object */
    + compat_uptr_t cookie;
    +};
    +
    +struct compat_binder_write_read {
    + compat_size_t write_size; /* bytes to write */
    + compat_size_t write_consumed; /* bytes consumed by driver */
    + compat_ulong_t write_buffer;
    + compat_size_t read_size; /* bytes to read */
    + compat_size_t read_consumed; /* bytes consumed by driver */
    + compat_ulong_t read_buffer;
    +};
    +
    +#define COMPAT_BINDER_WRITE_READ _IOWR('b', 1, struct compat_binder_write_read)
    +
    +struct compat_binder_transaction_data {
    + /* The first two are only used for bcTRANSACTION and brTRANSACTION,
    + * identifying the target and contents of the transaction.
    + */
    + union {
    + __u32 handle; /* target descriptor of command transaction */
    + compat_uptr_t ptr; /* target descriptor of return transaction */
    + } target;
    + compat_uptr_t cookie; /* target object cookie */
    + __u32 code; /* transaction command */
    +
    + /* General information about the transaction. */
    + __u32 flags;
    + pid_t sender_pid;
    + uid_t sender_euid;
    + compat_size_t data_size; /* number of bytes of data */
    + compat_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 */
    + compat_uptr_t buffer;
    + /* offsets from buffer to flat_binder_object structs */
    + compat_uptr_t offsets;
    + } ptr;
    + __u8 buf[8];
    + } data;
    +};
    +
    +struct compat_binder_ptr_cookie {
    + compat_uptr_t ptr;
    + compat_uptr_t cookie;
    +};
    +
    +/* legacy - not used anymore */
    +struct compat_binder_pri_ptr_cookie {
    + __s32 priority;
    + compat_uptr_t ptr;
    + compat_uptr_t cookie;
    +};
    +
    +enum compat_binder_driver_return_protocol {
    + COMPAT_BR_TRANSACTION = _IOR('r', 2, struct compat_binder_transaction_data),
    + COMPAT_BR_REPLY = _IOR('r', 3, struct compat_binder_transaction_data),
    +
    + COMPAT_BR_INCREFS = _IOR('r', 7, struct compat_binder_ptr_cookie),
    + COMPAT_BR_ACQUIRE = _IOR('r', 8, struct compat_binder_ptr_cookie),
    + COMPAT_BR_RELEASE = _IOR('r', 9, struct compat_binder_ptr_cookie),
    + COMPAT_BR_DECREFS = _IOR('r', 10, struct compat_binder_ptr_cookie),
    +
    + /* legacy - not used anymore */
    + COMPAT_BR_ATTEMPT_ACQUIRE = _IOR('r', 11, struct compat_binder_pri_ptr_cookie),
    +
    + COMPAT_BR_DEAD_BINDER = _IOR('r', 15, compat_uptr_t),
    + COMPAT_BR_CLEAR_DEATH_NOTIFICATION_DONE = _IOR('r', 16, compat_uptr_t),
    +};
    +
    +enum compat_binder_driver_command_protocol {
    + COMPAT_BC_TRANSACTION = _IOW('c', 0, struct compat_binder_transaction_data),
    + COMPAT_BC_REPLY = _IOW('c', 1, struct compat_binder_transaction_data),
    +
    + COMPAT_BC_FREE_BUFFER = _IOW('c', 3, compat_uptr_t),
    +
    + COMPAT_BC_INCREFS_DONE = _IOW('c', 8, struct compat_binder_ptr_cookie),
    + COMPAT_BC_ACQUIRE_DONE = _IOW('c', 9, struct compat_binder_ptr_cookie),
    +
    + COMPAT_BC_REQUEST_DEATH_NOTIFICATION = _IOW('c', 14, struct compat_binder_ptr_cookie),
    + COMPAT_BC_CLEAR_DEATH_NOTIFICATION = _IOW('c', 15, struct compat_binder_ptr_cookie),
    +
    + COMPAT_BC_DEAD_BINDER_DONE = _IOW('c', 16, compat_uptr_t),
    +};
    +#endif /* CONFIG_COMPAT */
    +
    #endif /* _LINUX_BINDER_H */

    --
    1.7.9.5


    \
     
     \ /
      Last update: 2013-12-04 20:41    [W:4.157 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site