qemu-trivial
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] hw/audio/gus: Fix registers 32-bit access


From: Allan Peramaki
Subject: Re: [PATCH] hw/audio/gus: Fix registers 32-bit access
Date: Thu, 18 Jun 2020 02:10:31 +0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0

On 18/06/2020 01:25, Allan Peramaki wrote:
On 17/06/2020 23:23, Peter Maydell wrote:
Are these accesses all guaranteed to be correctly aligned
to be 16 or 32 bit loads/stores ? Otherwise it would be
better to use the ldl_p/stl_p/ldw_p/stw_p/etc accessors,
which correctly handle possibly misaligned pointers.

Yes (assuming compiler aligns struct fields properly.) It is not obvious though (and easy to break), so I suppose refactoring much of the GUS code would be nice. For example, the few places where GUSregd(position) is used, position is 2 (mod 4). On the other hand, gusptr is also 2 (mod 4) bytes (making gusptr+position = 0 (mod 4)), because we have the struct

It is aligned, but my reasoning had a mistake. Both gusptr and position (GUSDRAMPOS24bit and voicewavetableirq) are 0 (mod 4). (mixbuf is a pointer.) Sorry.


typedef struct GUSState {
     ISADevice dev;
     GUSEmuState emu;
     QEMUSoundCard card;
     uint32_t freq;
     uint32_t port;
     int pos, left, shift, irqs;
     int16_t *mixbuf;
     uint8_t himem[1024 * 1024 + 32 + 4096];
     int samples;
     SWVoiceOut *voice;
     int64_t last_ticks;
     qemu_irq pic;
     IsaDma *isa_dma;
     PortioList portio_list1;
     PortioList portio_list2;
} GUSState;



Best regards,
Allan



reply via email to

[Prev in Thread] Current Thread [Next in Thread]