ARM SMC Calling Convention interface
v7 cover ARM SMC Calling Convention interface
Hi,
This patch set is based on the Generic TEE subsystem v6 patchset
(https://lwn.net/Articles/662495/) sent out a some time ago. By isolating the ARM SMC Calling Convention patches that are useful for other purposes than to support the Generic TEE subsystem some complexity is removed from that patch set.
This patch set adds a common interface to do an SMC or HVC following ARM SMC Calling Convention. The interface is implemented for both the arm and arm64 architectures and updates the PSCI driver to use this interface instead for firmware communication.
Kevins previous Tested-by tag isn't included as the changes in the config variables may affect some of the builds.
v7:
* Use shift macros for all fields supplied to ARM_SMCCC_CALL_VAL()
* Move "select HAVE_ARM_SMCCC if CPU_V7" from "select HAVE_ARM_SMCCC if CPU_V7"
* arm: "config ARM_PSCI" now depends on HAVE_ARM_SMCCC instead of CPU_V7
v6:
* Move HAVE_ARM_SMCCC from init/Kconfig
v5:
* Fixes compile errors for Thumb-2 kernels reported by Kevin Hilman
* drivers: psci: replace psci firmware calls
v4:
* Rebased on v4.4-rc3 to resolve a PSCI conflict
* drivers: psci: replace psci firmware calls
v3:
* Moved the export of arm_smccc_{smc,hvc} to armksyms.c for both arm and arm64
* arm: add implementation for arm-smccc
* arm64: add implementation for arm-smccc
drivers: psci: replace psci firmware calls
v2:
* Added unwinding support in the assembly functions
Thanks,
Jens
Jens Wiklander (4):
arm/arm64: add arm-smccc
arm: add implementation for arm-smccc
arm64: add implementation for arm-smccc
drivers: psci: replace psci firmware calls
arch/Kconfig | 3 ++ arch/arm/Kconfig | 3 +- arch/arm/kernel/Makefile | 3 +- arch/arm/kernel/armksyms.c | 6 +++ arch/arm/kernel/psci-call.S | 31 ------------ arch/arm/kernel/smccc-call.S | 62 ++++++++++++++++++++++++ arch/arm64/Kconfig | 1 + arch/arm64/kernel/Makefile | 4 +- arch/arm64/kernel/arm64ksyms.c | 5 ++ arch/arm64/kernel/asm-offsets.c | 3 ++ arch/arm64/kernel/psci-call.S | 28 ----------- arch/arm64/kernel/smccc-call.S | 43 +++++++++++++++++ drivers/firmware/psci.c | 23 ++++++++- include/linux/arm-smccc.h | 104 ++++++++++++++++++++++++++++++++++++++++ 14 files changed, 254 insertions(+), 65 deletions(-) delete mode 100644 arch/arm/kernel/psci-call.S create mode 100644 arch/arm/kernel/smccc-call.S delete mode 100644 arch/arm64/kernel/psci-call.S create mode 100644 arch/arm64/kernel/smccc-call.S create mode 100644 include/linux/arm-smccc.h
Signature · 1 line
1.9.1
PATCH v7 1/4 arm/arm64: add arm-smccc
Adds helpers to do SMC and HVC based on ARM SMC Calling Convention. CONFIG_HAVE_ARM_SMCCC is enabled for architectures that may support the SMC or HVC instruction. It's the responsibility of the caller to know if the SMC instruction is supported by the platform.
This patch doesn't provide an implementation of the declared functions. Later patches will bring in implementations and set CONFIG_HAVE_ARM_SMCCC for ARM and ARM64 respectively.
--- arch/Kconfig | 3 ++ include/linux/arm-smccc.h | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 include/linux/arm-smccc.h
arch/Kconfig +3 -0
@@ -564,4 +564,7 @@ config OLD_SIGACTION config COMPAT_OLD_SIGACTION bool +config HAVE_ARM_SMCCC + bool + source "kernel/gcov/Kconfig"
include/linux/arm-smccc.h new file +104 -0
104 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v7 2/4 arm: add implementation for arm-smccc
In reply to Jens WiklanderAdds implementation for arm-smccc and enables CONFIG_HAVE_SMCCC for architectures that may support arm-smccc. It's the responsibility of the caller to know if the SMC instruction is supported by the platform.
--- arch/arm/Kconfig | 1 + arch/arm/kernel/Makefile | 2 ++ arch/arm/kernel/armksyms.c | 6 +++++ arch/arm/kernel/smccc-call.S | 62 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+) create mode 100644 arch/arm/kernel/smccc-call.S
arch/arm/Kconfig +1 -0
@@ -37,6 +37,7 @@ config ARM select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT) select HAVE_ARCH_TRACEHOOK + select HAVE_ARM_SMCCC if CPU_V7 select HAVE_BPF_JIT select HAVE_CC_STACKPROTECTOR select HAVE_CONTEXT_TRACKING
arch/arm/kernel/Makefile +2 -0
@@ -92,4 +92,6 @@ obj-y += psci-call.o obj-$(CONFIG_SMP) += psci_smp.o endif +obj-$(CONFIG_HAVE_ARM_SMCCC) += smccc-call.o + extra-y := $(head-y) vmlinux.lds
arch/arm/kernel/armksyms.c +6 -0
@@ -16,6 +16,7 @@#include <linux/syscalls.h> #include <linux/uaccess.h> #include <linux/io.h> +#include <linux/arm-smccc.h> #include <asm/checksum.h> #include <asm/ftrace.h>
@@ -175,3 +176,8 @@ EXPORT_SYMBOL(__gnu_mcount_nc);EXPORT_SYMBOL (__pv_phys_pfn_offset);EXPORT_SYMBOL (__pv_offset);#endif + +#ifdef CONFIG_HAVE_ARM_SMCCC +EXPORT_SYMBOL (arm_smccc_smc); +EXPORT_SYMBOL (arm_smccc_hvc); +#endif
arch/arm/kernel/smccc-call.S new file +62 -0
62 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v7 3/4 arm64: add implementation for arm-smccc
In reply to Jens WiklanderAdds implementation for arm-smccc and enables CONFIG_HAVE_SMCCC.
--- arch/arm64/Kconfig | 1 + arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/arm64ksyms.c | 5 +++++ arch/arm64/kernel/asm-offsets.c | 3 +++ arch/arm64/kernel/smccc-call.S | 43 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 arch/arm64/kernel/smccc-call.S
arch/arm64/Kconfig +1 -0
@@ -92,6 +92,7 @@ config ARM64 select SPARSE_IRQ select SYSCTL_EXCEPTION_TRACE select HAVE_CONTEXT_TRACKING + select HAVE_ARM_SMCCC help ARM 64-bit (AArch64) Linux support.
arch/arm64/kernel/Makefile +1 -1
@@ -17,7 +17,7 @@ arm64-obj-y := debug-monitors.o entry.o irq.o fpsimd.o \ hyp-stub.o psci.o psci-call.o cpu_ops.o insn.o \ return_address.o cpuinfo.o cpu_errata.o \ cpufeature.o alternative.o cacheinfo.o \ - smp.o smp_spin_table.o topology.o + smp.o smp_spin_table.o topology.o smccc-call.o extra-$(CONFIG_EFI) := efi-entry.o
arch/arm64/kernel/arm64ksyms.c +5 -0
@@ -26,6 +26,7 @@#include <linux/syscalls.h> #include <linux/uaccess.h> #include <linux/io.h> +#include <linux/arm-smccc.h> #include <asm/checksum.h>
@@ -68,3 +69,7 @@ EXPORT_SYMBOL(test_and_change_bit);#ifdef CONFIG_FUNCTION_TRACER EXPORT_SYMBOL (_mcount);#endif + +/* arm-smccc */ +EXPORT_SYMBOL (arm_smccc_smc); +EXPORT_SYMBOL (arm_smccc_hvc);
arch/arm64/kernel/asm-offsets.c +3 -0
@@ -28,6 +28,7 @@#include <asm/suspend.h> #include <asm/vdso_datapage.h> #include <linux/kbuild.h> +#include <linux/arm-smccc.h> int main (void ) {
@@ -161,5 +162,7 @@ int main(void)DEFINE (SLEEP_SAVE_SP_PHYS , offsetof(struct sleep_save_sp , save_ptr_stash_phys));DEFINE (SLEEP_SAVE_SP_VIRT , offsetof(struct sleep_save_sp , save_ptr_stash));#endif +DEFINE (ARM_SMCCC_RES_X0_OFFS , offsetof(struct arm_smccc_res , a0)); +DEFINE (ARM_SMCCC_RES_X2_OFFS , offsetof(struct arm_smccc_res , a2));return 0 ; }
arch/arm64/kernel/smccc-call.S new file +43 -0
43 lines not on this page · raw message
Signature · 1 line
1.9.1
PATCH v7 4/4 drivers: psci: replace psci firmware calls
In reply to Jens WiklanderSwitch to use a generic interface for issuing SMC/HVC based on ARM SMC Calling Convention. Removes now the now unused psci-call.S.
--- arch/arm/Kconfig | 2 +- arch/arm/kernel/Makefile | 1 - arch/arm/kernel/psci-call.S | 31 ------------------------------- arch/arm64/kernel/Makefile | 2 +- arch/arm64/kernel/psci-call.S | 28 ---------------------------- drivers/firmware/psci.c | 23 +++++++++++++++++++++-- 6 files changed, 23 insertions(+), 64 deletions(-) delete mode 100644 arch/arm/kernel/psci-call.S delete mode 100644 arch/arm64/kernel/psci-call.S
arch/arm/Kconfig +1 -1
@@ -1482,7 +1482,7 @@ config HOTPLUG_CPU config ARM_PSCI bool "Support for the ARM Power State Coordination Interface (PSCI)" - depends on CPU_V7 + depends on HAVE_ARM_SMCCC select ARM_PSCI_FW help Say Y here if you want Linux to communicate with system firmware
arch/arm/kernel/Makefile +0 -1
@@ -88,7 +88,6 @@ obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_ARM_VIRT_EXT) += hyp-stub.o ifeq ($(CONFIG_ARM_PSCI),y) -obj-y += psci-call.o obj-$(CONFIG_SMP) += psci_smp.o endif
arch/arm/kernel/psci-call.S deleted +0 -31
@@ -1,31 +0,0 @@ -/* - * 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. - * - * Copyright (C) 2015 ARM Limited - * - * Author: Mark Rutland <[email protected]> - */ - -#include <linux/linkage.h> - -#include <asm/opcodes-sec.h> -#include <asm/opcodes-virt.h> - -/* int __invoke_psci_fn_hvc(u32 function_id, u32 arg0, u32 arg1, u32 arg2) */ -ENTRY(__invoke_psci_fn_hvc) - __HVC(0) - bx lr -ENDPROC(__invoke_psci_fn_hvc) - -/* int __invoke_psci_fn_smc(u32 function_id, u32 arg0, u32 arg1, u32 arg2) */ -ENTRY(__invoke_psci_fn_smc) - __SMC(0) - bx lr -ENDPROC(__invoke_psci_fn_smc)
arch/arm64/kernel/Makefile +1 -1
@@ -14,7 +14,7 @@ CFLAGS_REMOVE_return_address.o = -pg arm64-obj-y := debug-monitors.o entry.o irq.o fpsimd.o \ entry-fpsimd.o process.o ptrace.o setup.o signal.o \ sys.o stacktrace.o time.o traps.o io.o vdso.o \ - hyp-stub.o psci.o psci-call.o cpu_ops.o insn.o \ + hyp-stub.o psci.o cpu_ops.o insn.o \ return_address.o cpuinfo.o cpu_errata.o \ cpufeature.o alternative.o cacheinfo.o \ smp.o smp_spin_table.o topology.o smccc-call.o
arch/arm64/kernel/psci-call.S deleted +0 -28
@@ -1,28 +0,0 @@ -/* - * 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. - * - * Copyright (C) 2015 ARM Limited - * - * Author: Will Deacon <[email protected]> - */ - -#include <linux/linkage.h> - -/* int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */ -ENTRY(__invoke_psci_fn_hvc) - hvc #0 - ret -ENDPROC(__invoke_psci_fn_hvc) - -/* int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */ -ENTRY(__invoke_psci_fn_smc) - smc #0 - ret -ENDPROC(__invoke_psci_fn_smc)
drivers/firmware/psci.c +21 -2
@@ -13,6 +13,7 @@#define pr_fmt (fmt) "psci: " fmt +#include <linux/arm-smccc.h> #include <linux/errno.h> #include <linux/linkage.h> #include <linux/of.h>
@@ -58,8 +59,6 @@ struct psci_operations psci_ops;typedef unsigned long (psci_fn )(unsigned long ,unsigned long ,unsigned long ,unsigned long ); -asmlinkage psci_fn __invoke_psci_fn_hvc; -asmlinkage psci_fn __invoke_psci_fn_smc;static psci_fn *invoke_psci_fn;enum psci_function {
@@ -107,6 +106,26 @@ bool psci_power_state_is_valid(u32 state)return !(state & ~valid_mask); } +static unsigned long __invoke_psci_fn_hvc (unsigned long function_id, +unsigned long arg0,unsigned long arg1, +unsigned long arg2) +{ +struct arm_smccc_res res; + +arm_smccc_hvc (function_id, arg0, arg1, arg2,0 ,0 ,0 ,0 , &res); +return res.a0; +} + +static unsigned long __invoke_psci_fn_smc (unsigned long function_id, +unsigned long arg0,unsigned long arg1, +unsigned long arg2) +{ +struct arm_smccc_res res; + +arm_smccc_smc (function_id, arg0, arg1, arg2,0 ,0 ,0 ,0 , &res); +return res.a0; +} +static int psci_to_linux_errno (int errno) {switch (errno) {
Signature · 1 line
1.9.1
v7 cover ARM SMC Calling Convention interface
In reply to Jens WiklanderQuoted 6 lines · Jens Wiklander
This patch set is based on the Generic TEE subsystem v6 patchset
(https://lwn.net/Articles/662495/) sent out a some time ago. By isolating the ARM SMC Calling Convention patches that are useful for other purposes than to support the Generic TEE subsystem some complexity is removed from that patch set.
Quoted 7 lines
This patch set adds a common interface to do an SMC or HVC following ARM SMC Calling Convention. The interface is implemented for both the arm and arm64 architectures and updates the PSCI driver to use this interface instead for firmware communication.
Kevins previous Tested-by tag isn't included as the changes in the config variables may affect some of the builds.
I see that you have a lot of people addressed as 'To', which usually means that nobody is going to apply the patches, because none of us knows who should be responsible ;-)
Is the plan still for Russell to pick them up in his tree? Please clarify in the introductory mail what you would like to happen (more review, apply to some tree, get Acks, ...) and change the recipient list accordingly.
Arnd
v7 cover ARM SMC Calling Convention interface
Quoted 15 lines · Arnd Bergmann
Quoted 6 lines · Jens Wiklander
This patch set is based on the Generic TEE subsystem v6 patchset
(https://lwn.net/Articles/662495/) sent out a some time ago. By isolating the ARM SMC Calling Convention patches that are useful for other purposes than to support the Generic TEE subsystem some complexity is removed from that patch set.Quoted 7 lines
This patch set adds a common interface to do an SMC or HVC following ARM SMC Calling Convention. The interface is implemented for both the arm and arm64 architectures and updates the PSCI driver to use this interface instead for firmware communication.
Kevins previous Tested-by tag isn't included as the changes in the config variables may affect some of the builds.
Quoted 7 lines
I see that you have a lot of people addressed as 'To', which usually means that nobody is going to apply the patches, because none of us knows who should be responsible ;-)
Is the plan still for Russell to pick them up in his tree? Please clarify in the introductory mail what you would like to happen (more review, apply to some tree, get Acks, ...) and change the recipient list accordingly.
That is the plan as they are core ARM functionality, but it's now too late for them to be applied prior to Christmas and the merge window. My tree is now closed to new submissions for Christmas.
Signature · 3 lines
RMK's Patch system: http://www.arm.linux.org.uk/developer/patches/ FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up according to speedtest.net.
v7 cover ARM SMC Calling Convention interface
Quoted 13 lines · Russell King - ARM Linux
Quoted 12 lines · Arnd Bergmann
Quoted 11 lines · Jens Wiklander
This patch set is based on the Generic TEE subsystem v6 patchset
(https://lwn.net/Articles/662495/) sent out a some time ago. By isolating the ARM SMC Calling Convention patches that are useful for other purposes than to support the Generic TEE subsystem some complexity is removed from that patch set.This patch set adds a common interface to do an SMC or HVC following ARM SMC Calling Convention. The interface is implemented for both the arm and arm64 architectures and updates the PSCI driver to use this interface instead for firmware communication.
Quoted 6 lines
Quoted 6 lines
Quoted 2 lines
Kevins previous Tested-by tag isn't included as the changes in the config variables may affect some of the builds.
I see that you have a lot of people addressed as 'To', which usually means that nobody is going to apply the patches, because none of us knows who should be responsible ;-)
Thanks, I'll keep that in mind next time.
Quoted 8 lines
Quoted 4 lines
Is the plan still for Russell to pick them up in his tree? Please clarify in the introductory mail what you would like to happen (more review, apply to some tree, get Acks, ...) and change the recipient list accordingly.
That is the plan as they are core ARM functionality, but it's now too late for them to be applied prior to Christmas and the merge window. My tree is now closed to new submissions for Christmas.
OK, thanks for the help so far and merry Christmas. I'll make another attempt after the merge window has closed then.
--
Jens
v7 cover ARM SMC Calling Convention interface
In reply to Jens WiklanderQuoted 6 lines · Jens Wiklander
This patch set is based on the Generic TEE subsystem v6 patchset
(https://lwn.net/Articles/662495/) sent out a some time ago. By isolating the ARM SMC Calling Convention patches that are useful for other purposes than to support the Generic TEE subsystem some complexity is removed from that patch set.
Quoted 7 lines
This patch set adds a common interface to do an SMC or HVC following ARM SMC Calling Convention. The interface is implemented for both the arm and arm64 architectures and updates the PSCI driver to use this interface instead for firmware communication.
Kevins previous Tested-by tag isn't included as the changes in the config variables may affect some of the builds.
OK, I applied this on top of v4.4-rc6 and pushed it through another round of build[1] and boot[2] testing and things look fine.
Kevin
[1] https://kernelci.org/build/arm-soc/kernel/v4.4-rc6-4-g1ab3cf17f5bd/
[2] https://kernelci.org/boot/all/job/arm-soc/kernel/v4.4-rc6-4-g1ab3cf17f5bd/