mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-05 16:37:50 +00:00
staging: vc04_services: Add vchi_queue_user_message function
The vchi_msg_queue function which is used by other drivers to queue a message is difficult to understand and overly generic. Add a new function which is a wrapper on top of vchi_msg_queue that is specifically for queuing a message located in user address space. int vchi_queue_user_message(VCHI_SERVICE_HANDLE_T handle, void __user *data, unsigned int size) Signed-off-by: Michael Zoran <mzoran@crowfest.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
fbcaed9e32
commit
619969770f
2 changed files with 40 additions and 0 deletions
|
@ -233,6 +233,12 @@ vchi_queue_kernel_message(VCHI_SERVICE_HANDLE_T handle,
|
||||||
void *data,
|
void *data,
|
||||||
unsigned int size);
|
unsigned int size);
|
||||||
|
|
||||||
|
/* Routine to send a message from user memory across a service */
|
||||||
|
extern int
|
||||||
|
vchi_queue_user_message(VCHI_SERVICE_HANDLE_T handle,
|
||||||
|
void __user *data,
|
||||||
|
unsigned int size);
|
||||||
|
|
||||||
// Routine to receive a msg from a service
|
// Routine to receive a msg from a service
|
||||||
// Dequeue is equivalent to hold, copy into client buffer, release
|
// Dequeue is equivalent to hold, copy into client buffer, release
|
||||||
extern int32_t vchi_msg_dequeue( VCHI_SERVICE_HANDLE_T handle,
|
extern int32_t vchi_msg_dequeue( VCHI_SERVICE_HANDLE_T handle,
|
||||||
|
|
|
@ -210,6 +210,40 @@ vchi_queue_kernel_message(VCHI_SERVICE_HANDLE_T handle,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(vchi_queue_kernel_message);
|
EXPORT_SYMBOL(vchi_queue_kernel_message);
|
||||||
|
|
||||||
|
struct vchi_queue_user_message_context {
|
||||||
|
void __user *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
static ssize_t
|
||||||
|
vchi_queue_user_message_callback(void *context,
|
||||||
|
void *dest,
|
||||||
|
size_t offset,
|
||||||
|
size_t maxsize)
|
||||||
|
{
|
||||||
|
struct vchi_queue_user_message_context *copycontext = context;
|
||||||
|
|
||||||
|
if (copy_from_user(dest, copycontext->data + offset, maxsize))
|
||||||
|
return -EFAULT;
|
||||||
|
|
||||||
|
return maxsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vchi_queue_user_message(VCHI_SERVICE_HANDLE_T handle,
|
||||||
|
void __user *data,
|
||||||
|
unsigned int size)
|
||||||
|
{
|
||||||
|
struct vchi_queue_user_message_context copycontext = {
|
||||||
|
.data = data
|
||||||
|
};
|
||||||
|
|
||||||
|
return vchi_msg_queue(handle,
|
||||||
|
vchi_queue_user_message_callback,
|
||||||
|
©context,
|
||||||
|
size);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(vchi_queue_user_message);
|
||||||
|
|
||||||
/***********************************************************
|
/***********************************************************
|
||||||
* Name: vchi_bulk_queue_receive
|
* Name: vchi_bulk_queue_receive
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue