Skip to content

Commit cfec979

Browse files
jenswi-linaroAlex Shi
authored andcommitted
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> (cherry picked from commit b329f95d70f3f955093e9a2b18ac1ed3587a8f73) Signed-off-by: Alex Shi <alex.shi@linaro.org>
1 parent 6c1a9db commit cfec979

4 files changed

Lines changed: 71 additions & 0 deletions

File tree

arch/arm/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ config ARM
3737
select HAVE_ARCH_KGDB if !CPU_ENDIAN_BE32
3838
select HAVE_ARCH_SECCOMP_FILTER if (AEABI && !OABI_COMPAT)
3939
select HAVE_ARCH_TRACEHOOK
40+
select HAVE_ARM_SMCCC if CPU_V7
4041
select HAVE_BPF_JIT
4142
select HAVE_CC_STACKPROTECTOR
4243
select HAVE_CONTEXT_TRACKING

arch/arm/kernel/Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,6 @@ obj-y += psci-call.o
9191
obj-$(CONFIG_SMP) += psci_smp.o
9292
endif
9393

94+
obj-$(CONFIG_HAVE_ARM_SMCCC) += smccc-call.o
95+
9496
extra-y := $(head-y) vmlinux.lds

arch/arm/kernel/armksyms.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <linux/syscalls.h>
1717
#include <linux/uaccess.h>
1818
#include <linux/io.h>
19+
#include <linux/arm-smccc.h>
1920

2021
#include <asm/checksum.h>
2122
#include <asm/ftrace.h>
@@ -175,3 +176,8 @@ EXPORT_SYMBOL(__gnu_mcount_nc);
175176
EXPORT_SYMBOL(__pv_phys_pfn_offset);
176177
EXPORT_SYMBOL(__pv_offset);
177178
#endif
179+
180+
#ifdef CONFIG_HAVE_ARM_SMCCC
181+
EXPORT_SYMBOL(arm_smccc_smc);
182+
EXPORT_SYMBOL(arm_smccc_hvc);
183+
#endif

arch/arm/kernel/smccc-call.S

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
/*
2+
* Copyright (c) 2015, Linaro Limited
3+
*
4+
* This software is licensed under the terms of the GNU General Public
5+
* License version 2, as published by the Free Software Foundation, and
6+
* may be copied, distributed, and modified under those terms.
7+
*
8+
* This program is distributed in the hope that it will be useful,
9+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
* GNU General Public License for more details.
12+
*
13+
*/
14+
#include <linux/linkage.h>
15+
16+
#include <asm/opcodes-sec.h>
17+
#include <asm/opcodes-virt.h>
18+
#include <asm/unwind.h>
19+
20+
/*
21+
* Wrap c macros in asm macros to delay expansion until after the
22+
* SMCCC asm macro is expanded.
23+
*/
24+
.macro SMCCC_SMC
25+
__SMC(0)
26+
.endm
27+
28+
.macro SMCCC_HVC
29+
__HVC(0)
30+
.endm
31+
32+
.macro SMCCC instr
33+
UNWIND( .fnstart)
34+
mov r12, sp
35+
push {r4-r7}
36+
UNWIND( .save {r4-r7})
37+
ldm r12, {r4-r7}
38+
\instr
39+
pop {r4-r7}
40+
ldr r12, [sp, #(4 * 4)]
41+
stm r12, {r0-r3}
42+
bx lr
43+
UNWIND( .fnend)
44+
.endm
45+
46+
/*
47+
* void smccc_smc(unsigned long a0, unsigned long a1, unsigned long a2,
48+
* unsigned long a3, unsigned long a4, unsigned long a5,
49+
* unsigned long a6, unsigned long a7, struct arm_smccc_res *res)
50+
*/
51+
ENTRY(arm_smccc_smc)
52+
SMCCC SMCCC_SMC
53+
ENDPROC(arm_smccc_smc)
54+
55+
/*
56+
* void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
57+
* unsigned long a3, unsigned long a4, unsigned long a5,
58+
* unsigned long a6, unsigned long a7, struct arm_smccc_res *res)
59+
*/
60+
ENTRY(arm_smccc_hvc)
61+
SMCCC SMCCC_HVC
62+
ENDPROC(arm_smccc_hvc)

0 commit comments

Comments
 (0)