bios中reboot的flow 如下:
可见是作为一个runtime service 提供给kernel的
继续看看ResetSystemViaLib的源码
Reset.c (embeddedpkg\resetruntimedxe): LibResetSystem (ResetType, ResetStatus, DataSize, ResetData);
**/
VOID
EFIAPI
ResetSystemViaLib (
IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus,
IN UINTN DataSize,
IN VOID *ResetData OPTIONAL
)
{
LibResetSystem (ResetType, ResetStatus, DataSize, ResetData);
return;
}
在armpkg/library/armpsciresetsystemlib/armpscirebootsystemlib.c 中定义了
**/
EFI_STATUS
EFIAPI
LibResetSystem (
IN EFI_RESET_TYPE ResetType,
IN EFI_STATUS ResetStatus,
IN UINTN DataSize,
IN CHAR16 *ResetData OPTIONAL
)
{
ARM_SMC_ARGS ArmSmcArgs;
switch (ResetType) {
case EfiResetPlatformSpecific:
// Map the platform specific reset as reboot
case EfiResetWarm:
// Map a warm reset into a cold reset
case EfiResetCold:
// Send a PSCI 0.2 SYSTEM_RESET command
ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_RESET;
break;
case EfiResetShutdown:
// Send a PSCI 0.2 SYSTEM_OFF command
ArmSmcArgs.Arg0 = ARM_SMC_ID_PSCI_SYSTEM_OFF;
break;
default:
ASSERT (FALSE);
return EFI_UNSUPPORTED;
}
可见系统最终的cold reset/warmreset等最后还是通过psci 调用到atf 接口中执行.
ArmCallSmc (&ArmSmcArgs);
// We should never be here
DEBUG ((EFI_D_ERROR, "%a: PSCI Reset failed\n", __FUNCTION__));
CpuDeadLoop ();
return EFI_UNSUPPORTED;
}