| /* |
| * Copyright (C) 2013 Google, Inc. |
| * |
| * 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 <asm/asm-offsets.h> |
| #include <asm/ptrace.h> |
| #include <linux/linkage.h> |
| #include <linux/trusty/smcall.h> |
| |
| .macro push reg1,reg2,remregs:vararg |
| .ifnb \remregs |
| push \remregs |
| .endif |
| stp \reg1, \reg2, [sp, #-16]! |
| .endm |
| |
| .macro pop reg1,reg2,remregs:vararg |
| ldp \reg1, \reg2, [sp], #16 |
| .ifnb \remregs |
| pop \remregs |
| .endif |
| .endm |
| |
| ENTRY(trusty_fiq_glue_arm64) |
| sub sp, sp, #S_FRAME_SIZE - S_LR |
| push x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, \ |
| x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, \ |
| x26, x27, x28, x29 |
| ldr x0, =SMC_FC64_GET_FIQ_REGS |
| smc #0 |
| stp x0, x1, [sp, #S_PC] /* original pc, cpsr */ |
| tst x1, PSR_MODE_MASK |
| csel x2, x2, x3, eq /* sp el0, sp el1 */ |
| stp x30, x2, [sp, #S_LR] /* lr, original sp */ |
| mov x0, sp |
| mov x1, x3 |
| bl trusty_fiq_handler |
| pop x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, \ |
| x14, x15, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, \ |
| x26, x27, x28, x29 |
| ldr x30, [sp], #S_FRAME_SIZE - S_LR /* load LR and restore SP */ |
| ldr x0, =SMC_FC_FIQ_EXIT |
| smc #0 |
| b . /* should not get here */ |
| |
| ENTRY(trusty_fiq_cpu_resume) |
| ldr x0, =SMC_FC_FIQ_RESUME |
| smc #0 |
| ret |