[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[qemu-s390x] [PULL 03/34] s390x/tcg: MVCL: Detect destructive overlaps
From: |
Cornelia Huck |
Subject: |
[qemu-s390x] [PULL 03/34] s390x/tcg: MVCL: Detect destructive overlaps |
Date: |
Thu, 19 Sep 2019 14:40:44 +0200 |
From: David Hildenbrand <address@hidden>
We'll have to zero-out unused bit positions, so make sure to write the
addresses back.
Reviewed-by: Richard Henderson <address@hidden>
Signed-off-by: David Hildenbrand <address@hidden>
---
target/s390x/mem_helper.c | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c
index b02ad148e55b..223312a4b194 100644
--- a/target/s390x/mem_helper.c
+++ b/target/s390x/mem_helper.c
@@ -52,6 +52,19 @@ static inline bool psw_key_valid(CPUS390XState *env, uint8_t
psw_key)
return true;
}
+static bool is_destructive_overlap(CPUS390XState *env, uint64_t dest,
+ uint64_t src, uint32_t len)
+{
+ if (!len || src == dest) {
+ return false;
+ }
+ /* Take care of wrapping at the end of address space. */
+ if (unlikely(wrap_address(env, src + len - 1) < src)) {
+ return dest > src || dest <= wrap_address(env, src + len - 1);
+ }
+ return dest > src && dest <= src + len - 1;
+}
+
/* Reduce the length so that addr + len doesn't cross a page boundary. */
static inline uint32_t adj_len_to_page(uint32_t len, uint64_t addr)
{
@@ -787,7 +800,11 @@ uint32_t HELPER(mvcl)(CPUS390XState *env, uint32_t r1,
uint32_t r2)
uint8_t pad = env->regs[r2 + 1] >> 24;
uint32_t cc;
- cc = do_mvcl(env, &dest, &destlen, &src, &srclen, pad, 1, ra);
+ if (is_destructive_overlap(env, dest, src, MIN(srclen, destlen))) {
+ cc = 3;
+ } else {
+ cc = do_mvcl(env, &dest, &destlen, &src, &srclen, pad, 1, ra);
+ }
env->regs[r1 + 1] = deposit64(env->regs[r1 + 1], 0, 24, destlen);
env->regs[r2 + 1] = deposit64(env->regs[r2 + 1], 0, 24, srclen);
--
2.20.1
- [qemu-s390x] [PULL 15/34] s390x/tcg: Always use MMU_USER_IDX for CONFIG_USER_ONLY, (continued)
- [qemu-s390x] [PULL 15/34] s390x/tcg: Always use MMU_USER_IDX for CONFIG_USER_ONLY, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 14/34] s390x/tcg: MVST: Fix storing back the addresses to registers, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 16/34] s390x/tcg: Fault-safe memset, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 11/34] s390x/tcg: MVCOS: Lengths are 32 bit in 24/31-bit mode, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 12/34] s390x/tcg: MVCS/MVCP: Properly wrap the length, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 09/34] s390x/tcg: MVCLU/MVCLE: Process max 4k bytes at a time, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 06/34] s390x/tcg: MVC: Use is_destructive_overlap(), Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 08/34] s390x/tcg: MVPG: Properly wrap the addresses, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 04/34] s390x/tcg: MVCL: Process max 4k bytes at a time, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 05/34] s390x/tcg: MVC: Increment the length once, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 03/34] s390x/tcg: MVCL: Detect destructive overlaps,
Cornelia Huck <=
- [qemu-s390x] [PULL 01/34] s390x/tcg: Reset exception_index to -1 instead of 0, Cornelia Huck, 2019/09/19
- [qemu-s390x] [PULL 02/34] s390x/tcg: MVCL: Zero out unused bits of address, Cornelia Huck, 2019/09/19
- Re: [PULL 00/34] s390x update, Peter Maydell, 2019/09/20
- Re: [PULL 00/34] s390x update, Cornelia Huck, 2019/09/20
- Re: [PULL 00/34] s390x update, David Hildenbrand, 2019/09/20
- Re: [PULL 00/34] s390x update, David Hildenbrand, 2019/09/20
- Re: [PULL 00/34] s390x update, Cornelia Huck, 2019/09/20
- Re: [PULL 00/34] s390x update, Peter Maydell, 2019/09/20
- Re: [PULL 00/34] s390x update, David Hildenbrand, 2019/09/20