Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-09 Thread David Gibson
On Fri, Oct 07, 2016 at 10:39:09AM +0100, Peter Maydell wrote:
> On 7 October 2016 at 00:55, David Gibson  wrote:
> > It is an improvement.  But I still think if we're relying on the
> > ill-defined "target endianness" we're already doing something wrong.
> 
> Target endianness is not ill-defined. It's a clear and constant
> property of the bus the CPU is plugged into.

It's certainly not clear to me.  How are you defining it?

Preferably in terms of visible effects, rather than something that
requires snooping into pieces of hardware that aren't actually
modelled in qemu...

> It is a bit weird
> to rely on it in the test code, which is why only the virtio
> tests currently use qtest_big_endian().
> 
> thanks
> -- PMM
> 

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: PGP signature


Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-09 Thread David Gibson
On Fri, Oct 07, 2016 at 12:10:07PM +0200, Greg Kurz wrote:
> On Fri, 7 Oct 2016 10:39:09 +0100
> Peter Maydell  wrote:
> 
> > On 7 October 2016 at 00:55, David Gibson  
> > wrote:
> > > It is an improvement.  But I still think if we're relying on the
> > > ill-defined "target endianness" we're already doing something wrong.  
> > 
> > Target endianness is not ill-defined. It's a clear and constant
> > property of the bus the CPU is plugged into. It is a bit weird
> > to rely on it in the test code, which is why only the virtio
> > tests currently use qtest_big_endian().
> > 
> 
> And to discourage anyone to use it in a test program, maybe it
> could even be renamed virtio_big_endian() and put in a virtio
> specific header file ? This is how it is done in QEMU.

I think that's a good idea.

-- 
David Gibson| I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson


signature.asc
Description: PGP signature


Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-07 Thread Greg Kurz
On Fri, 7 Oct 2016 10:39:09 +0100
Peter Maydell  wrote:

> On 7 October 2016 at 00:55, David Gibson  wrote:
> > It is an improvement.  But I still think if we're relying on the
> > ill-defined "target endianness" we're already doing something wrong.  
> 
> Target endianness is not ill-defined. It's a clear and constant
> property of the bus the CPU is plugged into. It is a bit weird
> to rely on it in the test code, which is why only the virtio
> tests currently use qtest_big_endian().
> 

And to discourage anyone to use it in a test program, maybe it
could even be renamed virtio_big_endian() and put in a virtio
specific header file ? This is how it is done in QEMU.

> thanks
> -- PMM

Cheers.

--
Greg



Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-07 Thread Greg Kurz
On Fri, 7 Oct 2016 10:36:58 +0100
Peter Maydell  wrote:

> On 7 October 2016 at 08:31, Greg Kurz  wrote:
> > On Fri, 7 Oct 2016 09:10:14 +0200
> > Laurent Vivier  wrote:
> >  
> >> On 06/10/2016 22:45, Peter Maydell wrote:  
> >> > On 6 October 2016 at 11:56, Laurent Vivier  wrote:  
> >> >> +/* ask endianness of the target */
> >> >> +
> >> >> +qtest_sendf(s, "endianness\n");
> >> >> +args = qtest_rsp(s, 1);
> >> >> +g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") 
> >> >> == 0);
> >> >> +s->big_endian = strcmp(args[1], "big") == 0;
> >> >> +g_strfreev(args);  
> >> >
> >> > This would be better in its own utility function, I think.  
> >>
> >> Yes, I agree, but my wondering was how to name it :P ,
> >> qtest_big_endian() and target_big_endian() are already in use, and as it
> >> is a 6 lines function, used once, I guessed we could inline it here.
> >>  
> >
> > This is TARGET_WORDS_BIGENDIAN which is constant for a single QEMU
> > run... why moving it to a function ? Unless there are plans to
> > have dynamic target endianness in QEMU, I guess it makes more
> > sense to open code as you did.  
> 
> I thought it would be better in its own function simply
> because "query the QEMU process for the value of
> TARGET_WORDS_BIGENDIAN" is a simple well defined and
> self contained operation, which isn't very tightly
> coupled to the init-the-connection stuff that qtest_init()
> does. qtest_init() is already a fairly long function and
> so I think it makes for more maintainable code to have
> a (static, local) qtest_query_target_endianness() function
> rather than inlining it.
> 
> thanks
> -- PMM

It's a matter of taste, but your point makes sense.

I'd say let the maintainer decide, but...

$ ./scripts/get_maintainer.pl -f tests/libqtest.c
get_maintainer.pl: No maintainers found, printing recent contributors.
get_maintainer.pl: Do not blindly cc: them on patches!  Use common sense.

Cheers.

--
Greg



Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-07 Thread Peter Maydell
On 7 October 2016 at 00:55, David Gibson  wrote:
> It is an improvement.  But I still think if we're relying on the
> ill-defined "target endianness" we're already doing something wrong.

Target endianness is not ill-defined. It's a clear and constant
property of the bus the CPU is plugged into. It is a bit weird
to rely on it in the test code, which is why only the virtio
tests currently use qtest_big_endian().

