Commit dae904d9 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Russell King (Oracle)
Browse files

ARM: 9292/1: vfp: Pass thread_info pointer to vfp_support_entry



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: default avatarArd Biesheuvel <ardb@kernel.org>
Reviewed-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Tested-by: default avatarGuenter Roeck <linux@roeck-us.net>
Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
parent 197b6b60
Loading
Loading
Loading
Loading
+1 −4
Original line number Original line Diff line number Diff line
@@ -22,15 +22,12 @@
@  IRQs enabled.
@  IRQs enabled.
@
@
ENTRY(do_vfp)
ENTRY(do_vfp)
	local_bh_disable r10, r4
	mov	r1, r10
 	ldr	r4, .LCvfp
 	ldr	r4, .LCvfp
	ldr	r11, [r10, #TI_CPU]	@ CPU number
	add	r10, r10, #TI_VFPSTATE	@ r10 = workspace
	ldr	pc, [r4]		@ call VFP entry point
	ldr	pc, [r4]		@ call VFP entry point
ENDPROC(do_vfp)
ENDPROC(do_vfp)


ENTRY(vfp_null_entry)
ENTRY(vfp_null_entry)
	local_bh_enable_ti r10, r4
	ret	lr
	ret	lr
ENDPROC(vfp_null_entry)
ENDPROC(vfp_null_entry)


+7 −3
Original line number Original line Diff line number Diff line
@@ -6,9 +6,9 @@
 *  Written by Deep Blue Solutions Limited.
 *  Written by Deep Blue Solutions Limited.
 *
 *
 * This code is called from the kernel's undefined instruction trap.
 * 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.
 * r9 holds the return address for successful handling.
 * lr holds the return address for unrecognised instructions.
 * 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)
 * sp points to a struct pt_regs (as defined in include/asm/proc/ptrace.h)
 */
 */
#include <linux/init.h>
#include <linux/init.h>
@@ -69,13 +69,17 @@
@ VFP hardware support entry point.
@ VFP hardware support entry point.
@
@
@  r0  = instruction opcode (32-bit ARM or two 16-bit Thumb)
@  r0  = instruction opcode (32-bit ARM or two 16-bit Thumb)
@  r1  = thread_info pointer
@  r2  = PC value to resume execution after successful emulation
@  r2  = PC value to resume execution after successful emulation
@  r9  = normal "successful" return address
@  r9  = normal "successful" return address
@  r10 = vfp_state union
@  r11 = CPU number
@  lr  = unrecognised instruction return address
@  lr  = unrecognised instruction return address
@  IRQs enabled.
@  IRQs enabled.
ENTRY(vfp_support_entry)
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
	DBGSTR3	"instr %08x pc %08x state %p", r0, r2, r10


	.fpu	vfpv2
	.fpu	vfpv2