Hi, If there is any feedback, should I discard this experiment?
On 5/20/21 1:09 PM, Philippe Mathieu-Daudé wrote: > This series is an experiment after chatting with Stefan and having > received review from Peter / Richard on an orthogonal series aiming > to handle unaligned pointers (atomically): > https://www.mail-archive.com/qemu-devel@nongnu.org/msg808954.html > > Here we don't aim to fix unatomic accesses, however we are interested > in catching malicious unaligned accesses from guests. > > For that we introduce the MemTxAttrs::aligned field which allow > accessors to return MEMTX_UNALIGNED_ERROR early enough, instead > of trying the unaligned access which can potentially trigger a > SIGBUS and abort the process. > > To be able to pass/return alignment information we modify the > memory load/store cached API, then add the > virtio_ld/st*_phys_cached_with_attrs() handler (we only implement > lduw for this experiment). > > Finaly we modify vring_avail_flags() to return whether the guest > requested an illegal (unaligned) memory access. > > Note: The current virtio_ld/st*_phys_cached_with_attrs() API returns > the value, and take the MemTxResult as argument, so I choose to > return -1 (marked with /* XXX */ comment. We should switch to using > an API which returns a MemTxResult and takes the value accessed as > argument, this way we don't have to return random meaningless value. > > But this is beyond the scope of this experiment, here we want to > emphasize the introduction of the MemTxAttrs::aligned field and the > MEMTX_UNALIGNED_ERROR return value. > > Regards, > > Phil. > > Philippe Mathieu-Daudé (12): > exec/memory_ldst: Use correct type sizes > exec/memattrs: Add attribute/error for address alignment > exec/memory_ldst: Return MEMTX_UNALIGNED_ERROR for unaligned addresses > exec/memory_ldst_cached: Sort declarations > exec/memory_ldst_cached: Use correct type size > exec/memory_ldst_cached: Set MemTxResult on success > exec/memory_ldst_cached: Document aligned addresses are expected > exec/memory_ldst_cached: Check address alignment if requested > hw/virtio: Use correct type sizes > hw/virtio: Extract virtio_lduw_phys_cached_with_attrs() > hw/virtio: Have vring_avail_flags() return a boolean value > hw/virtio: Display error if vring flag field is not aligned > > include/exec/memattrs.h | 3 + > include/hw/virtio/virtio-access.h | 39 +++++++-- > include/exec/memory_ldst.h.inc | 16 ++-- > include/exec/memory_ldst_cached.h.inc | 114 ++++++++++++++++++++------ > hw/virtio/virtio.c | 22 ++++- > memory_ldst.c.inc | 69 +++++++++++++--- > 6 files changed, 211 insertions(+), 52 deletions(-) >