arm: vdso: inline assembler operations to compiler.h
PATCH v5 3/12 arm: vdso: inline assembler operations to compiler.h
Take an effort to recode the arm64 vdso code from assembler to C previously submitted by Andrew Pinski <[email protected]>, rework it for use in both arm and arm64, overlapping any optimizations for each architecture. But instead of landing it in arm64, land the result into lib/vdso and unify both implementations to simplify future maintenance.
Move compiler-specific code to a local compiler.h file:
- CONFIG_AEABI dependency check.
- System call fallback functions standardized into a DEFINE_FALLBACK macro.
- Replace arch_counter_get_cntvct() with arch_vdso_read_counter.
- Deal with architecture specific unresolved references emitted by GCC.
- Optimize handling of fallback calls in callers.
- For time functions that always return success, do not waste time checking return value for switch to fallback.
- Optimize unlikely nullptr checking in __vdso_gettimeofday, if tv null no need to proceed to fallback, as vdso is still capable of filling in the tv values.
v2:
- split first CL into 3 of 7 pieces
v4:
- switch to arch_vdso_read_counter as common API
- update commit message to reflect overall reasoning
v5:
- comment about asm/arch_timer.h and asm/processor.h regarding why they have been added in compiler.h for porting clarity.
- add linux/compiler.h in vgettimeofday.c because of notrace.
- remove unnecessary dependency on linux/hrtimer.h
--- arch/arm/vdso/compiler.h | 69 ++++++++++++++++++++++++++ arch/arm/vdso/vgettimeofday.c | 109 +++++++++++------------------------------- 2 files changed, 96 insertions(+), 82 deletions(-) create mode 100644 arch/arm/vdso/compiler.h
arch/arm/vdso/compiler.h new file +69 -0
@@ -0,0 +1,69 @@ +/* +* Userspace implementations of fallback calls +* +* Copyright (C) 2017 Cavium, Inc. +* Copyright (C) 2012 ARM Limited +* +* 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. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +* Author: Will Deacon <[email protected]> +* Rewriten into C by: Andrew Pinski <[email protected]> +*/ + +#ifndef __VDSO_COMPILER_H +#define __VDSO_COMPILER_H + +#include <asm/arch_timer.h> /* for arch_counter_get_cntvct() */ +#include <asm/processor.h> /* for cpu_relax() */ +#include <asm/unistd.h> +#include <linux/compiler.h> + +#ifndef CONFIG_AEABI +#error This code depends on AEABI system call conventions +#endif + +#define DEFINE_FALLBACK (name, type_arg1, name_arg1, type_arg2, name_arg2) \ +static notrace long name##_fallback(type_arg1 _##name_arg1, \ + type_arg2 _##name_arg2) \ +{ \ + register type_arg1 name_arg1 asm("r0") = _##name_arg1; \ + register type_arg2 name_arg2 asm("r1") = _##name_arg2; \ + register long ret asm ("r0"); \ + register long nr asm("r7") = __NR_##name; \ + \ + asm volatile( \ + " swi #0\n" \ + : "=r" (ret) \ + : "r" (name_arg1), "r" (name_arg2), "r" (nr) \ + : "memory"); \ + \ + return ret; \ +} + +#define arch_vdso_read_counter () arch_counter_get_cntvct() + +/* Avoid unresolved references emitted by GCC */ + +void __aeabi_unwind_cpp_pr0 (void ) +{ +} + +void __aeabi_unwind_cpp_pr1 (void ) +{ +} + +void __aeabi_unwind_cpp_pr2 (void ) +{ +} + +#endif /* __VDSO_COMPILER_H */
arch/arm/vdso/vgettimeofday.c +27 -82
163 lines not on this page · raw message
Signature · 1 line
2.15.0.403.gc27cc4dac6-goog