-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a compat_ioctl to the ion driver Signed-off-by: Rom Lemarchand <romlem@google.com> [jstultz: modified patch to apply to staging directory] Signed-off-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
- Loading branch information
Rom Lemarchand
authored and
Greg Kroah-Hartman
committed
Dec 14, 2013
1 parent
b88fa73
commit 827c849
Showing
4 changed files
with
207 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,6 @@ | ||
obj-$(CONFIG_ION) += ion.o ion_heap.o ion_page_pool.o ion_system_heap.o \ | ||
ion_carveout_heap.o ion_chunk_heap.o ion_cma_heap.o | ||
ifdef CONFIG_COMPAT | ||
obj-$(CONFIG_ION) += compat_ion.o | ||
endif | ||
obj-$(CONFIG_ION_TEGRA) += tegra/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
/* | ||
* drivers/staging/android/ion/compat_ion.c | ||
* | ||
* Copyright (C) 2013 Google, 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. | ||
* | ||
*/ | ||
|
||
#include <linux/compat.h> | ||
#include <linux/fs.h> | ||
#include <linux/uaccess.h> | ||
|
||
#include "ion.h" | ||
#include "compat_ion.h" | ||
|
||
/* See drivers/staging/android/ion/ion.h for the definition of these structs */ | ||
struct compat_ion_allocation_data { | ||
compat_size_t len; | ||
compat_size_t align; | ||
compat_uint_t heap_id_mask; | ||
compat_uint_t flags; | ||
compat_int_t handle; | ||
}; | ||
|
||
struct compat_ion_custom_data { | ||
compat_uint_t cmd; | ||
compat_ulong_t arg; | ||
}; | ||
|
||
static int compat_get_ion_allocation_data( | ||
struct compat_ion_allocation_data __user *data32, | ||
struct ion_allocation_data __user *data) | ||
{ | ||
compat_size_t s; | ||
compat_uint_t u; | ||
compat_int_t i; | ||
int err; | ||
|
||
err = get_user(s, &data32->len); | ||
err |= put_user(s, &data->len); | ||
err |= get_user(s, &data32->align); | ||
err |= put_user(s, &data->align); | ||
err |= get_user(u, &data32->heap_id_mask); | ||
err |= put_user(u, &data->heap_id_mask); | ||
err |= get_user(u, &data32->flags); | ||
err |= put_user(u, &data->flags); | ||
err |= get_user(i, &data32->handle); | ||
err |= put_user(i, &data->handle); | ||
|
||
return err; | ||
} | ||
|
||
static int compat_put_ion_allocation_data( | ||
struct compat_ion_allocation_data __user *data32, | ||
struct ion_allocation_data __user *data) | ||
{ | ||
compat_size_t s; | ||
compat_uint_t u; | ||
compat_int_t i; | ||
int err; | ||
|
||
err = get_user(s, &data->len); | ||
err |= put_user(s, &data32->len); | ||
err |= get_user(s, &data->align); | ||
err |= put_user(s, &data32->align); | ||
err |= get_user(u, &data->heap_id_mask); | ||
err |= put_user(u, &data32->heap_id_mask); | ||
err |= get_user(u, &data->flags); | ||
err |= put_user(u, &data32->flags); | ||
err |= get_user(i, &data->handle); | ||
err |= put_user(i, &data32->handle); | ||
|
||
return err; | ||
} | ||
|
||
static int compat_get_ion_custom_data( | ||
struct compat_ion_custom_data __user *data32, | ||
struct ion_custom_data __user *data) | ||
{ | ||
compat_uint_t cmd; | ||
compat_ulong_t arg; | ||
int err; | ||
|
||
err = get_user(cmd, &data32->cmd); | ||
err |= put_user(cmd, &data->cmd); | ||
err |= get_user(arg, &data32->arg); | ||
err |= put_user(arg, &data->arg); | ||
|
||
return err; | ||
}; | ||
|
||
long compat_ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
{ | ||
long ret; | ||
|
||
if (!filp->f_op || !filp->f_op->unlocked_ioctl) | ||
return -ENOTTY; | ||
|
||
switch (cmd) { | ||
case ION_IOC_ALLOC: | ||
{ | ||
struct compat_ion_allocation_data __user *data32; | ||
struct ion_allocation_data __user *data; | ||
int err; | ||
|
||
data32 = compat_ptr(arg); | ||
data = compat_alloc_user_space(sizeof(*data)); | ||
if (data == NULL) | ||
return -EFAULT; | ||
|
||
err = compat_get_ion_allocation_data(data32, data); | ||
if (err) | ||
return err; | ||
|
||
ret = filp->f_op->unlocked_ioctl(filp, cmd, | ||
(unsigned long)data); | ||
err = compat_put_ion_allocation_data(data32, data); | ||
return ret ? ret : err; | ||
} | ||
case ION_IOC_FREE: | ||
{ | ||
struct compat_ion_allocation_data __user *data32; | ||
struct ion_allocation_data __user *data; | ||
int err; | ||
|
||
data32 = compat_ptr(arg); | ||
data = compat_alloc_user_space(sizeof(*data)); | ||
if (data == NULL) | ||
return -EFAULT; | ||
|
||
err = compat_get_ion_allocation_data(data32, data); | ||
if (err) | ||
return err; | ||
|
||
return filp->f_op->unlocked_ioctl(filp, cmd, | ||
(unsigned long)data); | ||
} | ||
case ION_IOC_CUSTOM: { | ||
struct compat_ion_custom_data __user *data32; | ||
struct ion_custom_data __user *data; | ||
int err; | ||
|
||
data32 = compat_ptr(arg); | ||
data = compat_alloc_user_space(sizeof(*data)); | ||
if (data == NULL) | ||
return -EFAULT; | ||
|
||
err = compat_get_ion_custom_data(data32, data); | ||
if (err) | ||
return err; | ||
|
||
return filp->f_op->unlocked_ioctl(filp, cmd, | ||
(unsigned long)data); | ||
} | ||
case ION_IOC_SHARE: | ||
case ION_IOC_MAP: | ||
case ION_IOC_IMPORT: | ||
case ION_IOC_SYNC: | ||
return filp->f_op->unlocked_ioctl(filp, cmd, | ||
(unsigned long)compat_ptr(arg)); | ||
default: | ||
return -ENOIOCTLCMD; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* | ||
* drivers/staging/android/ion/compat_ion.h | ||
* | ||
* Copyright (C) 2013 Google, 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_COMPAT_ION_H | ||
#define _LINUX_COMPAT_ION_H | ||
|
||
#if IS_ENABLED(CONFIG_COMPAT) | ||
|
||
long compat_ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); | ||
|
||
#else | ||
|
||
#define compat_ion_ioctl NULL | ||
|
||
#endif /* CONFIG_COMPAT */ | ||
#endif /* _LINUX_COMPAT_ION_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters