[FOSS_TLK]security: tlk_driver: add FIQ glue
[tegra/ote_partner/tlk_driver.git] / security / tlk_driver / ote_asm.S
1 /*
2  * Copyright (c) 2014, NVIDIA Corporation. All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but WITHOUT
9  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
11  * more details.
12  */
13
14 #include <asm/asm-offsets.h>
15 #include <asm/ptrace.h>
16 #include <linux/linkage.h>
17 #include <linux/init.h>
18
19 #ifdef CONFIG_ARM64
20
21 /* uint32_t tlk_generic_smc(uint32_t arg0, uint32_t arg1, uint32_t arg2) */
22 ENTRY(_tlk_generic_smc)
23         smc     #0
24         ret
25 ENDPROC(_tlk_generic_smc)
26
27         /* allows MAX_EXT_SMC_ARGS (r0-r11) to be passed in registers */
28
29 /* uint32_t tlk_extended_smc(uint32_t *regs) */
30 ENTRY(_tlk_extended_smc)
31         /*
32          * Allows MAX_EXT_SMC_ARGS (r0-r11) to be passed in registers
33          * (for aarch64, these are scratch, so no need to save them)
34          */
35         mov     x12, x0
36         ldp     x0, x1, [x12], #16
37         ldp     x2, x3, [x12], #16
38         ldp     x4, x5, [x12], #16
39         ldp     x6, x7, [x12], #16
40         ldp     x8, x9, [x12], #16
41         ldp     x10, x11, [x12], #16
42         smc     #0
43         ret
44 ENDPROC(_tlk_extended_smc)
45
46 ENTRY(tlk_fiq_glue_aarch64)
47         sub     sp, sp, #S_FRAME_SIZE - S_LR
48         stp     x0, x1, [sp, #-16]!
49         stp     x2, x3, [sp, #-16]!
50         stp     x4, x5, [sp, #-16]!
51         stp     x6, x7, [sp, #-16]!
52         stp     x8, x9, [sp, #-16]!
53         stp     x10, x11, [sp, #-16]!
54         stp     x12, x13, [sp, #-16]!
55         stp     x14, x15, [sp, #-16]!
56         stp     x16, x17, [sp, #-16]!
57         stp     x18, x19, [sp, #-16]!
58         stp     x20, x21, [sp, #-16]!
59         stp     x22, x23, [sp, #-16]!
60         stp     x24, x25, [sp, #-16]!
61         stp     x26, x27, [sp, #-16]!
62         stp     x28, x29, [sp, #-16]!
63         ldr     x0, =0x82000006         /* get FIQ regs */
64         smc     #0
65         stp     x0, x1, [sp, #S_PC]     /* original pc, cpsr */
66         tst     x1, PSR_MODE_MASK
67         csel    x2, x2, x3, eq          /* sp el0, sp el1 */
68         stp     x30, x2, [sp, #S_LR]    /* lr, original sp */
69         mov     x0, sp
70         mov     x1, x3
71         bl      tlk_fiq_handler         /* handle FIQ exception */
72         b       .
73 ENDPROC(tlk_fiq_glue_aarch64)
74
75 #else
76
77 ENTRY(_tlk_generic_smc)
78         smc     #0
79         mov     pc, lr
80 ENDPROC(_tlk_generic_smc)
81
82 ENTRY(_tlk_extended_smc)
83         stmfd   sp!, {r4-r12}   @ save reg state
84         mov     r12, r0         @ reg ptr to r12
85         ldmia   r12, {r0-r11}   @ load arg regs
86         smc     #0
87         ldmfd   sp!, {r4-r12}   @ restore saved regs
88 ENDPROC(_tlk_extended_smc)
89
90 #endif