[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[qemu-s390x] [PATCH v3 28/29] s390x/tcg: MVO: Fault-safe handling
From: |
David Hildenbrand |
Subject: |
[qemu-s390x] [PATCH v3 28/29] s390x/tcg: MVO: Fault-safe handling |
Date: |
Mon, 16 Sep 2019 15:58:05 +0200 |
Each operand can have a maximum length of 16. Make sure to prepare all
reads/writes before writing.
Reviewed-by: Richard Henderson <address@hidden>
Signed-off-by: David Hildenbrand <address@hidden>
---
target/s390x/mem_helper.c | 27 +++++++++++++++------------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c
index 671e917dc1..5045420020 100644
--- a/target/s390x/mem_helper.c
+++ b/target/s390x/mem_helper.c
@@ -516,31 +516,34 @@ void HELPER(mvn)(CPUS390XState *env, uint32_t l, uint64_t
dest, uint64_t src)
/* move with offset */
void HELPER(mvo)(CPUS390XState *env, uint32_t l, uint64_t dest, uint64_t src)
{
+ const int mmu_idx = cpu_mmu_index(env, false);
+ /* MVO always processes one more byte than specified - maximum is 16 */
+ const int len_dest = (l >> 4) + 1;
+ const int len_src = (l & 0xf) + 1;
uintptr_t ra = GETPC();
- int len_dest = l >> 4;
- int len_src = l & 0xf;
uint8_t byte_dest, byte_src;
- int i;
+ S390Access srca, desta;
+ int i, j;
- src += len_src;
- dest += len_dest;
+ srca = access_prepare(env, src, len_src, MMU_DATA_LOAD, mmu_idx, ra);
+ desta = access_prepare(env, dest, len_dest, MMU_DATA_STORE, mmu_idx, ra);
/* Handle rightmost byte */
- byte_src = cpu_ldub_data_ra(env, src, ra);
- byte_dest = cpu_ldub_data_ra(env, dest, ra);
+ byte_dest = cpu_ldub_data_ra(env, dest + len_dest - 1, ra);
+ byte_src = access_get_byte(env, &srca, len_src - 1, ra);
byte_dest = (byte_dest & 0x0f) | (byte_src << 4);
- cpu_stb_data_ra(env, dest, byte_dest, ra);
+ access_set_byte(env, &desta, len_dest - 1, byte_dest, ra);
/* Process remaining bytes from right to left */
- for (i = 1; i <= len_dest; i++) {
+ for (i = len_dest - 2, j = len_src - 2; i >= 0; i--, j--) {
byte_dest = byte_src >> 4;
- if (len_src - i >= 0) {
- byte_src = cpu_ldub_data_ra(env, src - i, ra);
+ if (j >= 0) {
+ byte_src = access_get_byte(env, &srca, j, ra);
} else {
byte_src = 0;
}
byte_dest |= byte_src << 4;
- cpu_stb_data_ra(env, dest - i, byte_dest, ra);
+ access_set_byte(env, &desta, i, byte_dest, ra);
}
}
--
2.21.0
- [qemu-s390x] [PATCH v3 16/29] s390x/tcg: Fault-safe memset, (continued)
- [qemu-s390x] [PATCH v3 16/29] s390x/tcg: Fault-safe memset, David Hildenbrand, 2019/09/16
- [qemu-s390x] [PATCH v3 20/29] s390x/tcg: MVCLU: Fault-safe handling, David Hildenbrand, 2019/09/16
- [qemu-s390x] [PATCH v3 21/29] s390x/tcg: OC: Fault-safe handling, David Hildenbrand, 2019/09/16
- [qemu-s390x] [PATCH v3 22/29] s390x/tcg: XC: Fault-safe handling, David Hildenbrand, 2019/09/16
- [qemu-s390x] [PATCH v3 23/29] s390x/tcg: NC: Fault-safe handling, David Hildenbrand, 2019/09/16
- [qemu-s390x] [PATCH v3 24/29] s390x/tcg: MVCIN: Fault-safe handling, David Hildenbrand, 2019/09/16
- [qemu-s390x] [PATCH v3 25/29] s390x/tcg: MVN: Fault-safe handling, David Hildenbrand, 2019/09/16
- [qemu-s390x] [PATCH v3 26/29] s390x/tcg: MVZ: Fault-safe handling, David Hildenbrand, 2019/09/16
- [qemu-s390x] [PATCH v3 27/29] s390x/tcg: MVST: Fault-safe handling, David Hildenbrand, 2019/09/16
- [qemu-s390x] [PATCH v3 28/29] s390x/tcg: MVO: Fault-safe handling,
David Hildenbrand <=
- [qemu-s390x] [PATCH v3 29/29] tests/tcg: target/s390x: Test MVO, David Hildenbrand, 2019/09/16
Re: [qemu-s390x] [PATCH v3 00/29] s390x/tcg: mem_helper: Fault-safe handling, David Hildenbrand, 2019/09/18