thanks
-- PMM



Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-07 Thread Peter Maydell
On 7 October 2016 at 08:31, Greg Kurz  wrote:
> On Fri, 7 Oct 2016 09:10:14 +0200
> Laurent Vivier  wrote:
>
>> On 06/10/2016 22:45, Peter Maydell wrote:
>> > On 6 October 2016 at 11:56, Laurent Vivier  wrote:
>> >> +/* ask endianness of the target */
>> >> +
>> >> +qtest_sendf(s, "endianness\n");
>> >> +args = qtest_rsp(s, 1);
>> >> +g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 
>> >> 0);
>> >> +s->big_endian = strcmp(args[1], "big") == 0;
>> >> +g_strfreev(args);
>> >
>> > This would be better in its own utility function, I think.
>>
>> Yes, I agree, but my wondering was how to name it :P ,
>> qtest_big_endian() and target_big_endian() are already in use, and as it
>> is a 6 lines function, used once, I guessed we could inline it here.
>>
>
> This is TARGET_WORDS_BIGENDIAN which is constant for a single QEMU
> run... why moving it to a function ? Unless there are plans to
> have dynamic target endianness in QEMU, I guess it makes more
> sense to open code as you did.

I thought it would be better in its own function simply
because "query the QEMU process for the value of
TARGET_WORDS_BIGENDIAN" is a simple well defined and
self contained operation, which isn't very tightly
coupled to the init-the-connection stuff that qtest_init()
does. qtest_init() is already a fairly long function and
so I think it makes for more maintainable code to have
a (static, local) qtest_query_target_endianness() function
rather than inlining it.

thanks
-- PMM



Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-07 Thread Greg Kurz
On Fri, 7 Oct 2016 09:10:14 +0200
Laurent Vivier  wrote:

