Commit 8e8e2e36 authored by Michael Zoran's avatar Michael Zoran Committed by Greg Kroah-Hartman

staging: vc04_services: Handle conversion from VCHIQ_SERVICE_HANDLE_T to VCHI_SERVICE_HANDLE_T

A VCHIQ_SERVICE_HANDLE_T which is an int is stuffed into a
VCHI_SERVICE_HANDLE_T which is a pointer, passed around, then
converted back to a VCHIQ_SERVICE_HANDLE_T. Since the data is
always actually a VCHIQ_SERVICE_HANDLE_T(int), never actually a
pointer, it is safe to simply cast the two back in forth.

Note that pointers are never stuffed into an int.
Signed-off-by: default avatarMichael Zoran <mzoran@crowfest.net>
Reviewed-by: default avatarEric Anholt <eric@anholt.net>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 24a4262a
...@@ -400,7 +400,15 @@ EXPORT_SYMBOL(vchi_msg_queuev); ...@@ -400,7 +400,15 @@ EXPORT_SYMBOL(vchi_msg_queuev);
***********************************************************/ ***********************************************************/
int32_t vchi_held_msg_release(VCHI_HELD_MSG_T *message) int32_t vchi_held_msg_release(VCHI_HELD_MSG_T *message)
{ {
vchiq_release_message((VCHIQ_SERVICE_HANDLE_T)message->service, /*
* Convert the service field pointer back to an
* VCHIQ_SERVICE_HANDLE_T which is an int.
* This pointer is opaque to everything except
* vchi_msg_hold which simply upcasted the int
* to a pointer.
*/
vchiq_release_message((VCHIQ_SERVICE_HANDLE_T)(long)message->service,
(VCHIQ_HEADER_T *)message->message); (VCHIQ_HEADER_T *)message->message);
return 0; return 0;
...@@ -445,8 +453,16 @@ int32_t vchi_msg_hold(VCHI_SERVICE_HANDLE_T handle, ...@@ -445,8 +453,16 @@ int32_t vchi_msg_hold(VCHI_SERVICE_HANDLE_T handle,
*data = header->data; *data = header->data;
*msg_size = header->size; *msg_size = header->size;
/*
* upcast the VCHIQ_SERVICE_HANDLE_T which is an int
* to a pointer and stuff it in the held message.
* This pointer is opaque to everything except
* vchi_held_msg_release which simply downcasts it back
* to an int.
*/
message_handle->service = message_handle->service =
(struct opaque_vchi_service_t *)service->handle; (struct opaque_vchi_service_t *)(long)service->handle;
message_handle->message = header; message_handle->message = header;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment