Skip to content

Commit

Permalink
s390x/tcg: MVCOS: Lengths are 32 bit in 24/31-bit mode
Browse files Browse the repository at this point in the history
Triggered by a review comment from Richard, also MVCOS has a 32-bit
length in 24/31-bit addressing mode. Add a new helper.

Rename wrap_length() to wrap_length31().

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
  • Loading branch information
davidhildenbrand committed Sep 23, 2019
1 parent 43df3e7 commit a762756
Showing 1 changed file with 11 additions and 3 deletions.
14 changes: 11 additions & 3 deletions target/s390x/mem_helper.c
Expand Up @@ -528,7 +528,15 @@ static inline void set_address(CPUS390XState *env, int reg, uint64_t address)
}
}

static inline uint64_t wrap_length(CPUS390XState *env, uint64_t length)
static inline uint64_t wrap_length32(CPUS390XState *env, uint64_t length)
{
if (!(env->psw.mask & PSW_MASK_64)) {
return (uint32_t)length;
}
return length;
}

static inline uint64_t wrap_length31(CPUS390XState *env, uint64_t length)
{
if (!(env->psw.mask & PSW_MASK_64)) {
/* 24-Bit and 31-Bit mode */
Expand All @@ -539,7 +547,7 @@ static inline uint64_t wrap_length(CPUS390XState *env, uint64_t length)

static inline uint64_t get_length(CPUS390XState *env, int reg)
{
return wrap_length(env, env->regs[reg]);
return wrap_length31(env, env->regs[reg]);
}

static inline void set_length(CPUS390XState *env, int reg, uint64_t length)
Expand Down Expand Up @@ -2378,7 +2386,7 @@ uint32_t HELPER(mvcos)(CPUS390XState *env, uint64_t dest, uint64_t src,
s390_program_interrupt(env, PGM_PRIVILEGED, 6, ra);
}

len = wrap_length(env, len);
len = wrap_length32(env, len);
if (len > 4096) {
cc = 3;
len = 4096;
Expand Down

0 comments on commit a762756

Please sign in to comment.