/** * PROJECT: ExectOS * COPYRIGHT: See COPYING.md in the top level directory * FILE: xtldr/efiutils.c * DESCRIPTION: EFI related routines for XT Boot Loader * DEVELOPERS: Rafal Kupiec */ #include /** * Exits EFI boot services. * * @return This routine returns status code. * * @since XT 1.0 */ XTCDECL EFI_STATUS BlExitBootServices() { PEFI_MEMORY_MAP MemoryMap; EFI_STATUS Status; ULONG Counter; /* Boot Services might be partially shutdown, so mark them as unavailable */ BlpStatus.BootServices = FALSE; /* Allocate buffer for EFI memory map */ Status = BlMemoryAllocatePool(sizeof(EFI_MEMORY_MAP), (PVOID*)&MemoryMap); if(Status != STATUS_EFI_SUCCESS) { /* Memory allocation failure */ BlDebugPrint(L"ERROR: Memory allocation failure (Status Code: 0x%lx)\n", Status); return Status; } /* Zero fill the buffer and initialize counter */ RtlZeroMemory(MemoryMap, sizeof(EFI_MEMORY_MAP)); Counter = 0xFF; /* Attempt to exit boot services */ while(Counter > 0) { /* Get memory map each time as it can change between two calls */ Status = BlGetMemoryMap(MemoryMap); if(Status != STATUS_EFI_SUCCESS) { /* Failed to get new memory map */ return Status; } /* Exit boot services */ Status = EfiSystemTable->BootServices->ExitBootServices(EfiImageHandle, MemoryMap->MapKey); if(Status == STATUS_EFI_SUCCESS) { break; } /* Decrement counter */ Counter--; } /* Return EFI status code */ return Status; } /** * Checks whether SecureBoot is enabled or not. * * @return Numeric representation of SecureBoot status (0 = Disabled, >0 = Enabled, <0 SetupMode). * * @since XT 1.0 */ XTCDECL INT_PTR BlGetSecureBootStatus() { EFI_GUID VarGuid = EFI_GLOBAL_VARIABLE_GUID; INT_PTR SecureBootStatus = 0; UCHAR VarValue = 0; UINT_PTR Size; Size = sizeof(VarValue); if(EfiSystemTable->RuntimeServices->GetVariable(L"SecureBoot", &VarGuid, NULL, &Size, &VarValue) == STATUS_EFI_SUCCESS) { SecureBootStatus = (INT_PTR)VarValue; if((EfiSystemTable->RuntimeServices->GetVariable(L"SetupMode", &VarGuid, NULL, &Size, &VarValue) == STATUS_EFI_SUCCESS) && VarValue != 0) { SecureBootStatus = -1; } } /* Return SecureBoot status */ return SecureBootStatus; } /** * Puts the system to sleep for the specified number of milliseconds. * * @param Milliseconds * Supplies the number of milliseconds to sleep. * * @return This routine does not return any value. * * @since XT 1.0 */ XTCDECL VOID BlSleepExecution(IN ULONG_PTR Milliseconds) { EfiSystemTable->BootServices->Stall(Milliseconds * 1000); } /** * Waits for one or more EFI events. * * @param NumberOfEvents * Supplies the number of events to wait for. * * @param Event * Supplies the array of events to wait for. * * @param Index * Receives the index of the event that was signaled. * * @return This routine returns status code. * * @since XT 1.0 */ XTCDECL EFI_STATUS BlWaitForEfiEvent(IN UINT_PTR NumberOfEvents, IN PEFI_EVENT Event, OUT PUINT_PTR Index) { return EfiSystemTable->BootServices->WaitForEvent(NumberOfEvents, Event, Index); }