mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-25 17:10:50 +07:00
ARM: 8479/2: add implementation for arm-smccc
Adds 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. Reviewed-by: Lars Persson <lars.persson@axis.com> Signed-off-by: Jens Wiklander <jens.wiklander@linaro.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
98dd64f34f
commit
b329f95d70
@ -37,6 +37,7 @@ config ARM
|
|||||||
select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU
|
select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32 && MMU
|
||||||
select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT)
|
select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT)
|
||||||
select HAVE_ARCH_TRACEHOOK
|
select HAVE_ARCH_TRACEHOOK
|
||||||
|
select HAVE_ARM_SMCCC if CPU_V7
|
||||||
select HAVE_BPF_JIT
|
select HAVE_BPF_JIT
|
||||||
select HAVE_CC_STACKPROTECTOR
|
select HAVE_CC_STACKPROTECTOR
|
||||||
select HAVE_CONTEXT_TRACKING
|
select HAVE_CONTEXT_TRACKING
|
||||||
|
@ -91,4 +91,6 @@ obj-y += psci-call.o
|
|||||||
obj-$(CONFIG_SMP) += psci_smp.o
|
obj-$(CONFIG_SMP) += psci_smp.o
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
obj-$(CONFIG_HAVE_ARM_SMCCC) += smccc-call.o
|
||||||
|
|
||||||
extra-y := $(head-y) vmlinux.lds
|
extra-y := $(head-y) vmlinux.lds
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
#include <linux/syscalls.h>
|
#include <linux/syscalls.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/arm-smccc.h>
|
||||||
|
|
||||||
#include <asm/checksum.h>
|
#include <asm/checksum.h>
|
||||||
#include <asm/ftrace.h>
|
#include <asm/ftrace.h>
|
||||||
@ -175,3 +176,8 @@ EXPORT_SYMBOL(__gnu_mcount_nc);
|
|||||||
EXPORT_SYMBOL(__pv_phys_pfn_offset);
|
EXPORT_SYMBOL(__pv_phys_pfn_offset);
|
||||||
EXPORT_SYMBOL(__pv_offset);
|
EXPORT_SYMBOL(__pv_offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_HAVE_ARM_SMCCC
|
||||||
|
EXPORT_SYMBOL(arm_smccc_smc);
|
||||||
|
EXPORT_SYMBOL(arm_smccc_hvc);
|
||||||
|
#endif
|
||||||
|
62
arch/arm/kernel/smccc-call.S
Normal file
62
arch/arm/kernel/smccc-call.S
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2015, Linaro Limited
|
||||||
|
*
|
||||||
|
* This software is licensed under the terms of the GNU General Public
|
||||||
|
* License version 2, as published by the Free Software Foundation, and
|
||||||
|
* may be copied, distributed, and modified under those terms.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
|
#include <asm/opcodes-sec.h>
|
||||||
|
#include <asm/opcodes-virt.h>
|
||||||
|
#include <asm/unwind.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wrap c macros in asm macros to delay expansion until after the
|
||||||
|
* SMCCC asm macro is expanded.
|
||||||
|
*/
|
||||||
|
.macro SMCCC_SMC
|
||||||
|
__SMC(0)
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro SMCCC_HVC
|
||||||
|
__HVC(0)
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro SMCCC instr
|
||||||
|
UNWIND( .fnstart)
|
||||||
|
mov r12, sp
|
||||||
|
push {r4-r7}
|
||||||
|
UNWIND( .save {r4-r7})
|
||||||
|
ldm r12, {r4-r7}
|
||||||
|
\instr
|
||||||
|
pop {r4-r7}
|
||||||
|
ldr r12, [sp, #(4 * 4)]
|
||||||
|
stm r12, {r0-r3}
|
||||||
|
bx lr
|
||||||
|
UNWIND( .fnend)
|
||||||
|
.endm
|
||||||
|
|
||||||
|
/*
|
||||||
|
* void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
|
||||||
|
* unsigned long a3, unsigned long a4, unsigned long a5,
|
||||||
|
* unsigned long a6, unsigned long a7, struct arm_smccc_res *res)
|
||||||
|
*/
|
||||||
|
ENTRY(arm_smccc_smc)
|
||||||
|
SMCCC SMCCC_SMC
|
||||||
|
ENDPROC(arm_smccc_smc)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
|
||||||
|
* unsigned long a3, unsigned long a4, unsigned long a5,
|
||||||
|
* unsigned long a6, unsigned long a7, struct arm_smccc_res *res)
|
||||||
|
*/
|
||||||
|
ENTRY(arm_smccc_hvc)
|
||||||
|
SMCCC SMCCC_HVC
|
||||||
|
ENDPROC(arm_smccc_hvc)
|
Loading…
Reference in New Issue
Block a user