qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement
@ 2018-02-08 10:57 Daniel Henrique Barboza
  2018-02-08 12:15 ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 8+ messages in thread
From: Daniel Henrique Barboza @ 2018-02-08 10:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Daniel Henrique Barboza, John Arbuckle, Gerd Hoffmann

This patch adds a break in the switch() statement of complete(),
value 0x42:

    case 0x42:              /* FT2 sets output freq with this, go figure */
        qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
                      " should\n");
        break; <-------
    case 0x41:

The issue was found by Coverity (#1385841):

    CID 1385841:  Control flow issues  (MISSING_BREAK)
    The case for value "66" is not terminated by a 'break' statement.

Fixes: 8ec660b80e ("hw/audio/sb16.c: change dolog() to qemu_log_mask()")
Signed-off-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
CC: John Arbuckle <programmingkidx@gmail.com>
CC: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/audio/sb16.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c
index 31de264ab7..b2fdcd8437 100644
--- a/hw/audio/sb16.c
+++ b/hw/audio/sb16.c
@@ -744,6 +744,7 @@ static void complete (SB16State *s)
         case 0x42:              /* FT2 sets output freq with this, go figure */
             qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
                           " should\n");
+            break;
         case 0x41:
             s->freq = dsp_get_hilo (s);
             ldebug ("set freq %d\n", s->freq);
-- 
2.14.3

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement
  2018-02-08 10:57 [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement Daniel Henrique Barboza
@ 2018-02-08 12:15 ` Philippe Mathieu-Daudé
  2018-02-08 13:01   ` Peter Maydell
                     ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-02-08 12:15 UTC (permalink / raw)
  To: Daniel Henrique Barboza, qemu-devel; +Cc: John Arbuckle, Gerd Hoffmann

Hi Daniel,

On 02/08/2018 07:57 AM, Daniel Henrique Barboza wrote:
> This patch adds a break in the switch() statement of complete(),
> value 0x42:
> 
>     case 0x42:              /* FT2 sets output freq with this, go figure */
>         qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
>                       " should\n");
>         break; <-------
>     case 0x41:

It seems this is an intentional fallthrough, I understand cmd 0x42 is
expected to do the same of 0x41 and _a bit more_ (see commit 85571bc7415).

> 
> The issue was found by Coverity (#1385841):
> 
>     CID 1385841:  Control flow issues  (MISSING_BREAK)
>     The case for value "66" is not terminated by a 'break' statement.
> 
> Fixes: 8ec660b80e ("hw/audio/sb16.c: change dolog() to qemu_log_mask()")
> Signed-off-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
> CC: John Arbuckle <programmingkidx@gmail.com>
> CC: Gerd Hoffmann <kraxel@redhat.com>
> ---
>  hw/audio/sb16.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c
> index 31de264ab7..b2fdcd8437 100644
> --- a/hw/audio/sb16.c
> +++ b/hw/audio/sb16.c
> @@ -744,6 +744,7 @@ static void complete (SB16State *s)
>          case 0x42:              /* FT2 sets output freq with this, go figure */
>              qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
>                            " should\n");
> +            break;
>          case 0x41:
>              s->freq = dsp_get_hilo (s);
>              ldebug ("set freq %d\n", s->freq);
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement
  2018-02-08 12:15 ` Philippe Mathieu-Daudé
@ 2018-02-08 13:01   ` Peter Maydell
  2018-02-08 13:16     ` Philippe Mathieu-Daudé
  2018-02-08 13:08   ` Daniel P. Berrangé
  2018-02-08 14:11   ` Daniel Henrique Barboza
  2 siblings, 1 reply; 8+ messages in thread
From: Peter Maydell @ 2018-02-08 13:01 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Daniel Henrique Barboza, QEMU Developers, John Arbuckle,
	Gerd Hoffmann

On 8 February 2018 at 12:15, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Hi Daniel,
>
> On 02/08/2018 07:57 AM, Daniel Henrique Barboza wrote:
>> This patch adds a break in the switch() statement of complete(),
>> value 0x42:
>>
>>     case 0x42:              /* FT2 sets output freq with this, go figure */
>>         qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
>>                       " should\n");
>>         break; <-------
>>     case 0x41:
>
> It seems this is an intentional fallthrough, I understand cmd 0x42 is
> expected to do the same of 0x41 and _a bit more_ (see commit 85571bc7415).

Yes, I agree; I wrote a bit about this in this thread:
https://lists.gnu.org/archive/html/qemu-devel/2018-02/msg02081.html

(though my guess is that actually 0x42 is supposed to do exactly
what 0x41 does, and that the LOG_UNIMP should maybe just be removed).

thanks
-- PMM

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement
  2018-02-08 12:15 ` Philippe Mathieu-Daudé
  2018-02-08 13:01   ` Peter Maydell
@ 2018-02-08 13:08   ` Daniel P. Berrangé
  2018-02-08 14:11   ` Daniel Henrique Barboza
  2 siblings, 0 replies; 8+ messages in thread
From: Daniel P. Berrangé @ 2018-02-08 13:08 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Daniel Henrique Barboza, qemu-devel, John Arbuckle, Gerd Hoffmann

On Thu, Feb 08, 2018 at 09:15:10AM -0300, Philippe Mathieu-Daudé wrote:
> Hi Daniel,
> 
> On 02/08/2018 07:57 AM, Daniel Henrique Barboza wrote:
> > This patch adds a break in the switch() statement of complete(),
> > value 0x42:
> > 
> >     case 0x42:              /* FT2 sets output freq with this, go figure */
> >         qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
> >                       " should\n");
> >         break; <-------
> >     case 0x41:
> 
> It seems this is an intentional fallthrough, I understand cmd 0x42 is
> expected to do the same of 0x41 and _a bit more_ (see commit 85571bc7415).

It might be nice to turn on -Wimplicit-fallthrough and then annotate
valid locations like this in qemu with  /* fallthrough */

Although GCC has an __attribute((fallthrough)), the warning flag impl
also looks for that magic comment, and the magic comment is portable
to clang too.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement
  2018-02-08 13:01   ` Peter Maydell
