lkml.org 
[lkml]   [2013]   [Mar]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] staging: android: ashmem: Add support for 32bit ashmem calls in a 64bit kernel
    Date
    Android's shared memory subsystem, Ashmem, does not support calls from a
    32bit userspace in a 64 bit kernel. This patch adds support for syscalls
    coming from a 32bit userspace in a 64bit kernel.

    The patch has been successfully tested on ARMv8 AEM(64bit
    platform model) and Versatile Express A9(32bit platform).

    Signed-off-by: Serban Constantinescu <serban.constantinescu@arm.com>
    ---
    drivers/staging/android/ashmem.c | 22 +++++++++++++++++++++-
    drivers/staging/android/ashmem.h | 6 ++++++
    2 files changed, 27 insertions(+), 1 deletion(-)

    diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c
    index 72064fc..e96f381 100644
    --- a/drivers/staging/android/ashmem.c
    +++ b/drivers/staging/android/ashmem.c
    @@ -31,6 +31,7 @@
    #include <linux/bitops.h>
    #include <linux/mutex.h>
    #include <linux/shmem_fs.h>
    +#include <linux/compat.h>
    #include "ashmem.h"

    #define ASHMEM_NAME_PREFIX "dev/ashmem/"
    @@ -674,6 +675,23 @@ static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    return ret;
    }

    +/* support of 32bit userspace on 64bit platforms */
    +#ifdef CONFIG_COMPAT
    +static long compat_ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
    +{
    +
    + switch (cmd) {
    + case COMPAT_ASHMEM_SET_SIZE:
    + cmd = ASHMEM_SET_SIZE;
    + break;
    + case COMPAT_ASHMEM_SET_PROT_MASK:
    + cmd = ASHMEM_SET_PROT_MASK;
    + break;
    + }
    + return ashmem_ioctl(file, cmd, arg);
    +}
    +#endif
    +
    static const struct file_operations ashmem_fops = {
    .owner = THIS_MODULE,
    .open = ashmem_open,
    @@ -682,7 +700,9 @@ static const struct file_operations ashmem_fops = {
    .llseek = ashmem_llseek,
    .mmap = ashmem_mmap,
    .unlocked_ioctl = ashmem_ioctl,
    - .compat_ioctl = ashmem_ioctl,
    +#ifdef CONFIG_COMPAT
    + .compat_ioctl = compat_ashmem_ioctl,
    +#endif
    };

    static struct miscdevice ashmem_misc = {
    diff --git a/drivers/staging/android/ashmem.h b/drivers/staging/android/ashmem.h
    index 1976b10..2809d31 100644
    --- a/drivers/staging/android/ashmem.h
    +++ b/drivers/staging/android/ashmem.h
    @@ -45,4 +45,10 @@ struct ashmem_pin {
    #define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9)
    #define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10)

    +/* support of 32bit userspace on 64bit platforms */
    +#ifdef CONFIG_COMPAT
    +#define COMPAT_ASHMEM_SET_SIZE _IOW(__ASHMEMIOC, 3, compat_size_t)
    +#define COMPAT_ASHMEM_SET_PROT_MASK _IOW(__ASHMEMIOC, 5, unsigned int)
    +#endif
    +
    #endif /* _LINUX_ASHMEM_H */
    --
    1.7.9.5


    \
     
     \ /
      Last update: 2013-03-05 12:01    [W:17.409 / U:0.176 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site