IN ARM_SVC_ARGS *EventCompleteSvcArgs\r
)\r
{\r
+ BOOLEAN FfaEnabled;\r
EFI_STATUS Status;\r
UINTN SvcStatus;\r
\r
DEBUG ((DEBUG_INFO, "X1 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg1));\r
DEBUG ((DEBUG_INFO, "X2 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg2));\r
DEBUG ((DEBUG_INFO, "X3 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg3));\r
-\r
- Status = CpuDriverEntryPoint (\r
- EventCompleteSvcArgs->Arg0,\r
- EventCompleteSvcArgs->Arg3,\r
- EventCompleteSvcArgs->Arg1\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n",\r
- EventCompleteSvcArgs->Arg0, Status));\r
+ DEBUG ((DEBUG_INFO, "X4 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg4));\r
+ DEBUG ((DEBUG_INFO, "X5 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg5));\r
+ DEBUG ((DEBUG_INFO, "X6 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg6));\r
+ DEBUG ((DEBUG_INFO, "X7 : 0x%x\n", (UINT32) EventCompleteSvcArgs->Arg7));\r
+\r
+ FfaEnabled = FeaturePcdGet (PcdFfaEnable);\r
+ if (FfaEnabled) {\r
+ Status = CpuDriverEntryPoint (\r
+ EventCompleteSvcArgs->Arg0,\r
+ EventCompleteSvcArgs->Arg6,\r
+ EventCompleteSvcArgs->Arg3\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n",\r
+ EventCompleteSvcArgs->Arg3, Status));\r
+ }\r
+ } else {\r
+ Status = CpuDriverEntryPoint (\r
+ EventCompleteSvcArgs->Arg0,\r
+ EventCompleteSvcArgs->Arg3,\r
+ EventCompleteSvcArgs->Arg1\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((DEBUG_ERROR, "Failed delegated event 0x%x, Status 0x%x\n",\r
+ EventCompleteSvcArgs->Arg0, Status));\r
+ }\r
}\r
\r
switch (Status) {\r
break;\r
}\r
\r
- EventCompleteSvcArgs->Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;\r
- EventCompleteSvcArgs->Arg1 = SvcStatus;\r
+ if (FfaEnabled) {\r
+ EventCompleteSvcArgs->Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64;\r
+ EventCompleteSvcArgs->Arg1 = 0;\r
+ EventCompleteSvcArgs->Arg2 = 0;\r
+ EventCompleteSvcArgs->Arg3 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;\r
+ EventCompleteSvcArgs->Arg4 = SvcStatus;\r
+ } else {\r
+ EventCompleteSvcArgs->Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;\r
+ EventCompleteSvcArgs->Arg1 = SvcStatus;\r
+ }\r
}\r
}\r
\r
return Status;\r
}\r
\r
+/**\r
+ Initialize parameters to be sent via SVC call.\r
+\r
+ @param[out] InitMmFoundationSvcArgs Args structure\r
+ @param[out] Ret Return Code\r
+\r
+**/\r
+STATIC\r
+VOID\r
+InitArmSvcArgs (\r
+ OUT ARM_SVC_ARGS *InitMmFoundationSvcArgs,\r
+ OUT INT32 *Ret\r
+ )\r
+{\r
+ if (FeaturePcdGet (PcdFfaEnable)) {\r
+ InitMmFoundationSvcArgs->Arg0 = ARM_SVC_ID_FFA_MSG_SEND_DIRECT_RESP_AARCH64;\r
+ InitMmFoundationSvcArgs->Arg1 = 0;\r
+ InitMmFoundationSvcArgs->Arg2 = 0;\r
+ InitMmFoundationSvcArgs->Arg3 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;\r
+ InitMmFoundationSvcArgs->Arg4 = *Ret;\r
+ } else {\r
+ InitMmFoundationSvcArgs->Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;\r
+ InitMmFoundationSvcArgs->Arg1 = *Ret;\r
+ }\r
+}\r
+\r
/**\r
The entry point of Standalone MM Foundation.\r
\r
EFI_SECURE_PARTITION_BOOT_INFO *PayloadBootInfo;\r
ARM_SVC_ARGS InitMmFoundationSvcArgs;\r
EFI_STATUS Status;\r
+ INT32 Ret;\r
UINT32 SectionHeaderOffset;\r
UINT16 NumberOfSections;\r
VOID *HobStart;\r
DEBUG ((DEBUG_INFO, "Shared Cpu Driver EP 0x%lx\n", (UINT64) CpuDriverEntryPoint));\r
\r
finish:\r
+ if (Status == RETURN_UNSUPPORTED) {\r
+ Ret = -1;\r
+ } else if (Status == RETURN_INVALID_PARAMETER) {\r
+ Ret = -2;\r
+ } else if (Status == EFI_NOT_FOUND) {\r
+ Ret = -7;\r
+ } else {\r
+ Ret = 0;\r
+ }\r
ZeroMem (&InitMmFoundationSvcArgs, sizeof(InitMmFoundationSvcArgs));\r
- InitMmFoundationSvcArgs.Arg0 = ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64;\r
- InitMmFoundationSvcArgs.Arg1 = Status;\r
+ InitArmSvcArgs (&InitMmFoundationSvcArgs, &Ret);\r
DelegatedEventLoop (&InitMmFoundationSvcArgs);\r
}\r