Loading drivers/char/adsprpc.c +22 −0 Original line number Diff line number Diff line Loading @@ -2247,6 +2247,28 @@ static long fastrpc_device_ioctl(struct file *file, unsigned int ioctl_num, if (err) goto bail; break; case FASTRPC_IOCTL_MMAP_64: K_COPY_FROM_USER(err, 0, &p.mmap, param, sizeof(p.mmap)); if (err) goto bail; VERIFY(err, 0 == (err = fastrpc_internal_mmap(fl, &p.mmap))); if (err) goto bail; K_COPY_TO_USER(err, 0, param, &p.mmap, sizeof(p.mmap)); if (err) goto bail; break; case FASTRPC_IOCTL_MUNMAP_64: K_COPY_FROM_USER(err, 0, &p.munmap, param, sizeof(p.munmap)); if (err) goto bail; VERIFY(err, 0 == (err = fastrpc_internal_munmap(fl, &p.munmap))); if (err) goto bail; break; case FASTRPC_IOCTL_SETMODE: switch ((uint32_t)ioctl_param) { case FASTRPC_MODE_PARALLEL: Loading drivers/char/adsprpc_compat.c +107 −1 Original line number Diff line number Diff line /* * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -30,6 +30,10 @@ _IOWR('R', 4, struct compat_fastrpc_ioctl_invoke_fd) #define COMPAT_FASTRPC_IOCTL_INIT \ _IOWR('R', 6, struct compat_fastrpc_ioctl_init) #define COMPAT_FASTRPC_IOCTL_MMAP_64 \ _IOWR('R', 14, struct compat_fastrpc_ioctl_mmap_64) #define COMPAT_FASTRPC_IOCTL_MUNMAP_64 \ _IOWR('R', 15, struct compat_fastrpc_ioctl_munmap_64) struct compat_remote_buf { compat_uptr_t pv; /* buffer pointer */ Loading Loading @@ -60,11 +64,24 @@ struct compat_fastrpc_ioctl_mmap { compat_uptr_t vaddrout; /* dsps virtual address */ }; struct compat_fastrpc_ioctl_mmap_64 { compat_int_t fd; /* ion fd */ compat_uint_t flags; /* flags for dsp to map with */ compat_u64 vaddrin; /* optional virtual address */ compat_size_t size; /* size */ compat_u64 vaddrout; /* dsps virtual address */ }; struct compat_fastrpc_ioctl_munmap { compat_uptr_t vaddrout; /* address to unmap */ compat_size_t size; /* size */ }; struct compat_fastrpc_ioctl_munmap_64 { compat_u64 vaddrout; /* address to unmap */ compat_size_t size; /* size */ }; struct compat_fastrpc_ioctl_init { compat_uint_t flags; /* one of FASTRPC_INIT_* macros */ compat_uptr_t file; /* pointer to elf file */ Loading Loading @@ -180,6 +197,28 @@ static int compat_get_fastrpc_ioctl_mmap( return err; } static int compat_get_fastrpc_ioctl_mmap_64( struct compat_fastrpc_ioctl_mmap_64 __user *map32, struct fastrpc_ioctl_mmap __user *map) { compat_uint_t u; compat_int_t i; compat_size_t s; compat_u64 p; int err; err = get_user(i, &map32->fd); err |= put_user(i, &map->fd); err |= get_user(u, &map32->flags); err |= put_user(u, &map->flags); err |= get_user(p, &map32->vaddrin); err |= put_user(p, &map->vaddrin); err |= get_user(s, &map32->size); err |= put_user(s, &map->size); return err; } static int compat_put_fastrpc_ioctl_mmap( struct compat_fastrpc_ioctl_mmap __user *map32, struct fastrpc_ioctl_mmap __user *map) Loading @@ -193,6 +232,19 @@ static int compat_put_fastrpc_ioctl_mmap( return err; } static int compat_put_fastrpc_ioctl_mmap_64( struct compat_fastrpc_ioctl_mmap_64 __user *map32, struct fastrpc_ioctl_mmap __user *map) { compat_u64 p; int err; err = get_user(p, &map->vaddrout); err |= put_user(p, &map32->vaddrout); return err; } static int compat_get_fastrpc_ioctl_munmap( struct compat_fastrpc_ioctl_munmap __user *unmap32, struct fastrpc_ioctl_munmap __user *unmap) Loading @@ -209,6 +261,22 @@ static int compat_get_fastrpc_ioctl_munmap( return err; } static int compat_get_fastrpc_ioctl_munmap_64( struct compat_fastrpc_ioctl_munmap_64 __user *unmap32, struct fastrpc_ioctl_munmap __user *unmap) { compat_u64 p; compat_size_t s; int err; err = get_user(p, &unmap32->vaddrout); err |= put_user(p, &unmap->vaddrout); err |= get_user(s, &unmap32->size); err |= put_user(s, &unmap->size); return err; } static int compat_get_fastrpc_ioctl_init( struct compat_fastrpc_ioctl_init __user *init32, struct fastrpc_ioctl_init __user *init) Loading Loading @@ -285,6 +353,27 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd, VERIFY(err, 0 == compat_put_fastrpc_ioctl_mmap(map32, map)); return err; } case COMPAT_FASTRPC_IOCTL_MMAP_64: { struct compat_fastrpc_ioctl_mmap_64 __user *map32; struct fastrpc_ioctl_mmap __user *map; long ret; map32 = compat_ptr(arg); VERIFY(err, NULL != (map = compat_alloc_user_space( sizeof(*map)))); if (err) return -EFAULT; VERIFY(err, 0 == compat_get_fastrpc_ioctl_mmap_64(map32, map)); if (err) return err; ret = filp->f_op->unlocked_ioctl(filp, FASTRPC_IOCTL_MMAP_64, (unsigned long)map); if (ret) return ret; VERIFY(err, 0 == compat_put_fastrpc_ioctl_mmap_64(map32, map)); return err; } case COMPAT_FASTRPC_IOCTL_MUNMAP: { struct compat_fastrpc_ioctl_munmap __user *unmap32; Loading @@ -302,6 +391,23 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd, return filp->f_op->unlocked_ioctl(filp, FASTRPC_IOCTL_MUNMAP, (unsigned long)unmap); } case COMPAT_FASTRPC_IOCTL_MUNMAP_64: { struct compat_fastrpc_ioctl_munmap_64 __user *unmap32; struct fastrpc_ioctl_munmap __user *unmap; unmap32 = compat_ptr(arg); VERIFY(err, NULL != (unmap = compat_alloc_user_space( sizeof(*unmap)))); if (err) return -EFAULT; VERIFY(err, 0 == compat_get_fastrpc_ioctl_munmap_64(unmap32, unmap)); if (err) return err; return filp->f_op->unlocked_ioctl(filp, FASTRPC_IOCTL_MUNMAP_64, (unsigned long)unmap); } case COMPAT_FASTRPC_IOCTL_INIT: { struct compat_fastrpc_ioctl_init __user *init32; Loading drivers/char/adsprpc_shared.h +15 −1 Original line number Diff line number Diff line /* * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading @@ -19,6 +19,8 @@ #define FASTRPC_IOCTL_INVOKE _IOWR('R', 1, struct fastrpc_ioctl_invoke) #define FASTRPC_IOCTL_MMAP _IOWR('R', 2, struct fastrpc_ioctl_mmap) #define FASTRPC_IOCTL_MUNMAP _IOWR('R', 3, struct fastrpc_ioctl_munmap) #define FASTRPC_IOCTL_MMAP_64 _IOWR('R', 14, struct fastrpc_ioctl_mmap_64) #define FASTRPC_IOCTL_MUNMAP_64 _IOWR('R', 15, struct fastrpc_ioctl_munmap_64) #define FASTRPC_IOCTL_INVOKE_FD _IOWR('R', 4, struct fastrpc_ioctl_invoke_fd) #define FASTRPC_IOCTL_SETMODE _IOWR('R', 5, uint32_t) #define FASTRPC_IOCTL_INIT _IOWR('R', 6, struct fastrpc_ioctl_init) Loading Loading @@ -141,6 +143,10 @@ struct fastrpc_ioctl_munmap { size_t size; /* size */ }; struct fastrpc_ioctl_munmap_64 { uint64_t vaddrout; /* address to unmap */ size_t size; /* size */ }; struct fastrpc_ioctl_mmap { int fd; /* ion fd */ Loading @@ -150,6 +156,14 @@ struct fastrpc_ioctl_mmap { uintptr_t vaddrout; /* dsps virtual address */ }; struct fastrpc_ioctl_mmap_64 { int fd; /* ion fd */ uint32_t flags; /* flags for dsp to map with */ uint64_t vaddrin; /* optional virtual address */ size_t size; /* size */ uint64_t vaddrout; /* dsps virtual address */ }; struct smq_null_invoke { uint64_t ctx; /* invoke caller context */ uint32_t handle; /* handle to invoke */ Loading Loading
drivers/char/adsprpc.c +22 −0 Original line number Diff line number Diff line Loading @@ -2247,6 +2247,28 @@ static long fastrpc_device_ioctl(struct file *file, unsigned int ioctl_num, if (err) goto bail; break; case FASTRPC_IOCTL_MMAP_64: K_COPY_FROM_USER(err, 0, &p.mmap, param, sizeof(p.mmap)); if (err) goto bail; VERIFY(err, 0 == (err = fastrpc_internal_mmap(fl, &p.mmap))); if (err) goto bail; K_COPY_TO_USER(err, 0, param, &p.mmap, sizeof(p.mmap)); if (err) goto bail; break; case FASTRPC_IOCTL_MUNMAP_64: K_COPY_FROM_USER(err, 0, &p.munmap, param, sizeof(p.munmap)); if (err) goto bail; VERIFY(err, 0 == (err = fastrpc_internal_munmap(fl, &p.munmap))); if (err) goto bail; break; case FASTRPC_IOCTL_SETMODE: switch ((uint32_t)ioctl_param) { case FASTRPC_MODE_PARALLEL: Loading
drivers/char/adsprpc_compat.c +107 −1 Original line number Diff line number Diff line /* * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2014-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -30,6 +30,10 @@ _IOWR('R', 4, struct compat_fastrpc_ioctl_invoke_fd) #define COMPAT_FASTRPC_IOCTL_INIT \ _IOWR('R', 6, struct compat_fastrpc_ioctl_init) #define COMPAT_FASTRPC_IOCTL_MMAP_64 \ _IOWR('R', 14, struct compat_fastrpc_ioctl_mmap_64) #define COMPAT_FASTRPC_IOCTL_MUNMAP_64 \ _IOWR('R', 15, struct compat_fastrpc_ioctl_munmap_64) struct compat_remote_buf { compat_uptr_t pv; /* buffer pointer */ Loading Loading @@ -60,11 +64,24 @@ struct compat_fastrpc_ioctl_mmap { compat_uptr_t vaddrout; /* dsps virtual address */ }; struct compat_fastrpc_ioctl_mmap_64 { compat_int_t fd; /* ion fd */ compat_uint_t flags; /* flags for dsp to map with */ compat_u64 vaddrin; /* optional virtual address */ compat_size_t size; /* size */ compat_u64 vaddrout; /* dsps virtual address */ }; struct compat_fastrpc_ioctl_munmap { compat_uptr_t vaddrout; /* address to unmap */ compat_size_t size; /* size */ }; struct compat_fastrpc_ioctl_munmap_64 { compat_u64 vaddrout; /* address to unmap */ compat_size_t size; /* size */ }; struct compat_fastrpc_ioctl_init { compat_uint_t flags; /* one of FASTRPC_INIT_* macros */ compat_uptr_t file; /* pointer to elf file */ Loading Loading @@ -180,6 +197,28 @@ static int compat_get_fastrpc_ioctl_mmap( return err; } static int compat_get_fastrpc_ioctl_mmap_64( struct compat_fastrpc_ioctl_mmap_64 __user *map32, struct fastrpc_ioctl_mmap __user *map) { compat_uint_t u; compat_int_t i; compat_size_t s; compat_u64 p; int err; err = get_user(i, &map32->fd); err |= put_user(i, &map->fd); err |= get_user(u, &map32->flags); err |= put_user(u, &map->flags); err |= get_user(p, &map32->vaddrin); err |= put_user(p, &map->vaddrin); err |= get_user(s, &map32->size); err |= put_user(s, &map->size); return err; } static int compat_put_fastrpc_ioctl_mmap( struct compat_fastrpc_ioctl_mmap __user *map32, struct fastrpc_ioctl_mmap __user *map) Loading @@ -193,6 +232,19 @@ static int compat_put_fastrpc_ioctl_mmap( return err; } static int compat_put_fastrpc_ioctl_mmap_64( struct compat_fastrpc_ioctl_mmap_64 __user *map32, struct fastrpc_ioctl_mmap __user *map) { compat_u64 p; int err; err = get_user(p, &map->vaddrout); err |= put_user(p, &map32->vaddrout); return err; } static int compat_get_fastrpc_ioctl_munmap( struct compat_fastrpc_ioctl_munmap __user *unmap32, struct fastrpc_ioctl_munmap __user *unmap) Loading @@ -209,6 +261,22 @@ static int compat_get_fastrpc_ioctl_munmap( return err; } static int compat_get_fastrpc_ioctl_munmap_64( struct compat_fastrpc_ioctl_munmap_64 __user *unmap32, struct fastrpc_ioctl_munmap __user *unmap) { compat_u64 p; compat_size_t s; int err; err = get_user(p, &unmap32->vaddrout); err |= put_user(p, &unmap->vaddrout); err |= get_user(s, &unmap32->size); err |= put_user(s, &unmap->size); return err; } static int compat_get_fastrpc_ioctl_init( struct compat_fastrpc_ioctl_init __user *init32, struct fastrpc_ioctl_init __user *init) Loading Loading @@ -285,6 +353,27 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd, VERIFY(err, 0 == compat_put_fastrpc_ioctl_mmap(map32, map)); return err; } case COMPAT_FASTRPC_IOCTL_MMAP_64: { struct compat_fastrpc_ioctl_mmap_64 __user *map32; struct fastrpc_ioctl_mmap __user *map; long ret; map32 = compat_ptr(arg); VERIFY(err, NULL != (map = compat_alloc_user_space( sizeof(*map)))); if (err) return -EFAULT; VERIFY(err, 0 == compat_get_fastrpc_ioctl_mmap_64(map32, map)); if (err) return err; ret = filp->f_op->unlocked_ioctl(filp, FASTRPC_IOCTL_MMAP_64, (unsigned long)map); if (ret) return ret; VERIFY(err, 0 == compat_put_fastrpc_ioctl_mmap_64(map32, map)); return err; } case COMPAT_FASTRPC_IOCTL_MUNMAP: { struct compat_fastrpc_ioctl_munmap __user *unmap32; Loading @@ -302,6 +391,23 @@ long compat_fastrpc_device_ioctl(struct file *filp, unsigned int cmd, return filp->f_op->unlocked_ioctl(filp, FASTRPC_IOCTL_MUNMAP, (unsigned long)unmap); } case COMPAT_FASTRPC_IOCTL_MUNMAP_64: { struct compat_fastrpc_ioctl_munmap_64 __user *unmap32; struct fastrpc_ioctl_munmap __user *unmap; unmap32 = compat_ptr(arg); VERIFY(err, NULL != (unmap = compat_alloc_user_space( sizeof(*unmap)))); if (err) return -EFAULT; VERIFY(err, 0 == compat_get_fastrpc_ioctl_munmap_64(unmap32, unmap)); if (err) return err; return filp->f_op->unlocked_ioctl(filp, FASTRPC_IOCTL_MUNMAP_64, (unsigned long)unmap); } case COMPAT_FASTRPC_IOCTL_INIT: { struct compat_fastrpc_ioctl_init __user *init32; Loading
drivers/char/adsprpc_shared.h +15 −1 Original line number Diff line number Diff line /* * Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. * Copyright (c) 2012-2018, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading @@ -19,6 +19,8 @@ #define FASTRPC_IOCTL_INVOKE _IOWR('R', 1, struct fastrpc_ioctl_invoke) #define FASTRPC_IOCTL_MMAP _IOWR('R', 2, struct fastrpc_ioctl_mmap) #define FASTRPC_IOCTL_MUNMAP _IOWR('R', 3, struct fastrpc_ioctl_munmap) #define FASTRPC_IOCTL_MMAP_64 _IOWR('R', 14, struct fastrpc_ioctl_mmap_64) #define FASTRPC_IOCTL_MUNMAP_64 _IOWR('R', 15, struct fastrpc_ioctl_munmap_64) #define FASTRPC_IOCTL_INVOKE_FD _IOWR('R', 4, struct fastrpc_ioctl_invoke_fd) #define FASTRPC_IOCTL_SETMODE _IOWR('R', 5, uint32_t) #define FASTRPC_IOCTL_INIT _IOWR('R', 6, struct fastrpc_ioctl_init) Loading Loading @@ -141,6 +143,10 @@ struct fastrpc_ioctl_munmap { size_t size; /* size */ }; struct fastrpc_ioctl_munmap_64 { uint64_t vaddrout; /* address to unmap */ size_t size; /* size */ }; struct fastrpc_ioctl_mmap { int fd; /* ion fd */ Loading @@ -150,6 +156,14 @@ struct fastrpc_ioctl_mmap { uintptr_t vaddrout; /* dsps virtual address */ }; struct fastrpc_ioctl_mmap_64 { int fd; /* ion fd */ uint32_t flags; /* flags for dsp to map with */ uint64_t vaddrin; /* optional virtual address */ size_t size; /* size */ uint64_t vaddrout; /* dsps virtual address */ }; struct smq_null_invoke { uint64_t ctx; /* invoke caller context */ uint32_t handle; /* handle to invoke */ Loading