On Thu, 5 Aug 2021 14:59:38 +0200 David Hildenbrand <da...@redhat.com> wrote:
> We not only invalidate the translation of the range 0x0-0x2000, we > also invalidate the translation of the new prefix range and the > translation of the old prefix range -- because real2abs would return > different results for all of these ranges when changing the prefix > location. looks like a good idea > This fixes the kvm-unit-tests "edat" test that just hangs before this > patch because we end up clearing the new prefix area instead of the > old prefix area. > > While at it, let's not do anything in case the prefix doesn't change. also looks like a good idea Reviewed-by: Claudio Imbrenda <imbre...@linux.ibm.com> > Cc: Richard Henderson <richard.hender...@linaro.org> > Cc: David Hildenbrand <da...@redhat.com> > Cc: Cornelia Huck <coh...@redhat.com> > Cc: Thomas Huth <th...@redhat.com> > Cc: Claudio Imbrenda <imbre...@linux.ibm.com> > Cc: qemu-s3...@nongnu.org > Signed-off-by: David Hildenbrand <da...@redhat.com> > --- > target/s390x/tcg/misc_helper.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/target/s390x/tcg/misc_helper.c > b/target/s390x/tcg/misc_helper.c index 33e6999e15..aab9c47747 100644 > --- a/target/s390x/tcg/misc_helper.c > +++ b/target/s390x/tcg/misc_helper.c > @@ -151,13 +151,26 @@ void HELPER(diag)(CPUS390XState *env, uint32_t > r1, uint32_t r3, uint32_t num) /* Set Prefix */ > void HELPER(spx)(CPUS390XState *env, uint64_t a1) > { > + const uint32_t prefix = a1 & 0x7fffe000; > + const uint32_t old_prefix = env->psa; > CPUState *cs = env_cpu(env); > - uint32_t prefix = a1 & 0x7fffe000; > + > + if (prefix == old_prefix) { > + return; > + } > > env->psa = prefix; > HELPER_LOG("prefix: %#x\n", prefix); > tlb_flush_page(cs, 0); > tlb_flush_page(cs, TARGET_PAGE_SIZE); > + if (prefix != 0) { > + tlb_flush_page(cs, prefix); > + tlb_flush_page(cs, prefix + TARGET_PAGE_SIZE); > + } > + if (old_prefix != 0) { > + tlb_flush_page(cs, old_prefix); > + tlb_flush_page(cs, old_prefix + TARGET_PAGE_SIZE); > + } > } > > static void update_ckc_timer(CPUS390XState *env)