Message ID | 20240422130416.1891-1-philmd@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | hw/audio/virtio-snd: Use device endianness instead of target one | expand |
On 22/4/24 15:04, Philippe Mathieu-Daudé wrote: > Since VirtIO devices can change endianness at runtime, > we need to use the device endianness, not the target > one. > > Cc: qemu-stable@nongnu.org > Fixes: eb9ad377bb ("virtio-sound: handle control messages and streams") > Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> > --- > hw/audio/virtio-snd.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > -static void virtio_snd_get_qemu_audsettings(audsettings *as, > +static void virtio_snd_get_qemu_audsettings(VirtIOSound *s, audsettings *as, > virtio_snd_pcm_set_params *params) > { > + VirtIODevice *vdev = VIRTIO_DEVICE(s); > + > as->nchannels = MIN(AUDIO_MAX_CHANNELS, params->channels); > as->fmt = virtio_snd_get_qemu_format(params->format); > as->freq = virtio_snd_get_qemu_freq(params->rate); > - as->endianness = target_words_bigendian() ? 1 : 0; > + as->endianness = vdev->device_endian ? 1 : 0; Err, I neglected to consider VIRTIO_DEVICE_ENDIAN_UNKNOWN :/ > }
diff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c index c80b58bf5d..796e0753d6 100644 --- a/hw/audio/virtio-snd.c +++ b/hw/audio/virtio-snd.c @@ -395,13 +395,15 @@ static uint32_t virtio_snd_get_qemu_freq(uint32_t rate) * Get QEMU Audiosystem compatible audsettings from virtio based pcm stream * params. */ -static void virtio_snd_get_qemu_audsettings(audsettings *as, +static void virtio_snd_get_qemu_audsettings(VirtIOSound *s, audsettings *as, virtio_snd_pcm_set_params *params) { + VirtIODevice *vdev = VIRTIO_DEVICE(s); + as->nchannels = MIN(AUDIO_MAX_CHANNELS, params->channels); as->fmt = virtio_snd_get_qemu_format(params->format); as->freq = virtio_snd_get_qemu_freq(params->rate); - as->endianness = target_words_bigendian() ? 1 : 0; + as->endianness = vdev->device_endian ? 1 : 0; } /* @@ -464,7 +466,7 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, uint32_t stream_id) s->pcm->streams[stream_id] = stream; } - virtio_snd_get_qemu_audsettings(&as, params); + virtio_snd_get_qemu_audsettings(s, &as, params); stream->info.direction = stream_id < s->snd_conf.streams / 2 + (s->snd_conf.streams & 1) ? VIRTIO_SND_D_OUTPUT : VIRTIO_SND_D_INPUT; stream->info.hdr.hda_fn_nid = VIRTIO_SOUND_HDA_FN_NID;
Since VirtIO devices can change endianness at runtime, we need to use the device endianness, not the target one. Cc: qemu-stable@nongnu.org Fixes: eb9ad377bb ("virtio-sound: handle control messages and streams") Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org> --- hw/audio/virtio-snd.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)