@ 2018-02-08 13:16     ` Philippe Mathieu-Daudé
  2018-02-08 13:34       ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-02-08 13:16 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Daniel Henrique Barboza, QEMU Developers, John Arbuckle,
	Gerd Hoffmann

On 02/08/2018 10:01 AM, Peter Maydell wrote:
> On 8 February 2018 at 12:15, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>> Hi Daniel,
>>
>> On 02/08/2018 07:57 AM, Daniel Henrique Barboza wrote:
>>> This patch adds a break in the switch() statement of complete(),
>>> value 0x42:
>>>
>>>     case 0x42:              /* FT2 sets output freq with this, go figure */
>>>         qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
>>>                       " should\n");
>>>         break; <-------
>>>     case 0x41:
>>
>> It seems this is an intentional fallthrough, I understand cmd 0x42 is
>> expected to do the same of 0x41 and _a bit more_ (see commit 85571bc7415).
> 
> Yes, I agree; I wrote a bit about this in this thread:
> https://lists.gnu.org/archive/html/qemu-devel/2018-02/msg02081.html

Oh, very useful link!

> (though my guess is that actually 0x42 is supposed to do exactly
> what 0x41 does, and that the LOG_UNIMP should maybe just be removed).

I now understand 0x42 sets the dsp input sampling freq, the model seems
to be designed with output in mind, then added input support (using same
freq as output).

So imho the simpler/safer fix would be:

  case 0x42:
      if (dsp_get_hilo(s) != s->freq) {
          qemu_log_mask(LOG_UNIMP,
                        "input sampling freq different than "
                        "output not implemented");
      }
      /* fallthrough */
  case 0x41:
      ...

and the correct fix would be split s->freq in {s->freq_in, s->freq_out}
but nobody ever required this during at least 14 years.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement
  2018-02-08 13:16     ` Philippe Mathieu-Daudé
@ 2018-02-08 13:34       ` Philippe Mathieu-Daudé
  2018-02-08 13:51         ` Peter Maydell
  0 siblings, 1 reply; 8+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-02-08 13:34 UTC (permalink / raw)
  To: Peter Maydell
  Cc: Daniel Henrique Barboza, QEMU Developers, John Arbuckle,
	Gerd Hoffmann

On 02/08/2018 10:16 AM, Philippe Mathieu-Daudé wrote:
> On 02/08/2018 10:01 AM, Peter Maydell wrote:
>> On 8 February 2018 at 12:15, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
>>> Hi Daniel,
>>>
>>> On 02/08/2018 07:57 AM, Daniel Henrique Barboza wrote:
>>>> This patch adds a break in the switch() statement of complete(),
>>>> value 0x42:
>>>>
>>>>     case 0x42:              /* FT2 sets output freq with this, go figure */
>>>>         qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
>>>>                       " should\n");
>>>>         break; <-------
>>>>     case 0x41:
>>>
>>> It seems this is an intentional fallthrough, I understand cmd 0x42 is
>>> expected to do the same of 0x41 and _a bit more_ (see commit 85571bc7415).
>>
>> Yes, I agree; I wrote a bit about this in this thread:
>> https://lists.gnu.org/archive/html/qemu-devel/2018-02/msg02081.html
> 
> Oh, very useful link!
> 
>> (though my guess is that actually 0x42 is supposed to do exactly
>> what 0x41 does, and that the LOG_UNIMP should maybe just be removed).
> 
> I now understand 0x42 sets the dsp input sampling freq, the model seems
> to be designed with output in mind, then added input support (using same
> freq as output).

Now I see Fabrice comment "FT2 sets output freq with this, go figure"
and agree with him.

I like to think this is a bug in Fast Tracker 2, so Peter suggestion
about using LOG_GUEST_ERROR here might be clever.

