qemu-e2k/target-s390x
Aurelien Jarno 068593deea target-s390x: fix MVC instruction when areas overlap
The MVC instruction and the memmove C funtion do not have the same
semantic when memory areas overlap:

MVC: When the operands overlap, the result is obtained as if the
operands were processed one byte at a time and each result byte were
stored immediately after fetching the necessary operand byte.

memmove: Copying takes place as though the bytes in src are first copied
into a temporary array that does not overlap src or dest, and the bytes
are then copied from the temporary array to dest.

The behaviour is therefore the same when the destination is at a lower
address than the source, but not in the other case. This is actually a
trick for propagating a value to an area. While the current code detects
that and call memset in that case, it only does for 1-byte value. This
trick can and is used for propagating two or more bytes to an area.

In the softmmu case, the call to mvc_fast_memmove is correct as the
above tests verify that source and destination are each within a page,
and both in a different page. The part doing the move 8 bytes by 8 bytes
is wrong and we need to check that if the source and destination
overlap, they do with a distance of minimum 8 bytes before copying 8
bytes at a time.

In the user code, we should check check that the destination is at a
lower address than source or than the end of the source is at a lower
address than the destination before calling memmove. In the opposite
case we fallback to the same code as the softmmu one. Note that l
represents (length - 1).

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Signed-off-by: Alexander Graf <agraf@suse.de>
2015-06-05 01:37:59 +02:00
..
arch_dump.c s390x: Add vector registers to ELF dump 2015-05-27 17:52:03 +02:00
cc_helper.c target-s390x: fix CC computation for LOAD POSITIVE instructions 2015-06-05 01:37:57 +02:00
cpu-qom.h s390x/kvm: migrate vcpu interrupt state 2015-05-08 10:36:19 +02:00
cpu.c target-s390x: detect tininess before rounding for FP operations 2015-06-05 01:37:58 +02:00
cpu.h target-s390x: add a cpu_mmu_idx_to_asc function 2015-06-05 01:37:59 +02:00
fpu_helper.c target-s390x: implement LOAD FP INTEGER instructions 2015-06-05 01:37:59 +02:00
gdbstub.c s390x: gdb updates for vector registers 2015-05-27 17:52:03 +02:00
helper.c target-s390x: support non current ASC in s390_cpu_handle_mmu_fault 2015-06-05 01:37:59 +02:00
helper.h target-s390x: implement TRANSLATE EXTENDED instruction 2015-06-05 01:37:59 +02:00
insn-data.def target-s390x: implement high-word facility 2015-06-05 01:37:59 +02:00
insn-format.def target-s390: Add format based disassassmbly infrastructure 2013-01-05 12:00:27 -08:00
int_helper.c target-s390x: remove unused helpers 2015-06-05 01:37:57 +02:00
interrupt.c s390x: Fix sclp console input 2014-11-05 12:01:28 +01:00
ioinst.c s390x/kvm: Support access register mode for KVM_S390_MEM_OP ioctl 2015-04-30 13:21:42 +02:00
ioinst.h s390x/ioinst: Rework memory access in TPI instruction 2015-02-18 09:37:15 +01:00
kvm.c kvm: introduce kvm_arch_msi_data_to_gsi 2015-06-02 14:56:25 +01:00
machine.c s390x: Migrate vector registers 2015-05-27 17:52:03 +02:00
Makefile.objs s390x/mmu: Move mmu_translate() and friends to separate file 2015-02-18 09:36:38 +01:00
mem_helper.c target-s390x: fix MVC instruction when areas overlap 2015-06-05 01:37:59 +02:00
misc_helper.c target-s390x: fix PSW value on dynamical exception from helpers 2015-06-05 01:37:58 +02:00
mmu_helper.c trivial patches for 2015-04-30 2015-04-30 15:18:30 +01:00
translate.c target-s390x: implement high-word facility 2015-06-05 01:37:59 +02:00