[PATCH v3 0/4] ARM: vfp: Switch to C API to en/disable softirqs

Guenter Roeck linux at roeck-us.net
Thu Mar 16 17:24:26 PDT 2023


On 3/16/23 17:23, Guenter Roeck wrote:
> On 3/16/23 01:20, Ard Biesheuvel wrote:
>> As it turns out, enabling or disabling softirqs from asm code is more
>> tricky than it looks. Simply bumping the associated bit in preempt_count
>> does the trick for uninstrumented kernels, but with lockdep or preempt
>> debug enabled, we really need to call the C versions, as replicating
>> their behavior in asm fully is intractible.
>>
>> So let's rework the existing code a little bit so we can interpose a
>> little C helper 'vfp_entry()' that disables softirqs before calling the
>> existing vfpstate handling code in asm. Re-enabling softirqs from asm
>> code is more straight-forward, as we can simply perform a tail call via
>> a C routine that is guaranteed to be callable as a function.
>>
>> However, since calling these APIs from asm code is still not ideal,
>> let's reimplement the whole thing in C (patch #4)
>>
>>
>> Changes since v2:
>> - add Rbs and Tbs from Linus and Guenter (thanks!)
>> - correct reference to local_bh_enable() vs __local_bh_enable_ip() in
>>    commit log of patch #3
>> - add patch that reworks the asm VFP exception handling entirely so the
>>    bulk of it is implemented in C. This could be taken into v6.4, while
>>    the  preceding patches are fixes for v6.3-rc
>>
>> Cc: Frederic Weisbecker <frederic at kernel.org>
>> Cc: Guenter Roeck <linux at roeck-us.net>
>> Cc: Peter Zijlstra <peterz at infradead.org>
>> Cc: Linus Walleij <linus.walleij at linaro.org>
>> Cc: Arnd Bergmann <arnd at arndb.de>
>> Link: https://lore.kernel.org/all/ZBBYCSZUJOWBg1s8@localhost.localdomain/
>>
>> Ard Biesheuvel (4):
>>    ARM: vfp: Pass thread_info pointer to vfp_support_entry
>>    ARM: vfp: Pass successful return address via register R3
>>    ARM: vfp: Fix broken softirq handling with instrumentation enabled
>>    ARM: vfp: Reimplement VFP exception entry in C code
>>
>>   arch/arm/include/asm/assembler.h |  13 --
>>   arch/arm/kernel/entry-armv.S     |  12 ++
>>   arch/arm/vfp/Makefile            |   2 +-
>>   arch/arm/vfp/entry.S             |  39 ----
>>   arch/arm/vfp/vfp.h               |   1 +
>>   arch/arm/vfp/vfphw.S             | 198 ++------------------
>>   arch/arm/vfp/vfpmodule.c         | 125 +++++++++++-
>>   7 files changed, 142 insertions(+), 248 deletions(-)
>>   delete mode 100644 arch/arm/vfp/entry.S
>>
> 
> After applying this series, imx_v4_v5_defconfig and aspeed_g4_defconfig
> (and maybe others) fail to build:
> 
> arm-linux-gnueabi-ld: arch/arm/kernel/entry-armv.o: in function `do_vfp':
> (.entry.text+0x5a4): undefined reference to `vfp_entry'
> make[1]: *** [scripts/Makefile.vmlinux:35: vmlinux] Error 1
> make: *** [Makefile:1250: vmlinux] Error 2
> 

... and reverting the last patch of the series fixes the problem.

Guenter




More information about the linux-arm-kernel mailing list