target/s390x: Rely on unwinding in s390_cpu_tlb_fill

We currently set ilen to AUTO, then overwrite that during
unwinding, then overwrite that for the code access case.

This can be simplified to setting ilen to our arbitrary
value for the (undefined) code access case, then rely on
unwinding to overwrite that with the correct value for
the data access case.

Reviewed-by: David Hildenbrand <david@redhat.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20191001171614.8405-14-richard.henderson@linaro.org>
Signed-off-by: David Hildenbrand <david@redhat.com>
This commit is contained in:
Richard Henderson 2019-10-01 10:16:09 -07:00 committed by David Hildenbrand
parent 9accc852d8
commit 9e1dae315f
1 changed files with 7 additions and 16 deletions

View File

@ -96,7 +96,7 @@ bool s390_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
{ {
S390CPU *cpu = S390_CPU(cs); S390CPU *cpu = S390_CPU(cs);
trigger_pgm_exception(&cpu->env, PGM_ADDRESSING, ILEN_AUTO); trigger_pgm_exception(&cpu->env, PGM_ADDRESSING, ILEN_UNWIND);
/* On real machines this value is dropped into LowMem. Since this /* On real machines this value is dropped into LowMem. Since this
is userland, simply put this someplace that cpu_loop can find it. */ is userland, simply put this someplace that cpu_loop can find it. */
cpu->env.__excp_addr = address; cpu->env.__excp_addr = address;
@ -179,24 +179,15 @@ bool s390_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
stq_phys(env_cpu(env)->as, stq_phys(env_cpu(env)->as,
env->psa + offsetof(LowCore, trans_exc_code), tec); env->psa + offsetof(LowCore, trans_exc_code), tec);
} }
trigger_pgm_exception(env, excp, ILEN_AUTO);
cpu_restore_state(cs, retaddr, true);
/* /*
* The ILC value for code accesses is undefined. The important * For data accesses, ILEN will be filled in from the unwind info,
* thing here is to *not* leave env->int_pgm_ilen set to ILEN_AUTO, * within cpu_loop_exit_restore. For code accesses, retaddr == 0,
* which would cause do_program_interrupt to attempt to read from * and so unwinding will not occur. However, ILEN is also undefined
* env->psw.addr again. C.f. the condition in trigger_page_fault, * for that case -- we choose to set ILEN = 2.
* but is not universally applied.
*
* ??? If we remove ILEN_AUTO, by moving the computation of ILEN
* into cpu_restore_state, then we may remove this entirely.
*/ */
if (access_type == MMU_INST_FETCH) { trigger_pgm_exception(env, excp, 2);
env->int_pgm_ilen = 2; cpu_loop_exit_restore(cs, retaddr);
}
cpu_loop_exit(cs);
} }
static void do_program_interrupt(CPUS390XState *env) static void do_program_interrupt(CPUS390XState *env)