x86emul: de-duplicate scatters to the same linear address
authorJan Beulich <jbeulich@suse.com>
Fri, 19 Nov 2021 08:37:37 +0000 (09:37 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 19 Nov 2021 08:37:37 +0000 (09:37 +0100)
commit7c957ea6125a1510baee4e01413451612c29312b
tree71ba707e62811909b7e406a1f135c75f3ad3c6e2
parentf240f9c3c635222069b4e2e037c5eb7aa3687075
x86emul: de-duplicate scatters to the same linear address

The SDM specifically allows for earlier writes to fully overlapping
ranges to be dropped. If a guest did so, hvmemul_phys_mmio_access()
would crash it if varying data was written to the same address. Detect
overlaps early, as doing so in hvmemul_{linear,phys}_mmio_access() would
be quite a bit more difficult. To maintain proper faulting behavior,
instead of dropping earlier write instances of fully overlapping slots
altogether, write the data of the final of these slots multiple times.
(We also can't pull ahead the [single] write of the data of the last of
the slots, clearing all involved slots' op_mask bits together, as this
would yield incorrect results if there were intervening partially
overlapping ones.)

Note that due to cache slot use being linear address based, there's no
similar issue with multiple writes to the same physical address (mapped
through different linear addresses).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Roger Pau Monné <roger.pau@citrix.com>
master commit: a8cddbac5051020bb4a59a7f0ea27500c51063fb
master date: 2021-10-19 10:02:39 +0200
xen/arch/x86/x86_emulate/x86_emulate.c