> 
> So imho the simpler/safer fix would be:
> 
>   case 0x42:
>       if (dsp_get_hilo(s) != s->freq) {
>           qemu_log_mask(LOG_UNIMP,
>                         "input sampling freq different than "
>                         "output not implemented");
>       }
>       /* fallthrough */
>   case 0x41:
>       ...
> 
> and the correct fix would be split s->freq in {s->freq_in, s->freq_out}
> but nobody ever required this during at least 14 years.
> 

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement
  2018-02-08 13:34       ` Philippe Mathieu-Daudé
@ 2018-02-08 13:51         ` Peter Maydell
  0 siblings, 0 replies; 8+ messages in thread
From: Peter Maydell @ 2018-02-08 13:51 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: Daniel Henrique Barboza, QEMU Developers, John Arbuckle,
	Gerd Hoffmann

On 8 February 2018 at 13:34, Philippe Mathieu-Daudé <f4bug@amsat.org> wrote:
> Now I see Fabrice comment "FT2 sets output freq with this, go figure"
> and agree with him.
>
> I like to think this is a bug in Fast Tracker 2, so Peter suggestion
> about using LOG_GUEST_ERROR here might be clever.
>
>>
>> So imho the simpler/safer fix would be:
>>
>>   case 0x42:
>>       if (dsp_get_hilo(s) != s->freq) {
>>           qemu_log_mask(LOG_UNIMP,
>>                         "input sampling freq different than "
>>                         "output not implemented");
>>       }
>>       /* fallthrough */
>>   case 0x41:
>>       ...

Wouldn't this falsely report a warning for guest code that really
is trying to set the input sampling frequency and doesn't care
about output?

>> and the correct fix would be split s->freq in {s->freq_in, s->freq_out}

...but that would differ from the hardware implementation, which
(apparently) uses a single frequency for both.

thanks
-- PMM

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement
  2018-02-08 12:15 ` Philippe Mathieu-Daudé
  2018-02-08 13:01   ` Peter Maydell
  2018-02-08 13:08   ` Daniel P. Berrangé
@ 2018-02-08 14:11   ` Daniel Henrique Barboza
  2 siblings, 0 replies; 8+ messages in thread
From: Daniel Henrique Barboza @ 2018-02-08 14:11 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé, qemu-devel; +Cc: John Arbuckle, Gerd Hoffmann

Hey,

On 02/08/2018 10:15 AM, Philippe Mathieu-Daudé wrote:
> Hi Daniel,
>
> On 02/08/2018 07:57 AM, Daniel Henrique Barboza wrote:
>> This patch adds a break in the switch() statement of complete(),
>> value 0x42:
>>
>>      case 0x42:              /* FT2 sets output freq with this, go figure */
>>          qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
>>                        " should\n");
>>          break; <-------
>>      case 0x41:
> It seems this is an intentional fallthrough, I understand cmd 0x42 is
> expected to do the same of 0x41 and _a bit more_ (see commit 85571bc7415).

Perhaps it should be more explicit then? Something like

         case 0x40:
             s->time_const = dsp_get_data (s);
             ldebug ("set time const %d\n", s->time_const);
             break;

         case 0x41:
         case 0x42:
              if (s->cmd == 0x42) {
                   /* FT2 sets output freq with this, go figure */
                 qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it 
think it"
                                          " should\n");
             }
             s->freq = dsp_get_hilo (s);
             ldebug ("set freq %d\n", s->freq);
             break;

         case 0x48:



>
>> The issue was found by Coverity (#1385841):
>>
>>      CID 1385841:  Control flow issues  (MISSING_BREAK)
>>      The case for value "66" is not terminated by a 'break' statement.
>>
>> Fixes: 8ec660b80e ("hw/audio/sb16.c: change dolog() to qemu_log_mask()")
>> Signed-off-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
>> CC: John Arbuckle <programmingkidx@gmail.com>
>> CC: Gerd Hoffmann <kraxel@redhat.com>
>> ---
>>   hw/audio/sb16.c | 1 +
>>   1 file changed, 1 insertion(+)
>>
>> diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c
>> index 31de264ab7..b2fdcd8437 100644
>> --- a/hw/audio/sb16.c
>> +++ b/hw/audio/sb16.c
>> @@ -744,6 +744,7 @@ static void complete (SB16State *s)
>>           case 0x42:              /* FT2 sets output freq with this, go figure */
>>               qemu_log_mask(LOG_UNIMP, "cmd 0x42 might not do what it think it"
>>                             " should\n");
>> +            break;
>>           case 0x41:
>>               s->freq = dsp_get_hilo (s);
>>               ldebug ("set freq %d\n", s->freq);
>>


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2018-02-08 14:11 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-02-08 10:57 [Qemu-devel] [PATCH 1/1] hw/audio/sb16.c: missing break statement Daniel Henrique Barboza
2018-02-08 12:15 ` Philippe Mathieu-Daudé
2018-02-08 13:01   ` Peter Maydell
2018-02-08 13:16     ` Philippe Mathieu-Daudé
2018-02-08 13:34       ` Philippe Mathieu-Daudé
2018-02-08 13:51         ` Peter Maydell
2018-02-08 13:08   ` Daniel P. Berrangé
2018-02-08 14:11   ` Daniel Henrique Barboza

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).