[Qemu-devel] [PATCH v2 11/28] s390x/tcg: MVCS/MVCP: Properly wrap the length

David Hildenbrand posted 28 patches 6 years, 5 months ago
Maintainers: Cornelia Huck <cohuck@redhat.com>, Richard Henderson <rth@twiddle.net>, David Hildenbrand <david@redhat.com>
There is a newer version of this series
[Qemu-devel] [PATCH v2 11/28] s390x/tcg: MVCS/MVCP: Properly wrap the length
Posted by David Hildenbrand 6 years, 5 months ago
... and don't perform any move in case the length is zero.

Signed-off-by: David Hildenbrand <david@redhat.com>
---
 target/s390x/mem_helper.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c
index 041d01d63d..de5e69b500 100644
--- a/target/s390x/mem_helper.c
+++ b/target/s390x/mem_helper.c
@@ -1973,10 +1973,13 @@ uint32_t HELPER(mvcs)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
         s390_program_interrupt(env, PGM_SPECIAL_OP, ILEN_AUTO, ra);
     }
 
+    l = wrap_length(env, l);
     if (l > 256) {
         /* max 256 */
         l = 256;
         cc = 3;
+    } else if (!l) {
+        return cc;
     }
 
     /* XXX replace w/ memcpy */
@@ -2002,10 +2005,13 @@ uint32_t HELPER(mvcp)(CPUS390XState *env, uint64_t l, uint64_t a1, uint64_t a2)
         s390_program_interrupt(env, PGM_SPECIAL_OP, ILEN_AUTO, ra);
     }
 
+    l = wrap_length(env, l);
     if (l > 256) {
         /* max 256 */
         l = 256;
         cc = 3;
+    } else if (!l) {
+        return cc;
     }
 
     /* XXX replace w/ memcpy */
-- 
2.21.0


Re: [Qemu-devel] [PATCH v2 11/28] s390x/tcg: MVCS/MVCP: Properly wrap the length
Posted by Richard Henderson 6 years, 5 months ago
On 9/6/19 3:57 AM, David Hildenbrand wrote:
> +    l = wrap_length(env, l);
>      if (l > 256) {
>          /* max 256 */
>          l = 256;
>          cc = 3;
> +    } else if (!l) {
> +        return cc;
>      }

Um, wrap_length only takes 31 bits.
These insns take 32 bits in 24/31-bit modes.


r~

Re: [Qemu-devel] [PATCH v2 11/28] s390x/tcg: MVCS/MVCP: Properly wrap the length
Posted by David Hildenbrand 6 years, 5 months ago
On 11.09.19 17:11, Richard Henderson wrote:
> On 9/6/19 3:57 AM, David Hildenbrand wrote:
>> +    l = wrap_length(env, l);
>>      if (l > 256) {
>>          /* max 256 */
>>          l = 256;
>>          cc = 3;
>> +    } else if (!l) {
>> +        return cc;
>>      }
> 
> Um, wrap_length only takes 31 bits.
> These insns take 32 bits in 24/31-bit modes.

Nice observation! Thanks!

-- 

Thanks,

David / dhildenb