On 1/14/22 4:19 AM, Peter Maydell wrote:
> On Sun, 9 Jan 2022 at 16:27, Warner Losh <imp@bsdimp.com> wrote:
>>
>> Use force_sig_fault to implement unknown opcode. This just uninlines
>> that function, so simplify things by using it. Fold in EXCP_NOCP and
>> EXCP_INVSTATE, as is done in linux-user.
>>
>> Signed-off-by: Warner Losh <imp@bsdimp.com>
>> ---
>> bsd-user/arm/target_arch_cpu.h | 18 ++++++------------
>> 1 file changed, 6 insertions(+), 12 deletions(-)
>>
>> diff --git a/bsd-user/arm/target_arch_cpu.h b/bsd-user/arm/target_arch_cpu.h
>> index 905f13aa1b9..996a361e3fe 100644
>> --- a/bsd-user/arm/target_arch_cpu.h
>> +++ b/bsd-user/arm/target_arch_cpu.h
>> @@ -51,18 +51,12 @@ static inline void target_cpu_loop(CPUARMState *env)
>> process_queued_cpu_work(cs);
>> switch (trapnr) {
>> case EXCP_UDEF:
>> - {
>> - /* See arm/arm/undefined.c undefinedinstruction(); */
>> - info.si_addr = env->regs[15];
>> -
>> - /* illegal instruction */
>> - info.si_signo = TARGET_SIGILL;
>> - info.si_errno = 0;
>> - info.si_code = TARGET_ILL_ILLOPC;
>> - queue_signal(env, info.si_signo, &info);
>> -
>> - /* TODO: What about instruction emulation? */
>> - }
>> + case EXCP_NOCP:
>> + case EXCP_INVSTATE:
>> + /*
>> + * See arm/arm/undefined.c undefinedinstruction();
>> + */
>> + force_sig_fault(TARGET_SIGILL, TARGET_ILL_ILLOPC, env->regs[15]);
>> break;
>
> Do you want to keep the TODO comment ?
>
> Either way,
> Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
>
> (Looks like FreeBSD sends SIGILL/ILL_ILLADR for UNDEF where the PC
> is misaligned and we're not in Thumb mode, but that's a pretty oddball
> corner case so not really worth emulating.)
For qemu, that case will never happen: we'll raise EXCP_PREFETCH_ABORT with fsr=1
(Alignment). The freebsd kernel might have this code because the behaviour with real hw
is CONSTRAINED UNPREDICTABLE (iirc).
Anyway,
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
r~