> On 06/10/2016 22:45, Peter Maydell wrote:
> > On 6 October 2016 at 11:56, Laurent Vivier  wrote:  
> >> The target endianness is not deduced anymore from
> >> the architecture name but asked directly to the guest,
> >> using a new qtest command: "endianness". As it can't
> >> change (this is the value of TARGET_WORDS_BIGENDIAN),
> >> we store it to not have to ask every time we want to
> >> know if we have to byte-swap a value.
> >>
> >> Signed-off-by: Laurent Vivier 
> >> CC: Greg Kurz 
> >> CC: David Gibson 
> >> CC: Peter Maydell 
> >> ---
> >> Note: this patch can be seen as a v2 of
> >> "qtest: evaluate endianness of the target in qtest_init()"
> >> from the patch series "tests: enable virtio tests on SPAPR"
> >> in which I have added the idea from Peter to ask the endianness
> >> directly to the guest using a new qtest command.
> >>
> >>  qtest.c   |   7 ++
> >>  tests/libqos/virtio-pci.c |   2 +-
> >>  tests/libqtest.c  | 224 
> >> --
> >>  tests/libqtest.h  |  16 +++-
> >>  tests/virtio-blk-test.c   |   2 +-
> >>  5 files changed, 118 insertions(+), 133 deletions(-)
> >>
> >> diff --git a/qtest.c b/qtest.c
> >> index 22482cc..b53b39c 100644
> >> --- a/qtest.c
> >> +++ b/qtest.c
> >> @@ -537,6 +537,13 @@ static void qtest_process_command(CharDriverState 
> >> *chr, gchar **words)
> >>
> >>  qtest_send_prefix(chr);
> >>  qtest_send(chr, "OK\n");
> >> +} else if (strcmp(words[0], "endianness") == 0) {
> >> +qtest_send_prefix(chr);
> >> +#if defined(TARGET_WORDS_BIGENDIAN)
> >> +qtest_sendf(chr, "OK big\n");
> >> +#else
> >> +qtest_sendf(chr, "OK little\n");
> >> +#endif
> >>  #ifdef TARGET_PPC64
> >>  } else if (strcmp(words[0], "rtas") == 0) {
> >>  uint64_t res, args, ret;
> >> diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c
> >> index 18b92b9..6e005c1 100644
> >> --- a/tests/libqos/virtio-pci.c
> >> +++ b/tests/libqos/virtio-pci.c
> >> @@ -86,7 +86,7 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice 
> >> *d, uint64_t addr)
> >>  int i;
> >>  uint64_t u64 = 0;
> >>
> >> -if (qtest_big_endian()) {
> >> +if (target_big_endian()) {
> >>  for (i = 0; i < 8; ++i) {
> >>  u64 |= (uint64_t)qpci_io_readb(dev->pdev,
> >>  (void *)(uintptr_t)addr + i) << (7 - i) * 
> >> 8;  
> > 
> > Why rename the function? We're only changing its
> > implementation.  
> 
> Because in libqtest.c, qtest_() functions take always a QTestState
> argument, and then in libqtest.h, we have an inline like "inline static
> (...) { qtest_(global_qtest ...) }".
> 
> >> diff --git a/tests/libqtest.c b/tests/libqtest.c
> >> index 6f6bdf1..27cf6b1 100644
> >> --- a/tests/libqtest.c
> >> +++ b/tests/libqtest.c
> >> @@ -37,6 +37,7 @@ struct QTestState
> >>  bool irq_level[MAX_IRQ];
> >>  GString *rx;
> >>  pid_t qemu_pid;  /* our child QEMU process */
> >> +bool big_endian;
> >>  };
> >>
> >>  static GHookList abrt_hooks;
> >> @@ -146,89 +147,6 @@ void qtest_add_abrt_handler(GHookFunc fn, const void 
> >> *data)
> >>  g_hook_prepend(&abrt_hooks, hook);
> >>  }
> >>
> >> -QTestState *qtest_init(const char *extra_args)
> >> -{
> >> -QTestState *s;
> >> -int sock, qmpsock, i;
> >> -gchar *socket_path;
> >> -gchar *qmp_socket_path;
> >> -gchar *command;
> >> -const char *qemu_binary;
> >> -
> >> -qemu_binary = getenv("QTEST_QEMU_BINARY");
> >> -g_assert(qemu_binary != NULL);  
> > 
> > This diff arrangement makes the patch a bit hard to read;
> > what meant that the functions had to be moved around?  
> 
> Yes, I know. I move this function after qtest_sendf() and qtest_rsp() to
> not have to declare them before. There are no circular dependencies, so
> we can.
> 
> >   
> >> +/* ask endianness of the target */
> >> +
> >> +qtest_sendf(s, "endianness\n");
> >> +args = qtest_rsp(s, 1);
> >> +g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 
> >> 0);
> >> +s->big_endian = strcmp(args[1], "big") == 0;
> >> +g_strfreev(args);  
> > 
> > This would be better in its own utility function, I think.  
> 
> Yes, I agree, but my wondering was how to name it :P ,
> qtest_big_endian() and target_big_endian() are already in use, and as it
> is a 6 lines function, used once, I guessed we could inline it here.
> 

This is TARGET_WORDS_BIGENDIAN which is constant for a single QEMU
run... why moving it to a function ? Unless there are plans to
have dynamic target endianness in QEMU, I guess it makes more
sense to open code as you did.

Cheers.

--
Greg

> Thanks,
> Laurent



Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-07 Thread Greg Kurz
On Fri, 7 Oct 2016 10:55:29 +1100
David Gibson  wrote:

> On Thu, Oct 06, 2016 at 10:46:22PM +0200, Greg Kurz wrote:
> > On Thu,  6 Oct 2016 20:56:58 +0200
> > Laurent Vivier  wrote:
> >   
> > > The target endianness is not deduced anymore from
> > > the architecture name but asked directly to the guest,
> > > using a new qtest command: "endianness". As it can't
> > > change (this is the value of TARGET_WORDS_BIGENDIAN),
> > > we store it to not have to ask every time we want to
> > > know if we have to byte-swap a value.
> > > 
> > > Signed-off-by: Laurent Vivier 
> > > CC: Greg Kurz 
> > > CC: David Gibson 
> > > CC: Peter Maydell 
> > > ---
> > > Note: this patch can be seen as a v2 of
> > > "qtest: evaluate endianness of the target in qtest_init()"
> > > from the patch series "tests: enable virtio tests on SPAPR"
> > > in which I have added the idea from Peter to ask the endianness
> > > directly to the guest using a new qtest command.
> > >   
> > 
> > This is definitely an improvement indeed.
> > 
> > Reviewed-by: Greg Kurz   
> 
> It is an improvement.  But I still think if we're relying on the
> ill-defined "target endianness" we're already doing something wrong.
> 

Just to be sure, you're talking about the qtest case only or about the
use of TARGET_WORDS_BIGENDIAN in QEMU itself ?

> >   
> > >  qtest.c   |   7 ++
> > >  tests/libqos/virtio-pci.c |   2 +-
> > >  tests/libqtest.c  | 224 
> > > --
> > >  tests/libqtest.h  |  16 +++-
> > >  tests/virtio-blk-test.c   |   2 +-
> > >  5 files changed, 118 insertions(+), 133 deletions(-)
> > > 
> > > diff --git a/qtest.c b/qtest.c
> > > index 22482cc..b53b39c 100644
> > > --- a/qtest.c
> > > +++ b/qtest.c
> > > @@ -537,6 +537,13 @@ static void qtest_process_command(CharDriverState 
> > > *chr, gchar **words)
> > >  
> > >  qtest_send_prefix(chr);
> > >  qtest_send(chr, "OK\n");
> > > +} else if (strcmp(words[0], "endianness") == 0) {
> > > +qtest_send_prefix(chr);
> > > +#if defined(TARGET_WORDS_BIGENDIAN)
> > > +qtest_sendf(chr, "OK big\n");
> > > +#else
> > > +qtest_sendf(chr, "OK little\n");
> > > +#endif
> > >  #ifdef TARGET_PPC64
> > >  } else if (strcmp(words[0], "rtas") == 0) {
> > >  uint64_t res, args, ret;
> > > diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c
> > > index 18b92b9..6e005c1 100644
> > > --- a/tests/libqos/virtio-pci.c
> > > +++ b/tests/libqos/virtio-pci.c
> > > @@ -86,7 +86,7 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice 
> > > *d, uint64_t addr)
> > >  int i;
> > >  uint64_t u64 = 0;
> > >  
> > > -if (qtest_big_endian()) {
> > > +if (target_big_endian()) {
> > >  for (i = 0; i < 8; ++i) {
> > >  u64 |= (uint64_t)qpci_io_readb(dev->pdev,
> > >  (void *)(uintptr_t)addr + i) << (7 - i) 
> > > * 8;
> > > diff --git a/tests/libqtest.c b/tests/libqtest.c
> > > index 6f6bdf1..27cf6b1 100644
> > > --- a/tests/libqtest.c
> > > +++ b/tests/libqtest.c
> > > @@ -37,6 +37,7 @@ struct QTestState
> > >  bool irq_level[MAX_IRQ];
> > >  GString *rx;
> > >  pid_t qemu_pid;  /* our child QEMU process */
> > > +bool big_endian;
> > >  };
> > >  
> > >  static GHookList abrt_hooks;
> > > @@ -146,89 +147,6 @@ void qtest_add_abrt_handler(GHookFunc fn, const void 
> > > *data)
> > >  g_hook_prepend(&abrt_hooks, hook);
> > >  }
> > >  
> > > -QTestState *qtest_init(const char *extra_args)
> > > -{
> > > -QTestState *s;
> > > -int sock, qmpsock, i;
> > > -gchar *socket_path;
> > > -gchar *qmp_socket_path;
> > > -gchar *command;
> > > -const char *qemu_binary;
> > > -
> > > -qemu_binary = getenv("QTEST_QEMU_BINARY");
> > > -g_assert(qemu_binary != NULL);
> > > -
> > > -s = g_malloc(sizeof(*s));
> > > -
> > > -socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
> > > -qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
> > > -
> > > -sock = init_socket(socket_path);
> > > -qmpsock = init_socket(qmp_socket_path);
> > > -
> > > -qtest_add_abrt_handler(kill_qemu_hook_func, s);
> > > -
> > > -s->qemu_pid = fork();
> > > -if (s->qemu_pid == 0) {
> > > -setenv("QEMU_AUDIO_DRV", "none", true);
> > > -command = g_strdup_printf("exec %s "
> > > -  "-qtest unix:%s,nowait "
> > > -  "-qtest-log %s "
> > > -  "-qmp unix:%s,nowait "
> > > -  "-machine accel=qtest "
> > > -  "-display none "
> > > -  "%s", qemu_binary, socket_path,
> > > -  getenv("QTEST_LOG") ? "/dev/fd/2" : 
> > > "/dev/null",
> > > -  qmp_socket_path,
> > > -  extra_

Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-07 Thread Laurent Vivier


On 06/10/2016 22:45, Peter Maydell wrote:
> On 6 October 2016 at 11:56, Laurent Vivier  wrote:
>> The target endianness is not deduced anymore from
>> the architecture name but asked directly to the guest,
>> using a new qtest command: "endianness". As it can't
>> change (this is the value of TARGET_WORDS_BIGENDIAN),
>> we store it to not have to ask every time we want to
>> know if we have to byte-swap a value.
>>
>> Signed-off-by: Laurent Vivier 
>> CC: Greg Kurz 
>> CC: David Gibson 
>> CC: Peter Maydell 
>> ---
>> Note: this patch can be seen as a v2 of
>> "qtest: evaluate endianness of the target in qtest_init()"
>> from the patch series "tests: enable virtio tests on SPAPR"
>> in which I have added the idea from Peter to ask the endianness
>> directly to the guest using a new qtest command.
>>
>>  qtest.c   |   7 ++
>>  tests/libqos/virtio-pci.c |   2 +-
>>  tests/libqtest.c  | 224 
>> --
>>  tests/libqtest.h  |  16 +++-
>>  tests/virtio-blk-test.c   |   2 +-
>>  5 files changed, 118 insertions(+), 133 deletions(-)
>>
>> diff --git a/qtest.c b/qtest.c
>> index 22482cc..b53b39c 100644
>> --- a/qtest.c
>> +++ b/qtest.c
>> @@ -537,6 +537,13 @@ static void qtest_process_command(CharDriverState *chr, 
>> gchar **words)
>>
>>  qtest_send_prefix(chr);
>>  qtest_send(chr, "OK\n");
>> +} else if (strcmp(words[0], "endianness") == 0) {
>> +qtest_send_prefix(chr);
>> +#if defined(TARGET_WORDS_BIGENDIAN)
>> +qtest_sendf(chr, "OK big\n");
>> +#else
>> +qtest_sendf(chr, "OK little\n");
>> +#endif
>>  #ifdef TARGET_PPC64
>>  } else if (strcmp(words[0], "rtas") == 0) {
>>  uint64_t res, args, ret;
>> diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c
>> index 18b92b9..6e005c1 100644
>> --- a/tests/libqos/virtio-pci.c
>> +++ b/tests/libqos/virtio-pci.c
>> @@ -86,7 +86,7 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, 
>> uint64_t addr)
>>  int i;
>>  uint64_t u64 = 0;
>>
>> -if (qtest_big_endian()) {
>> +if (target_big_endian()) {
>>  for (i = 0; i < 8; ++i) {
>>  u64 |= (uint64_t)qpci_io_readb(dev->pdev,
>>  (void *)(uintptr_t)addr + i) << (7 - i) * 8;
> 
> Why rename the function? We're only changing its
> implementation.

Because in libqtest.c, qtest_() functions take always a QTestState
argument, and then in libqtest.h, we have an inline like "inline static
(...) { qtest_(global_qtest ...) }".

>> diff --git a/tests/libqtest.c b/tests/libqtest.c
>> index 6f6bdf1..27cf6b1 100644
>> --- a/tests/libqtest.c
>> +++ b/tests/libqtest.c
>> @@ -37,6 +37,7 @@ struct QTestState
>>  bool irq_level[MAX_IRQ];
>>  GString *rx;
>>  pid_t qemu_pid;  /* our child QEMU process */
>> +bool big_endian;
>>  };
>>
>>  static GHookList abrt_hooks;
>> @@ -146,89 +147,6 @@ void qtest_add_abrt_handler(GHookFunc fn, const void 
>> *data)
>>  g_hook_prepend(&abrt_hooks, hook);
>>  }
>>
>> -QTestState *qtest_init(const char *extra_args)
>> -{
>> -QTestState *s;
>> -int sock, qmpsock, i;
>> -gchar *socket_path;
>> -gchar *qmp_socket_path;
>> -gchar *command;
>> -const char *qemu_binary;
>> -
>> -qemu_binary = getenv("QTEST_QEMU_BINARY");
>> -g_assert(qemu_binary != NULL);
> 
> This diff arrangement makes the patch a bit hard to read;
> what meant that the functions had to be moved around?

Yes, I know. I move this function after qtest_sendf() and qtest_rsp() to
not have to declare them before. There are no circular dependencies, so
we can.

> 
>> +/* ask endianness of the target */
>> +
>> +qtest_sendf(s, "endianness\n");
>> +args = qtest_rsp(s, 1);
>> +g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0);
>> +s->big_endian = strcmp(args[1], "big") == 0;
>> +g_strfreev(args);
> 
> This would be better in its own utility function, I think.

Yes, I agree, but my wondering was how to name it :P ,
qtest_big_endian() and target_big_endian() are already in use, and as it
is a 6 lines function, used once, I guessed we could inline it here.

Thanks,
Laurent



Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-06 Thread David Gibson
On Thu, Oct 06, 2016 at 10:46:22PM +0200, Greg Kurz wrote:
> On Thu,  6 Oct 2016 20:56:58 +0200
> Laurent Vivier  wrote:
> 
> > The target endianness is not deduced anymore from
> > the architecture name but asked directly to the guest,
> > using a new qtest command: "endianness". As it can't
> > change (this is the value of TARGET_WORDS_BIGENDIAN),
> > we store it to not have to ask every time we want to
> > know if we have to byte-swap a value.
> > 
> > Signed-off-by: Laurent Vivier 
> > CC: Greg Kurz 
> > CC: David Gibson 
> > CC: Peter Maydell 
> > ---
> > Note: this patch can be seen as a v2 of
> > "qtest: evaluate endianness of the target in qtest_init()"
> > from the patch series "tests: enable virtio tests on SPAPR"
> > in which I have added the idea from Peter to ask the endianness
> > directly to the guest using a new qtest command.
> > 
> 
> This is definitely an improvement indeed.
> 
> Reviewed-by: Greg Kurz 

It is an improvement.  But I still think if we're relying on the
ill-defined "target endianness" we're already doing something wrong.

> 
> >  qtest.c   |   7 ++
> >  tests/libqos/virtio-pci.c |   2 +-
> >  tests/libqtest.c  | 224 
> > --
> >  tests/libqtest.h  |  16 +++-
> >  tests/virtio-blk-test.c   |   2 +-
> >  5 files changed, 118 insertions(+), 133 deletions(-)
> > 
> > diff --git a/qtest.c b/qtest.c
> > index 22482cc..b53b39c 100644
> > --- a/qtest.c
> > +++ b/qtest.c
> > @@ -537,6 +537,13 @@ static void qtest_process_command(CharDriverState 
> > *chr, gchar **words)
> >  
> >  qtest_send_prefix(chr);
> >  qtest_send(chr, "OK\n");
> > +} else if (strcmp(words[0], "endianness") == 0) {
> > +qtest_send_prefix(chr);
> > +#if defined(TARGET_WORDS_BIGENDIAN)
> > +qtest_sendf(chr, "OK big\n");
> > +#else
> > +qtest_sendf(chr, "OK little\n");
> > +#endif
> >  #ifdef TARGET_PPC64
> >  } else if (strcmp(words[0], "rtas") == 0) {
> >  uint64_t res, args, ret;
> > diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c
> > index 18b92b9..6e005c1 100644
> > --- a/tests/libqos/virtio-pci.c
> > +++ b/tests/libqos/virtio-pci.c
> > @@ -86,7 +86,7 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice 
> > *d, uint64_t addr)
> >  int i;
> >  uint64_t u64 = 0;
> >  
> > -if (qtest_big_endian()) {
> > +if (target_big_endian()) {
> >  for (i = 0; i < 8; ++i) {
> >  u64 |= (uint64_t)qpci_io_readb(dev->pdev,
> >  (void *)(uintptr_t)addr + i) << (7 - i) * 
> > 8;
> > diff --git a/tests/libqtest.c b/tests/libqtest.c
> > index 6f6bdf1..27cf6b1 100644
> > --- a/tests/libqtest.c
> > +++ b/tests/libqtest.c
> > @@ -37,6 +37,7 @@ struct QTestState
> >  bool irq_level[MAX_IRQ];
> >  GString *rx;
> >  pid_t qemu_pid;  /* our child QEMU process */
> > +bool big_endian;
> >  };
> >  
> >  static GHookList abrt_hooks;
> > @@ -146,89 +147,6 @@ void qtest_add_abrt_handler(GHookFunc fn, const void 
> > *data)
> >  g_hook_prepend(&abrt_hooks, hook);
> >  }
> >  
> > -QTestState *qtest_init(const char *extra_args)
> > -{
> > -QTestState *s;
> > -int sock, qmpsock, i;
> > -gchar *socket_path;
> > -gchar *qmp_socket_path;
> > -gchar *command;
> > -const char *qemu_binary;
> > -
> > -qemu_binary = getenv("QTEST_QEMU_BINARY");
> > -g_assert(qemu_binary != NULL);
> > -
> > -s = g_malloc(sizeof(*s));
> > -
> > -socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
> > -qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
> > -
> > -sock = init_socket(socket_path);
> > -qmpsock = init_socket(qmp_socket_path);
> > -
> > -qtest_add_abrt_handler(kill_qemu_hook_func, s);
> > -
> > -s->qemu_pid = fork();
> > -if (s->qemu_pid == 0) {
> > -setenv("QEMU_AUDIO_DRV", "none", true);
> > -command = g_strdup_printf("exec %s "
> > -  "-qtest unix:%s,nowait "
> > -  "-qtest-log %s "
> > -  "-qmp unix:%s,nowait "
> > -  "-machine accel=qtest "
> > -  "-display none "
> > -  "%s", qemu_binary, socket_path,
> > -  getenv("QTEST_LOG") ? "/dev/fd/2" : 
> > "/dev/null",
> > -  qmp_socket_path,
> > -  extra_args ?: "");
> > -execlp("/bin/sh", "sh", "-c", command, NULL);
> > -exit(1);
> > -}
> > -
> > -s->fd = socket_accept(sock);
> > -if (s->fd >= 0) {
> > -s->qmp_fd = socket_accept(qmpsock);
> > -}
> > -unlink(socket_path);
> > -unlink(qmp_socket_path);
> > -g_free(socket_path);
> > -g_free(qmp_socket_path);
> > -
> > -g_assert(s->fd >= 0 && s->qmp_fd >= 0);
> > -
> > -s-

Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-06 Thread Greg Kurz
On Thu,  6 Oct 2016 20:56:58 +0200
Laurent Vivier  wrote:

> The target endianness is not deduced anymore from
> the architecture name but asked directly to the guest,
> using a new qtest command: "endianness". As it can't
> change (this is the value of TARGET_WORDS_BIGENDIAN),
> we store it to not have to ask every time we want to
> know if we have to byte-swap a value.
> 
> Signed-off-by: Laurent Vivier 
> CC: Greg Kurz 
> CC: David Gibson 
> CC: Peter Maydell 
> ---
> Note: this patch can be seen as a v2 of
> "qtest: evaluate endianness of the target in qtest_init()"
> from the patch series "tests: enable virtio tests on SPAPR"
> in which I have added the idea from Peter to ask the endianness
> directly to the guest using a new qtest command.
> 

This is definitely an improvement indeed.

Reviewed-by: Greg Kurz 

>  qtest.c   |   7 ++
>  tests/libqos/virtio-pci.c |   2 +-
>  tests/libqtest.c  | 224 
> --
>  tests/libqtest.h  |  16 +++-
>  tests/virtio-blk-test.c   |   2 +-
>  5 files changed, 118 insertions(+), 133 deletions(-)
> 
> diff --git a/qtest.c b/qtest.c
> index 22482cc..b53b39c 100644
> --- a/qtest.c
> +++ b/qtest.c
> @@ -537,6 +537,13 @@ static void qtest_process_command(CharDriverState *chr, 
> gchar **words)
>  
>  qtest_send_prefix(chr);
>  qtest_send(chr, "OK\n");
> +} else if (strcmp(words[0], "endianness") == 0) {
> +qtest_send_prefix(chr);
> +#if defined(TARGET_WORDS_BIGENDIAN)
> +qtest_sendf(chr, "OK big\n");
> +#else
> +qtest_sendf(chr, "OK little\n");
> +#endif
>  #ifdef TARGET_PPC64
>  } else if (strcmp(words[0], "rtas") == 0) {
>  uint64_t res, args, ret;
> diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c
> index 18b92b9..6e005c1 100644
> --- a/tests/libqos/virtio-pci.c
> +++ b/tests/libqos/virtio-pci.c
> @@ -86,7 +86,7 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, 
> uint64_t addr)
>  int i;
>  uint64_t u64 = 0;
>  
> -if (qtest_big_endian()) {
> +if (target_big_endian()) {
>  for (i = 0; i < 8; ++i) {
>  u64 |= (uint64_t)qpci_io_readb(dev->pdev,
>  (void *)(uintptr_t)addr + i) << (7 - i) * 8;
> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 6f6bdf1..27cf6b1 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -37,6 +37,7 @@ struct QTestState
>  bool irq_level[MAX_IRQ];
>  GString *rx;
>  pid_t qemu_pid;  /* our child QEMU process */
> +bool big_endian;
>  };
>  
>  static GHookList abrt_hooks;
> @@ -146,89 +147,6 @@ void qtest_add_abrt_handler(GHookFunc fn, const void 
> *data)
>  g_hook_prepend(&abrt_hooks, hook);
>  }
>  
> -QTestState *qtest_init(const char *extra_args)
> -{
> -QTestState *s;
> -int sock, qmpsock, i;
> -gchar *socket_path;
> -gchar *qmp_socket_path;
> -gchar *command;
> -const char *qemu_binary;
> -
> -qemu_binary = getenv("QTEST_QEMU_BINARY");
> -g_assert(qemu_binary != NULL);
> -
> -s = g_malloc(sizeof(*s));
> -
> -socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
> -qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
> -
> -sock = init_socket(socket_path);
> -qmpsock = init_socket(qmp_socket_path);
> -
> -qtest_add_abrt_handler(kill_qemu_hook_func, s);
> -
> -s->qemu_pid = fork();
> -if (s->qemu_pid == 0) {
> -setenv("QEMU_AUDIO_DRV", "none", true);
> -command = g_strdup_printf("exec %s "
> -  "-qtest unix:%s,nowait "
> -  "-qtest-log %s "
> -  "-qmp unix:%s,nowait "
> -  "-machine accel=qtest "
> -  "-display none "
> -  "%s", qemu_binary, socket_path,
> -  getenv("QTEST_LOG") ? "/dev/fd/2" : 
> "/dev/null",
> -  qmp_socket_path,
> -  extra_args ?: "");
> -execlp("/bin/sh", "sh", "-c", command, NULL);
> -exit(1);
> -}
> -
> -s->fd = socket_accept(sock);
> -if (s->fd >= 0) {
> -s->qmp_fd = socket_accept(qmpsock);
> -}
> -unlink(socket_path);
> -unlink(qmp_socket_path);
> -g_free(socket_path);
> -g_free(qmp_socket_path);
> -
> -g_assert(s->fd >= 0 && s->qmp_fd >= 0);
> -
> -s->rx = g_string_new("");
> -for (i = 0; i < MAX_IRQ; i++) {
> -s->irq_level[i] = false;
> -}
> -
> -/* Read the QMP greeting and then do the handshake */
> -qtest_qmp_discard_response(s, "");
> -qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }");
> -
> -if (getenv("QTEST_STOP")) {
> -kill(s->qemu_pid, SIGSTOP);
> -}
> -
> -return s;
> -}
> -
> -void qtest_quit(QTestState *s)
> -{
> -qtest_instances = g

Re: [Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-06 Thread Peter Maydell
On 6 October 2016 at 11:56, Laurent Vivier  wrote:
> The target endianness is not deduced anymore from
> the architecture name but asked directly to the guest,
> using a new qtest command: "endianness". As it can't
> change (this is the value of TARGET_WORDS_BIGENDIAN),
> we store it to not have to ask every time we want to
> know if we have to byte-swap a value.
>
> Signed-off-by: Laurent Vivier 
> CC: Greg Kurz 
> CC: David Gibson 
> CC: Peter Maydell 
> ---
> Note: this patch can be seen as a v2 of
> "qtest: evaluate endianness of the target in qtest_init()"
> from the patch series "tests: enable virtio tests on SPAPR"
> in which I have added the idea from Peter to ask the endianness
> directly to the guest using a new qtest command.
>
>  qtest.c   |   7 ++
>  tests/libqos/virtio-pci.c |   2 +-
>  tests/libqtest.c  | 224 
> --
>  tests/libqtest.h  |  16 +++-
>  tests/virtio-blk-test.c   |   2 +-
>  5 files changed, 118 insertions(+), 133 deletions(-)
>
> diff --git a/qtest.c b/qtest.c
> index 22482cc..b53b39c 100644
> --- a/qtest.c
> +++ b/qtest.c
> @@ -537,6 +537,13 @@ static void qtest_process_command(CharDriverState *chr, 
> gchar **words)
>
>  qtest_send_prefix(chr);
>  qtest_send(chr, "OK\n");
> +} else if (strcmp(words[0], "endianness") == 0) {
> +qtest_send_prefix(chr);
> +#if defined(TARGET_WORDS_BIGENDIAN)
> +qtest_sendf(chr, "OK big\n");
> +#else
> +qtest_sendf(chr, "OK little\n");
> +#endif
>  #ifdef TARGET_PPC64
>  } else if (strcmp(words[0], "rtas") == 0) {
>  uint64_t res, args, ret;
> diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c
> index 18b92b9..6e005c1 100644
> --- a/tests/libqos/virtio-pci.c
> +++ b/tests/libqos/virtio-pci.c
> @@ -86,7 +86,7 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, 
> uint64_t addr)
>  int i;
>  uint64_t u64 = 0;
>
> -if (qtest_big_endian()) {
> +if (target_big_endian()) {
>  for (i = 0; i < 8; ++i) {
>  u64 |= (uint64_t)qpci_io_readb(dev->pdev,
>  (void *)(uintptr_t)addr + i) << (7 - i) * 8;

Why rename the function? We're only changing its
implementation.

> diff --git a/tests/libqtest.c b/tests/libqtest.c
> index 6f6bdf1..27cf6b1 100644
> --- a/tests/libqtest.c
> +++ b/tests/libqtest.c
> @@ -37,6 +37,7 @@ struct QTestState
>  bool irq_level[MAX_IRQ];
>  GString *rx;
>  pid_t qemu_pid;  /* our child QEMU process */
> +bool big_endian;
>  };
>
>  static GHookList abrt_hooks;
> @@ -146,89 +147,6 @@ void qtest_add_abrt_handler(GHookFunc fn, const void 
> *data)
>  g_hook_prepend(&abrt_hooks, hook);
>  }
>
> -QTestState *qtest_init(const char *extra_args)
> -{
> -QTestState *s;
> -int sock, qmpsock, i;
> -gchar *socket_path;
> -gchar *qmp_socket_path;
> -gchar *command;
> -const char *qemu_binary;
> -
> -qemu_binary = getenv("QTEST_QEMU_BINARY");
> -g_assert(qemu_binary != NULL);

This diff arrangement makes the patch a bit hard to read;
what meant that the functions had to be moved around?

> +/* ask endianness of the target */
> +
> +qtest_sendf(s, "endianness\n");
> +args = qtest_rsp(s, 1);
> +g_assert(strcmp(args[1], "big") == 0 || strcmp(args[1], "little") == 0);
> +s->big_endian = strcmp(args[1], "big") == 0;
> +g_strfreev(args);

This would be better in its own utility function, I think.

thanks
-- PMM



[Qemu-devel] [PATCH] qtest: ask endianness of the target in qtest_init()

2016-10-06 Thread Laurent Vivier
The target endianness is not deduced anymore from
the architecture name but asked directly to the guest,
using a new qtest command: "endianness". As it can't
change (this is the value of TARGET_WORDS_BIGENDIAN),
we store it to not have to ask every time we want to
know if we have to byte-swap a value.

Signed-off-by: Laurent Vivier 
CC: Greg Kurz 
CC: David Gibson 
CC: Peter Maydell 
---
Note: this patch can be seen as a v2 of
"qtest: evaluate endianness of the target in qtest_init()"
from the patch series "tests: enable virtio tests on SPAPR"
in which I have added the idea from Peter to ask the endianness
directly to the guest using a new qtest command.

 qtest.c   |   7 ++
 tests/libqos/virtio-pci.c |   2 +-
 tests/libqtest.c  | 224 --
 tests/libqtest.h  |  16 +++-
 tests/virtio-blk-test.c   |   2 +-
 5 files changed, 118 insertions(+), 133 deletions(-)

diff --git a/qtest.c b/qtest.c
index 22482cc..b53b39c 100644
--- a/qtest.c
+++ b/qtest.c
@@ -537,6 +537,13 @@ static void qtest_process_command(CharDriverState *chr, 
gchar **words)
 
 qtest_send_prefix(chr);
 qtest_send(chr, "OK\n");
+} else if (strcmp(words[0], "endianness") == 0) {
+qtest_send_prefix(chr);
+#if defined(TARGET_WORDS_BIGENDIAN)
+qtest_sendf(chr, "OK big\n");
+#else
+qtest_sendf(chr, "OK little\n");
+#endif
 #ifdef TARGET_PPC64
 } else if (strcmp(words[0], "rtas") == 0) {
 uint64_t res, args, ret;
diff --git a/tests/libqos/virtio-pci.c b/tests/libqos/virtio-pci.c
index 18b92b9..6e005c1 100644
--- a/tests/libqos/virtio-pci.c
+++ b/tests/libqos/virtio-pci.c
@@ -86,7 +86,7 @@ static uint64_t qvirtio_pci_config_readq(QVirtioDevice *d, 
uint64_t addr)
 int i;
 uint64_t u64 = 0;
 
-if (qtest_big_endian()) {
+if (target_big_endian()) {
 for (i = 0; i < 8; ++i) {
 u64 |= (uint64_t)qpci_io_readb(dev->pdev,
 (void *)(uintptr_t)addr + i) << (7 - i) * 8;
diff --git a/tests/libqtest.c b/tests/libqtest.c
index 6f6bdf1..27cf6b1 100644
--- a/tests/libqtest.c
+++ b/tests/libqtest.c
@@ -37,6 +37,7 @@ struct QTestState
 bool irq_level[MAX_IRQ];
 GString *rx;
 pid_t qemu_pid;  /* our child QEMU process */
+bool big_endian;
 };
 
 static GHookList abrt_hooks;
@@ -146,89 +147,6 @@ void qtest_add_abrt_handler(GHookFunc fn, const void *data)
 g_hook_prepend(&abrt_hooks, hook);
 }
 
-QTestState *qtest_init(const char *extra_args)
-{
-QTestState *s;
-int sock, qmpsock, i;
-gchar *socket_path;
-gchar *qmp_socket_path;
-gchar *command;
-const char *qemu_binary;
-
-qemu_binary = getenv("QTEST_QEMU_BINARY");
-g_assert(qemu_binary != NULL);
-
-s = g_malloc(sizeof(*s));
-
-socket_path = g_strdup_printf("/tmp/qtest-%d.sock", getpid());
-qmp_socket_path = g_strdup_printf("/tmp/qtest-%d.qmp", getpid());
-
-sock = init_socket(socket_path);
-qmpsock = init_socket(qmp_socket_path);
-
-qtest_add_abrt_handler(kill_qemu_hook_func, s);
-
-s->qemu_pid = fork();
-if (s->qemu_pid == 0) {
-setenv("QEMU_AUDIO_DRV", "none", true);
-command = g_strdup_printf("exec %s "
-  "-qtest unix:%s,nowait "
-  "-qtest-log %s "
-  "-qmp unix:%s,nowait "
-  "-machine accel=qtest "
-  "-display none "
-  "%s", qemu_binary, socket_path,
-  getenv("QTEST_LOG") ? "/dev/fd/2" : 
"/dev/null",
-  qmp_socket_path,
-  extra_args ?: "");
-execlp("/bin/sh", "sh", "-c", command, NULL);
-exit(1);
-}
-
-s->fd = socket_accept(sock);
-if (s->fd >= 0) {
-s->qmp_fd = socket_accept(qmpsock);
-}
-unlink(socket_path);
-unlink(qmp_socket_path);
-g_free(socket_path);
-g_free(qmp_socket_path);
-
-g_assert(s->fd >= 0 && s->qmp_fd >= 0);
-
-s->rx = g_string_new("");
-for (i = 0; i < MAX_IRQ; i++) {
-s->irq_level[i] = false;
-}
-
-/* Read the QMP greeting and then do the handshake */
-qtest_qmp_discard_response(s, "");
-qtest_qmp_discard_response(s, "{ 'execute': 'qmp_capabilities' }");
-
-if (getenv("QTEST_STOP")) {
-kill(s->qemu_pid, SIGSTOP);
-}
-
-return s;
-}
-
-void qtest_quit(QTestState *s)
-{
-qtest_instances = g_list_remove(qtest_instances, s);
-g_hook_destroy_link(&abrt_hooks, g_hook_find_data(&abrt_hooks, TRUE, s));
-
-/* Uninstall SIGABRT handler on last instance */
-if (!qtest_instances) {
-cleanup_sigabrt_handler();
-}
-
-kill_qemu(s);
-close(s->fd);
-close(s->qmp_fd);
-g_string_free(s->rx, true);
-g_free(s);
-}
-
 static void socket_send(int fd, const char *buf, size_t size)