xref: /arm-trusted-firmware/plat/arm/common/plat_arm_sip_svc.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2023, Arm Limited. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <stdint.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <common/debug.h>
10*91f16700Schasinglulu #include <common/runtime_svc.h>
11*91f16700Schasinglulu 
12*91f16700Schasinglulu #include <plat/arm/common/arm_sip_svc.h>
13*91f16700Schasinglulu #include <plat/common/platform.h>
14*91f16700Schasinglulu 
15*91f16700Schasinglulu #if ENABLE_SPMD_LP
16*91f16700Schasinglulu #include <services/el3_spmd_logical_sp.h>
17*91f16700Schasinglulu #endif
18*91f16700Schasinglulu 
19*91f16700Schasinglulu uintptr_t plat_arm_sip_handler(uint32_t smc_fid,
20*91f16700Schasinglulu 				u_register_t x1,
21*91f16700Schasinglulu 				u_register_t x2,
22*91f16700Schasinglulu 				u_register_t x3,
23*91f16700Schasinglulu 				u_register_t x4,
24*91f16700Schasinglulu 				void *cookie,
25*91f16700Schasinglulu 				void *handle,
26*91f16700Schasinglulu 				u_register_t flags)
27*91f16700Schasinglulu {
28*91f16700Schasinglulu #if PLAT_TEST_SPM
29*91f16700Schasinglulu 	bool secure_origin;
30*91f16700Schasinglulu 
31*91f16700Schasinglulu 	/* Determine which security state this SMC originated from */
32*91f16700Schasinglulu 	secure_origin = is_caller_secure(flags);
33*91f16700Schasinglulu 
34*91f16700Schasinglulu 	switch (smc_fid) {
35*91f16700Schasinglulu 	case ARM_SIP_SET_INTERRUPT_PENDING:
36*91f16700Schasinglulu 		if (!secure_origin) {
37*91f16700Schasinglulu 			SMC_RET1(handle, SMC_UNK);
38*91f16700Schasinglulu 		}
39*91f16700Schasinglulu 
40*91f16700Schasinglulu 		VERBOSE("SiP Call- Set interrupt pending %d\n", (uint32_t)x1);
41*91f16700Schasinglulu 		plat_ic_set_interrupt_pending(x1);
42*91f16700Schasinglulu 
43*91f16700Schasinglulu 		SMC_RET1(handle, SMC_OK);
44*91f16700Schasinglulu 		break; /* Not reached */
45*91f16700Schasinglulu 	default:
46*91f16700Schasinglulu 		break;
47*91f16700Schasinglulu 	}
48*91f16700Schasinglulu #endif
49*91f16700Schasinglulu 
50*91f16700Schasinglulu #if ENABLE_SPMD_LP
51*91f16700Schasinglulu 	return plat_spmd_logical_sp_smc_handler(smc_fid, x1, x2, x3, x4,
52*91f16700Schasinglulu 				cookie, handle, flags);
53*91f16700Schasinglulu #else
54*91f16700Schasinglulu 	WARN("Unimplemented ARM SiP Service Call: 0x%x\n", smc_fid);
55*91f16700Schasinglulu 	SMC_RET1(handle, SMC_UNK);
56*91f16700Schasinglulu #endif
57*91f16700Schasinglulu }
58