aboutsummaryrefslogtreecommitdiff
path: root/core/arch/arm/kernel/thread_spmc_a32.S
blob: 4be601d1b66b6ba366da7f18db3a585622ee582a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * Copyright (c) 2020, Linaro Limited
 */

#include <platform_config.h>

#include <arm32_macros.S>
#include <arm.h>
#include <asm.S>
#include <ffa.h>
#include <generated/asm-defines.h>
#include <keep.h>
#include <kernel/thread_defs.h>
#include <optee_ffa.h>

FUNC thread_ffa_msg_wait , :
	mov_imm	r0, FFA_MSG_WAIT		/* FID */
	mov	r1, #FFA_TARGET_INFO_MBZ	/* Target info MBZ */
	mov	r2, #FFA_PARAM_MBZ		/* Param MBZ */
	mov	r3, #FFA_PARAM_MBZ		/* Param MBZ */
	mov	r4, #FFA_PARAM_MBZ		/* Param MBZ */
	mov	r5, #FFA_PARAM_MBZ		/* Param MBZ */
	mov	r6, #FFA_PARAM_MBZ		/* Param MBZ */
	mov	r7, #FFA_PARAM_MBZ		/* Param MBZ */
	b	.ffa_msg_loop
END_FUNC thread_ffa_msg_wait

	/* Caller provides r1, r3-r7 params */
LOCAL_FUNC ffa_msg_send_direct_resp , :
	ldr	r0, =FFA_MSG_SEND_DIRECT_RESP_32	/* FID */
	mov	r2, #FFA_PARAM_MBZ			/* RES MBZ */

.ffa_msg_loop:
	/* Invoke SMC with caller provided parameters */
	smc	#0

	/* Store the parameters as struct thread_smc_args on stack */
	push	{r0-r7}
	mov	r0, sp

	/* parse and handle message */
	bl	thread_spmc_msg_recv

	/* Load struct thread_smc_args into registers */
	pop	{r0-r7}
	b	.ffa_msg_loop
END_FUNC ffa_msg_send_direct_resp

FUNC thread_std_smc_entry , :
UNWIND(	.cantunwind)

	ror	r4, r0, #16 /* Save target info with src and dst swapped */
	bl	__thread_std_smc_entry
	mov	r5, r0	/* Save return value */

	/* Mask all maskable exceptions before switching to temporary stack */
	cpsid	aif
	bl	thread_get_tmp_sp
	mov	sp, r0

	bl	thread_state_free

	mov	r1, r4				/* Target info */
	mov	r3, r5				/* Return value */
	mov	r4, #FFA_PARAM_MBZ		/* Unused parameter */
	mov	r5, #FFA_PARAM_MBZ		/* Unused parameter */
	mov	r6, #FFA_PARAM_MBZ		/* Unused parameter */
	mov	r7, #FFA_PARAM_MBZ		/* Unused parameter */
	b	ffa_msg_send_direct_resp
END_FUNC thread_std_smc_entry

/* void thread_rpc(struct thread_rpc_arg *rpc_arg) */
FUNC thread_rpc , :
	push	{r0, lr}
UNWIND(	.save	{r0, lr})

	bl	thread_save_state
	mov	r4, r0			/* Save original CPSR */

	/*
	 * Switch to temporary stack and SVC mode. Save CPSR to resume into.
	 */
	bl	thread_get_tmp_sp
	ldr	r8, [sp]		/* Get pointer to rv[] */
	cps	#CPSR_MODE_SVC		/* Change to SVC mode */
	mov	sp, r0			/* Switch to tmp stack */

	mov	r0, #THREAD_FLAGS_COPY_ARGS_ON_RETURN
	mov	r1, r4			/* CPSR to restore */
	ldr	r2, =.thread_rpc_return
	bl	thread_state_suspend
	mov	r7, r0			/* Supply thread index */
	ldr	r0, =FFA_MSG_SEND_DIRECT_RESP_32
	mov	r2, #FFA_PARAM_MBZ
	mov	r3, #0			/* Error code = 0 */
	ldm	r8, {r1, r4-r6}		/* Load rv[] into r1,r4-r6 */
	b	ffa_msg_send_direct_resp

.thread_rpc_return:
	/*
	 * At this point has the stack pointer been restored to the value
	 * it had when thread_save_state() was called above.
	 *
	 * Jumps here from thread_resume above when RPC has returned. The
	 * IRQ and FIQ bits are restored to what they where when this
	 * function was originally entered.
	 */
	pop	{r12, lr}		/* Get pointer to rv[] */
	stm	r12, {r0-r3}		/* Store r0-r3 into rv[] */
	bx	lr
END_FUNC thread_rpc
DECLARE_KEEP_PAGER thread_rpc

/*
 * void thread_foreign_intr_exit(uint32_t thread_index)
 *
 * This function is jumped to at the end of macro foreign_intr_handler().
 * The current thread as indicated by @thread_index has just been
 * suspended.  The job here is just to inform normal world the thread id to
 * resume when returning.
 */
FUNC thread_foreign_intr_exit , :
	/* load threads[r0].tsd.rpc_target_info into r1 */
	mov	r1, #THREAD_CTX_SIZE
	ldr	r2, =threads
	mla	r1, r1, r0, r2
	ldr	r1, [r1, #THREAD_CTX_TSD_RPC_TARGET_INFO]
	mov	r2, #FFA_PARAM_MBZ
	mov	r3, #FFA_PARAM_MBZ
	mov	r4, #OPTEE_FFA_YIELDING_CALL_RETURN_INTERRUPT
	mov	r5, #FFA_PARAM_MBZ
	mov	r6, #FFA_PARAM_MBZ
	mov	r7, r0
	b	ffa_msg_send_direct_resp
END_FUNC thread_foreign_intr_exit