-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ARM: add support for kernel mode NEON
In order to safely support the use of NEON instructions in kernel mode, some precautions need to be taken: - the userland context that may be present in the registers (even if the NEON/VFP is currently disabled) must be stored under the correct task (which may not be 'current' in the UP case), - to avoid having to keep track of additional vfpstates for the kernel side, disallow the use of NEON in interrupt context and run with preemption disabled, - after use, re-enable preemption and re-enable the lazy restore machinery by disabling the NEON/VFP unit. This patch adds the functions kernel_neon_begin() and kernel_neon_end() which take care of the above. It also adds the Kconfig symbol KERNEL_MODE_NEON to enable it. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Acked-by: Nicolas Pitre <nico@linaro.org>
- Loading branch information
Ard Biesheuvel
committed
Jul 8, 2013
1 parent
ab3da15
commit 73c132c
Showing
3 changed files
with
90 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* linux/arch/arm/include/asm/neon.h | ||
* | ||
* Copyright (C) 2013 Linaro Ltd <ard.biesheuvel@linaro.org> | ||
* | ||
* This program is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU General Public License version 2 as | ||
* published by the Free Software Foundation. | ||
*/ | ||
|
||
#include <asm/hwcap.h> | ||
|
||
#define cpu_has_neon() (!!(elf_hwcap & HWCAP_NEON)) | ||
|
||
#ifdef __ARM_NEON__ | ||
|
||
/* | ||
* If you are affected by the BUILD_BUG below, it probably means that you are | ||
* using NEON code /and/ calling the kernel_neon_begin() function from the same | ||
* compilation unit. To prevent issues that may arise from GCC reordering or | ||
* generating(1) NEON instructions outside of these begin/end functions, the | ||
* only supported way of using NEON code in the kernel is by isolating it in a | ||
* separate compilation unit, and calling it from another unit from inside a | ||
* kernel_neon_begin/kernel_neon_end pair. | ||
* | ||
* (1) Current GCC (4.7) might generate NEON instructions at O3 level if | ||
* -mpfu=neon is set. | ||
*/ | ||
|
||
#define kernel_neon_begin() \ | ||
BUILD_BUG_ON_MSG(1, "kernel_neon_begin() called from NEON code") | ||
|
||
#else | ||
void kernel_neon_begin(void); | ||
#endif | ||
void kernel_neon_end(void); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters