[PATCH v2] ARM: entry: omit FP emulation for UND exceptions taken in kernel mode
Dmitry Osipenko
digetx at gmail.com
Wed Nov 25 17:45:06 EST 2020
25.11.2020 10:00, Ard Biesheuvel пишет:
> On Tue, 24 Nov 2020 at 23:59, Dmitry Osipenko <digetx at gmail.com> wrote:
>>
>> 18.11.2020 16:08, Ard Biesheuvel пишет:
>>> diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S
>>> index c4220f51fcf3..0ea8529a4872 100644
>>> --- a/arch/arm/kernel/entry-armv.S
>>> +++ b/arch/arm/kernel/entry-armv.S
>>> @@ -252,31 +252,10 @@ __und_svc:
>>> #else
>>> svc_entry
>>> #endif
>>> - @
>>> - @ call emulation code, which returns using r9 if it has emulated
>>> - @ the instruction, or the more conventional lr if we are to treat
>>> - @ this as a real undefined instruction
>>> - @
>>> - @ r0 - instruction
>>> - @
>>> -#ifndef CONFIG_THUMB2_KERNEL
>>> - ldr r0, [r4, #-4]
>>> -#else
>>> - mov r1, #2
>>> - ldrh r0, [r4, #-2] @ Thumb instruction at LR - 2
>>> - cmp r0, #0xe800 @ 32-bit instruction if xx >= 0
>>> - blo __und_svc_fault
>>> - ldrh r9, [r4] @ bottom 16 bits
>>> - add r4, r4, #2
>>> - str r4, [sp, #S_PC]
>>> - orr r0, r9, r0, lsl #16
>>> -#endif
>>> - badr r9, __und_svc_finish
>>> - mov r2, r4
>>> - bl call_fpe
>>>
>>> mov r1, #4 @ PC correction to apply
>>> -__und_svc_fault:
>>> + THUMB( tst r5, #PSR_T_BIT ) @ exception taken in Thumb mode?
>>> + THUMB( movne r1, #2 ) @ if so, fix up PC correction
>>> mov r0, sp @ struct pt_regs *regs
>>> bl __und_fault
>>
>> Am I understanding correctly that when call_fpe was invoked previously,
>> it was supposed to print extra debug info about the VFP state? But it
>> didn't work properly for thumb mode, correct?
>
> call_fpe was originally called to perform emulation of any UNDEF
> instruction that matched the same constraints that also apply when the
> UNDEF is taken in user mode. If the UNDEF was triggered by a VFP/NEON
> instruction, the VFP handler would check for kernel or user mode, and
> trigger an error if the exception was taken in kernel mode.
>
> The Thumb mode opcode matching was wrong in this case, so if a Thumb2
> NEON exception triggered an UNDEF exception in kernel mode (which only
> happens if there are bugs in the kernel) we would fail to identify it
> as a NEON instruction.
>
> This code removes the call into the emulation code from kernel mode
> entirely, as it no longer has valid users, and the invalid ones can
> simply be served by undef hooks.
>
Thanks, that's a cleaner explanation in comparison to the commit
message. Would be nice to have an improved commit message, although
maybe not really worth the v3, either way:
Reviwed-by: Dmitry Osipenko <digetx at gmail.com>
Tested-by: Dmitry Osipenko <digetx at gmail.com>
More information about the linux-arm-kernel
mailing list