Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -400,7 +400,15 @@ EXPORT_SYMBOL(vchi_msg_queuev);
 ***********************************************************/
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);

	return 0;
@@ -445,8 +453,16 @@ int32_t vchi_msg_hold(VCHI_SERVICE_HANDLE_T handle,
	*data = header->data;
	*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 =
		(struct opaque_vchi_service_t *)service->handle;
		(struct opaque_vchi_service_t *)(long)service->handle;
	message_handle->message = header;

	return 0;