Message ID | 20220630094340.3646279-1-scgl@linux.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] target/s390x/tcg: SPX: check validity of new prefix | expand |
On 30/06/2022 11.43, Janis Schoetterl-Glausch wrote: > According to the architecture, SET PREFIX must try to access the new > prefix area and recognize an addressing exception if the area is not > accessible. > For qemu this check prevents a crash in cpu_map_lowcore after an > inaccessible prefix area has been set. > > Signed-off-by: Janis Schoetterl-Glausch <scgl@linux.ibm.com> > Reviewed-by: David Hildenbrand <david@redhat.com> > --- > target/s390x/tcg/misc_helper.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c > index aab9c47747..10dadb002a 100644 > --- a/target/s390x/tcg/misc_helper.c > +++ b/target/s390x/tcg/misc_helper.c > @@ -158,6 +158,13 @@ void HELPER(spx)(CPUS390XState *env, uint64_t a1) > if (prefix == old_prefix) { > return; > } > + /* > + * Since prefix got aligned to 8k and memory increments are a multiple of > + * 8k checking the first page is sufficient > + */ > + if (!mmu_absolute_addr_valid(prefix, true)) { > + tcg_s390_program_interrupt(env, PGM_ADDRESSING, GETPC()); > + } > > env->psa = prefix; > HELPER_LOG("prefix: %#x\n", prefix); Thanks, queued to my s390x-next branch now: https://gitlab.com/thuth/qemu/-/commits/s390x-next Thomas
diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c index aab9c47747..10dadb002a 100644 --- a/target/s390x/tcg/misc_helper.c +++ b/target/s390x/tcg/misc_helper.c @@ -158,6 +158,13 @@ void HELPER(spx)(CPUS390XState *env, uint64_t a1) if (prefix == old_prefix) { return; } + /* + * Since prefix got aligned to 8k and memory increments are a multiple of + * 8k checking the first page is sufficient + */ + if (!mmu_absolute_addr_valid(prefix, true)) { + tcg_s390_program_interrupt(env, PGM_ADDRESSING, GETPC()); + } env->psa = prefix; HELPER_LOG("prefix: %#x\n", prefix);