ARM: 9292/1: vfp: Pass thread_info pointer to vfp_support_entry
authorArd Biesheuvel <ardb@kernel.org>
Tue, 21 Mar 2023 11:01:02 +0000 (12:01 +0100)
committerRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
Tue, 11 Apr 2023 10:07:08 +0000 (11:07 +0100)
Instead of dereferencing thread_info in do_vfp, pass the thread_info
pointer to vfp_support_entry via R1. That way, we only use a single
caller save register, which makes it easier to convert do_vfp to C code
in a subsequent patch.

Note that, unlike the CPU number, which can change due to preemption,
passing the thread_info pointer can safely be done with preemption
enabled.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
arch/arm/vfp/entry.S
arch/arm/vfp/vfphw.S

index 9a89264..cfedc2a 100644 (file)
 @  IRQs enabled.
 @
 ENTRY(do_vfp)
-       local_bh_disable r10, r4
+       mov     r1, r10
        ldr     r4, .LCvfp
-       ldr     r11, [r10, #TI_CPU]     @ CPU number
-       add     r10, r10, #TI_VFPSTATE  @ r10 = workspace
        ldr     pc, [r4]                @ call VFP entry point
 ENDPROC(do_vfp)
 
 ENTRY(vfp_null_entry)
-       local_bh_enable_ti r10, r4
        ret     lr
 ENDPROC(vfp_null_entry)
 
index 26c4f61..6d056d8 100644 (file)
@@ -6,9 +6,9 @@
  *  Written by Deep Blue Solutions Limited.
  *
  * This code is called from the kernel's undefined instruction trap.
+ * r1 holds the thread_info pointer
  * r9 holds the return address for successful handling.
  * lr holds the return address for unrecognised instructions.
- * r10 points at the start of the private FP workspace in the thread structure
  * sp points to a struct pt_regs (as defined in include/asm/proc/ptrace.h)
  */
 #include <linux/init.h>
 @ VFP hardware support entry point.
 @
 @  r0  = instruction opcode (32-bit ARM or two 16-bit Thumb)
+@  r1  = thread_info pointer
 @  r2  = PC value to resume execution after successful emulation
 @  r9  = normal "successful" return address
-@  r10 = vfp_state union
-@  r11 = CPU number
 @  lr  = unrecognised instruction return address
 @  IRQs enabled.
 ENTRY(vfp_support_entry)
+       local_bh_disable r1, r4
+
+       ldr     r11, [r1, #TI_CPU]      @ CPU number
+       add     r10, r1, #TI_VFPSTATE   @ r10 = workspace
+
        DBGSTR3 "instr %08x pc %08x state %p", r0, r2, r10
 
        .fpu    vfpv2