[Spice-devel] [PATCH v2 1/6] ppc: Fix endianness handling in initial SPICE connection
Fabiano FidĂȘncio
fabiano at fidencio.org
Fri Apr 10 03:48:51 PDT 2015
On Fri, Apr 10, 2015 at 12:25 PM, Christophe Fergeau
<cfergeau at redhat.com> wrote:
> Ping for series?
Christophe, when we worked on this series (for the first time) Erlon
did some tests on a Power6 machine.
Unfortunately, for obvious reasons, I don't have access to that machine anymore.
I'd go for it. Looks sane. Already looked sane on our first iteration
a few years ago.
>
> On Tue, Feb 10, 2015 at 10:14:59AM +0100, Christophe Fergeau wrote:
>> This commit fixes enough endianness issues that it's possible to
>> connect to a spice-server/qemu running on a big-endian box with a client
>> running on a little-endian machine.
>>
>> I haven't tested more than getting to the bios/bootloader and typing a
>> bit on the keyboard as I did not manage to boot a distro afterwards :(
>>
>> This is based on patches send by Erlon R. Cruz
>> <erlon.cruz at br.flextronics.com>
>> ---
>> server/red_channel.c | 1 +
>> server/reds.c | 62 ++++++++++++++++++++++++++++++++++++++--------------
>> 2 files changed, 46 insertions(+), 17 deletions(-)
>>
>> diff --git a/server/red_channel.c b/server/red_channel.c
>> index a968309..eb2419c 100644
>> --- a/server/red_channel.c
>> +++ b/server/red_channel.c
>> @@ -22,6 +22,7 @@
>> #include <config.h>
>> #endif
>>
>> +#include <glib.h>
>> #include <stdio.h>
>> #include <stdint.h>
>> #include <netinet/in.h>
>> diff --git a/server/reds.c b/server/reds.c
>> index f61d5d3..6d70b68 100644
>> --- a/server/reds.c
>> +++ b/server/reds.c
>> @@ -1354,13 +1354,14 @@ static int reds_send_link_ack(RedLinkInfo *link)
>> BUF_MEM *bmBuf;
>> BIO *bio = NULL;
>> int ret = FALSE;
>> + size_t hdr_size;
>>
>> header.magic = SPICE_MAGIC;
>> - header.size = sizeof(ack);
>> - header.major_version = SPICE_VERSION_MAJOR;
>> - header.minor_version = SPICE_VERSION_MINOR;
>> + hdr_size = sizeof(ack);
>> + header.major_version = GUINT32_TO_LE(SPICE_VERSION_MAJOR);
>> + header.minor_version = GUINT32_TO_LE(SPICE_VERSION_MINOR);
>>
>> - ack.error = SPICE_LINK_ERR_OK;
>> + ack.error = GUINT32_TO_LE(SPICE_LINK_ERR_OK);
>>
>> channel = reds_find_channel(link->link_mess->channel_type,
>> link->link_mess->channel_id);
>> @@ -1373,10 +1374,12 @@ static int reds_send_link_ack(RedLinkInfo *link)
>> reds_channel_init_auth_caps(link, channel); /* make sure common caps are set */
>>
>> channel_caps = &channel->local_caps;
>> - ack.num_common_caps = channel_caps->num_common_caps;
>> - ack.num_channel_caps = channel_caps->num_caps;
>> - header.size += (ack.num_common_caps + ack.num_channel_caps) * sizeof(uint32_t);
>> - ack.caps_offset = sizeof(SpiceLinkReply);
>> + ack.num_common_caps = GUINT32_TO_LE(channel_caps->num_common_caps);
>> + ack.num_channel_caps = GUINT32_TO_LE(channel_caps->num_caps);
>> + hdr_size += channel_caps->num_common_caps * sizeof(uint32_t);
>> + hdr_size += channel_caps->num_caps * sizeof(uint32_t);
>> + header.size = GUINT32_TO_LE(hdr_size);
>> + ack.caps_offset = GUINT32_TO_LE(sizeof(SpiceLinkReply));
>> if (!sasl_enabled
>> || !red_link_info_test_capability(link, SPICE_COMMON_CAP_AUTH_SASL)) {
>> if (!(link->tiTicketing.rsa = RSA_new())) {
>> @@ -1421,10 +1424,16 @@ static int reds_send_link_ack(RedLinkInfo *link)
>> goto end;
>> if (!reds_stream_write_all(link->stream, &ack, sizeof(ack)))
>> goto end;
>> - if (!reds_stream_write_all(link->stream, channel_caps->common_caps, channel_caps->num_common_caps * sizeof(uint32_t)))
>> - goto end;
>> - if (!reds_stream_write_all(link->stream, channel_caps->caps, channel_caps->num_caps * sizeof(uint32_t)))
>> - goto end;
>> + for (unsigned int i = 0; i < channel_caps->num_common_caps; i++) {
>> + guint32 cap = GUINT32_TO_LE(channel_caps->common_caps[i]);
>> + if (!reds_stream_write_all(link->stream, &cap, sizeof(cap)))
>> + goto end;
>> + }
>> + for (unsigned int i = 0; i < channel_caps->num_caps; i++) {
>> + guint32 cap = GUINT32_TO_LE(channel_caps->caps[i]);
>> + if (!reds_stream_write_all(link->stream, &cap, sizeof(cap)))
>> + goto end;
>> + }
>>
>> ret = TRUE;
>>
>> @@ -1440,11 +1449,11 @@ static bool reds_send_link_error(RedLinkInfo *link, uint32_t error)
>> SpiceLinkReply reply;
>>
>> header.magic = SPICE_MAGIC;
>> - header.size = sizeof(reply);
>> - header.major_version = SPICE_VERSION_MAJOR;
>> - header.minor_version = SPICE_VERSION_MINOR;
>> + header.size = GUINT32_TO_LE(sizeof(reply));
>> + header.major_version = GUINT32_TO_LE(SPICE_VERSION_MAJOR);
>> + header.minor_version = GUINT32_TO_LE(SPICE_VERSION_MINOR);
>> memset(&reply, 0, sizeof(reply));
>> - reply.error = error;
>> + reply.error = GUINT32_TO_LE(error);
>> return reds_stream_write_all(link->stream, &header, sizeof(header)) && reds_stream_write_all(link->stream, &reply,
>> sizeof(reply));
>> }
>> @@ -1467,6 +1476,7 @@ static void reds_info_new_channel(RedLinkInfo *link, int connection_id)
>>
>> static void reds_send_link_result(RedLinkInfo *link, uint32_t error)
>> {
>> + error = GUINT32_TO_LE(error);
>> reds_stream_write_all(link->stream, &error, sizeof(error));
>> }
>>
>> @@ -2051,6 +2061,7 @@ static void reds_handle_auth_mechanism(void *opaque)
>>
>> spice_info("Auth method: %d", link->auth_mechanism.auth_mechanism);
>>
>> + link->auth_mechanism.auth_mechanism = GUINT32_FROM_LE(link->auth_mechanism.auth_mechanism);
>> if (link->auth_mechanism.auth_mechanism == SPICE_COMMON_CAP_AUTH_SPICE
>> && !sasl_enabled
>> ) {
>> @@ -2082,8 +2093,18 @@ static void reds_handle_read_link_done(void *opaque)
>> {
>> RedLinkInfo *link = (RedLinkInfo *)opaque;
>> SpiceLinkMess *link_mess = link->link_mess;
>> - uint32_t num_caps = link_mess->num_common_caps + link_mess->num_channel_caps;
>> + uint32_t num_caps;
>> + uint32_t *caps;
>> int auth_selection;
>> + unsigned int i;
>> +
>> + link_mess->caps_offset = GUINT32_FROM_LE(link_mess->caps_offset);
>> + link_mess->connection_id = GUINT32_FROM_LE(link_mess->connection_id);
>> + link_mess->num_channel_caps = GUINT32_FROM_LE(link_mess->num_channel_caps);
>> + link_mess->num_common_caps = GUINT32_FROM_LE(link_mess->num_common_caps);
>> +
>> + num_caps = link_mess->num_common_caps + link_mess->num_channel_caps;
>> + caps = (uint32_t *)((uint8_t *)link_mess + link_mess->caps_offset);
>>
>> if (num_caps && (num_caps * sizeof(uint32_t) + link_mess->caps_offset >
>> link->link_header.size ||
>> @@ -2093,6 +2114,9 @@ static void reds_handle_read_link_done(void *opaque)
>> return;
>> }
>>
>> + for(i = 0; i < num_caps;i++)
>> + caps[i] = GUINT32_FROM_LE(caps[i]);
>> +
>> auth_selection = red_link_info_test_capability(link,
>> SPICE_COMMON_CAP_PROTOCOL_AUTH_SELECTION);
>>
>> @@ -2149,6 +2173,10 @@ static void reds_handle_read_header_done(void *opaque)
>> RedLinkInfo *link = (RedLinkInfo *)opaque;
>> SpiceLinkHeader *header = &link->link_header;
>>
>> + header->major_version = GUINT32_FROM_LE(header->major_version);
>> + header->minor_version = GUINT32_FROM_LE(header->minor_version);
>> + header->size = GUINT32_FROM_LE(header->size);
>> +
>> if (header->magic != SPICE_MAGIC) {
>> reds_send_link_error(link, SPICE_LINK_ERR_INVALID_MAGIC);
>> reds_link_free(link);
>> --
>> 2.1.0
>>
>> _______________________________________________
>> Spice-devel mailing list
>> Spice-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
Best Regards,
--
Fabiano FidĂȘncio
More information about the Spice-devel
mailing list