diff mbox series

[5.4,2/2] ARM: 9044/1: vfp: use undef hook for VFP support detection

Message ID 20210316165918.1794549-1-ndesaulniers@google.com
State New
Headers show
Series None | expand

Commit Message

Nick Desaulniers March 16, 2021, 4:59 p.m. UTC
From: Ard Biesheuvel <ardb@kernel.org>


commit 3cce9d44321e460e7c88cdec4e4537a6e9ad7c0d upstream.

Commit f77ac2e378be9dd6 ("ARM: 9030/1: entry: omit FP emulation for UND
exceptions taken in kernel mode") failed to take into account that there
is in fact a case where we relied on this code path: during boot, the
VFP detection code issues a read of FPSID, which will trigger an undef
exception on cores that lack VFP support.

So let's reinstate this logic using an undef hook which is registered
only for the duration of the initcall to vpf_init(), and which sets
VFP_arch to a non-zero value - as before - if no VFP support is present.

Fixes: f77ac2e378be9dd6 ("ARM: 9030/1: entry: omit FP emulation for UND ...")
Reported-by: "kernelci.org bot" <bot@kernelci.org>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>

Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>

---
This is meant to be applied on top of
https://lore.kernel.org/stable/20210315231952.1482097-1-ndesaulniers@google.com/.
If it's preferrable to send an .mbox file or a series with cover letter,
I'm happy to resend it as such, just let me know.

 arch/arm/vfp/entry.S     | 17 -----------------
 arch/arm/vfp/vfpmodule.c | 25 ++++++++++++++++++++-----
 2 files changed, 20 insertions(+), 22 deletions(-)

-- 
2.31.0.rc2.261.g7f71774620-goog

Comments

Greg Kroah-Hartman March 19, 2021, 10:06 a.m. UTC | #1
On Tue, Mar 16, 2021 at 09:59:18AM -0700, Nick Desaulniers wrote:
> From: Ard Biesheuvel <ardb@kernel.org>

> 

> commit 3cce9d44321e460e7c88cdec4e4537a6e9ad7c0d upstream.

> 

> Commit f77ac2e378be9dd6 ("ARM: 9030/1: entry: omit FP emulation for UND

> exceptions taken in kernel mode") failed to take into account that there

> is in fact a case where we relied on this code path: during boot, the

> VFP detection code issues a read of FPSID, which will trigger an undef

> exception on cores that lack VFP support.

> 

> So let's reinstate this logic using an undef hook which is registered

> only for the duration of the initcall to vpf_init(), and which sets

> VFP_arch to a non-zero value - as before - if no VFP support is present.

> 

> Fixes: f77ac2e378be9dd6 ("ARM: 9030/1: entry: omit FP emulation for UND ...")

> Reported-by: "kernelci.org bot" <bot@kernelci.org>

> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>

> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>

> Signed-off-by: Nick Desaulniers <ndesaulniers@google.com>

> ---

> This is meant to be applied on top of

> https://lore.kernel.org/stable/20210315231952.1482097-1-ndesaulniers@google.com/.

> If it's preferrable to send an .mbox file or a series with cover letter,

> I'm happy to resend it as such, just let me know.


Please resend it that way, makes it easier to figure out what is going
on here...

thanks,

greg k-h
Nick Desaulniers March 19, 2021, 8:14 p.m. UTC | #2
On Fri, Mar 19, 2021 at 3:06 AM Greg KH <gregkh@linuxfoundation.org> wrote:
>

> On Tue, Mar 16, 2021 at 09:59:18AM -0700, Nick Desaulniers wrote:

> > If it's preferrable to send an .mbox file or a series with cover letter,

> > I'm happy to resend it as such, just let me know.

>

> Please resend it that way, makes it easier to figure out what is going

> on here...


Dear stable kernel maintainers,
Please consider applying the following mbox file to linux-5.4.y.  It
contains 2 cherry-picks of `Fixes:` for a patch in 5.4.

Ard reported linux-5.4.y with CONFIG_THUMB2_KERNEL=y was broken without these in
https://lore.kernel.org/stable/CAMj1kXGLrVXZPAoxTtMueB9toeoktuKza-mRpd4vZ0SLN6bSSQ@mail.gmail.com/.

The mbox contains:
commit f77ac2e378be ("ARM: 9030/1: entry: omit FP emulation for UND
exceptions taken in kernel mode")
commit 3cce9d44321e ("ARM: 9044/1: vfp: use undef hook for VFP support
detection")

They first landed in v5.11-rc1.  The first is a fixup for:
commit eff8728fe698 ("vmlinux.lds.h: Add PGO and AutoFDO input sections")

which exists in 5.4.90 as 87ea51c90280.

The first has a conflict in arch/arm/vfp/vfphw.S due to missing
commit 2cbd1cc3dcd3 ("ARM: 8991/1: use VFP assembler mnemonics if available")]
in 5.4.  2cbd1cc3dcd3 causes breakage in ARCH=axm55xx_defconfig
previously reported:
https://lore.kernel.org/stable/be846d89-ab5a-f02a-c05e-1cd40acc5baa@roeck-us.net/
and will need to be reworked if we ever do backport it.
-- 
Thanks,
~Nick Desaulniers
Greg Kroah-Hartman March 20, 2021, 11:04 a.m. UTC | #3
On Fri, Mar 19, 2021 at 01:14:12PM -0700, Nick Desaulniers wrote:
> On Fri, Mar 19, 2021 at 3:06 AM Greg KH <gregkh@linuxfoundation.org> wrote:

> >

> > On Tue, Mar 16, 2021 at 09:59:18AM -0700, Nick Desaulniers wrote:

> > > If it's preferrable to send an .mbox file or a series with cover letter,

> > > I'm happy to resend it as such, just let me know.

> >

> > Please resend it that way, makes it easier to figure out what is going

> > on here...

> 

> Dear stable kernel maintainers,

> Please consider applying the following mbox file to linux-5.4.y.  It

> contains 2 cherry-picks of `Fixes:` for a patch in 5.4.

> 

> Ard reported linux-5.4.y with CONFIG_THUMB2_KERNEL=y was broken without these in

> https://lore.kernel.org/stable/CAMj1kXGLrVXZPAoxTtMueB9toeoktuKza-mRpd4vZ0SLN6bSSQ@mail.gmail.com/.

> 

> The mbox contains:

> commit f77ac2e378be ("ARM: 9030/1: entry: omit FP emulation for UND

> exceptions taken in kernel mode")

> commit 3cce9d44321e ("ARM: 9044/1: vfp: use undef hook for VFP support

> detection")

> 

> They first landed in v5.11-rc1.  The first is a fixup for:

> commit eff8728fe698 ("vmlinux.lds.h: Add PGO and AutoFDO input sections")

> 

> which exists in 5.4.90 as 87ea51c90280.

> 

> The first has a conflict in arch/arm/vfp/vfphw.S due to missing

> commit 2cbd1cc3dcd3 ("ARM: 8991/1: use VFP assembler mnemonics if available")]

> in 5.4.  2cbd1cc3dcd3 causes breakage in ARCH=axm55xx_defconfig

> previously reported:

> https://lore.kernel.org/stable/be846d89-ab5a-f02a-c05e-1cd40acc5baa@roeck-us.net/

> and will need to be reworked if we ever do backport it.


Now queued up, thanks.

greg k-h
diff mbox series

Patch

diff --git a/arch/arm/vfp/entry.S b/arch/arm/vfp/entry.S
index 0186cf9da890..27b0a1f27fbd 100644
--- a/arch/arm/vfp/entry.S
+++ b/arch/arm/vfp/entry.S
@@ -37,20 +37,3 @@  ENDPROC(vfp_null_entry)
 	.align	2
 .LCvfp:
 	.word	vfp_vector
-
-@ This code is called if the VFP does not exist. It needs to flag the
-@ failure to the VFP initialisation code.
-
-	__INIT
-ENTRY(vfp_testing_entry)
-	dec_preempt_count_ti r10, r4
-	ldr	r0, VFP_arch_address
-	str	r0, [r0]		@ set to non-zero value
-	ret	r9			@ we have handled the fault
-ENDPROC(vfp_testing_entry)
-
-	.align	2
-VFP_arch_address:
-	.word	VFP_arch
-
-	__FINIT
diff --git a/arch/arm/vfp/vfpmodule.c b/arch/arm/vfp/vfpmodule.c
index c3b6451c18bd..2cb355c1b5b7 100644
--- a/arch/arm/vfp/vfpmodule.c
+++ b/arch/arm/vfp/vfpmodule.c
@@ -32,7 +32,6 @@ 
 /*
  * Our undef handlers (in entry.S)
  */
-asmlinkage void vfp_testing_entry(void);
 asmlinkage void vfp_support_entry(void);
 asmlinkage void vfp_null_entry(void);
 
@@ -43,7 +42,7 @@  asmlinkage void (*vfp_vector)(void) = vfp_null_entry;
  * Used in startup: set to non-zero if VFP checks fail
  * After startup, holds VFP architecture
  */
-unsigned int VFP_arch;
+static unsigned int __initdata VFP_arch;
 
 /*
  * The pointer to the vfpstate structure of the thread which currently
@@ -437,7 +436,7 @@  static void vfp_enable(void *unused)
  * present on all CPUs within a SMP complex. Needs to be called prior to
  * vfp_init().
  */
-void vfp_disable(void)
+void __init vfp_disable(void)
 {
 	if (VFP_arch) {
 		pr_debug("%s: should be called prior to vfp_init\n", __func__);
@@ -707,7 +706,7 @@  static int __init vfp_kmode_exception_hook_init(void)
 		register_undef_hook(&vfp_kmode_exception_hook[i]);
 	return 0;
 }
-core_initcall(vfp_kmode_exception_hook_init);
+subsys_initcall(vfp_kmode_exception_hook_init);
 
 /*
  * Kernel-side NEON support functions
@@ -753,6 +752,21 @@  EXPORT_SYMBOL(kernel_neon_end);
 
 #endif /* CONFIG_KERNEL_MODE_NEON */
 
+static int __init vfp_detect(struct pt_regs *regs, unsigned int instr)
+{
+	VFP_arch = UINT_MAX;	/* mark as not present */
+	regs->ARM_pc += 4;
+	return 0;
+}
+
+static struct undef_hook vfp_detect_hook __initdata = {
+	.instr_mask	= 0x0c000e00,
+	.instr_val	= 0x0c000a00,
+	.cpsr_mask	= MODE_MASK,
+	.cpsr_val	= SVC_MODE,
+	.fn		= vfp_detect,
+};
+
 /*
  * VFP support code initialisation.
  */
@@ -773,10 +787,11 @@  static int __init vfp_init(void)
 	 * The handler is already setup to just log calls, so
 	 * we just need to read the VFPSID register.
 	 */
-	vfp_vector = vfp_testing_entry;
+	register_undef_hook(&vfp_detect_hook);
 	barrier();
 	vfpsid = fmrx(FPSID);
 	barrier();
+	unregister_undef_hook(&vfp_detect_hook);
 	vfp_vector = vfp_null_entry;
 
 	pr_info("VFP support v0.3: ");