VOID\r
);\r
\r
+EFI_STATUS\r
+GetEnvironmentVariable (\r
+ IN CONST CHAR16* VariableName,\r
+ IN VOID* DefaultValue,\r
+ IN OUT UINTN* Size,\r
+ OUT VOID** Value\r
+ );\r
+\r
+EFI_STATUS\r
+BootOptionFromLoadOptionIndex (\r
+ IN UINT16 LoadOptionIndex,\r
+ OUT BDS_LOAD_OPTION** BdsLoadOption\r
+ );\r
+\r
+EFI_STATUS\r
+BootOptionFromLoadOptionVariable (\r
+ IN CHAR16* BootVariableName,\r
+ OUT BDS_LOAD_OPTION** BdsLoadOption\r
+ );\r
+\r
+EFI_STATUS\r
+BootOptionToLoadOptionVariable (\r
+ IN BDS_LOAD_OPTION* BdsLoadOption\r
+ );\r
+\r
+UINT16\r
+BootOptionAllocateBootIndex (\r
+ VOID\r
+ );\r
+\r
/**\r
Start a Linux kernel from a Device Path\r
\r
IN VOID* LoadOptions\r
);\r
\r
+EFI_STATUS\r
+BdsLoadImage (\r
+ IN EFI_DEVICE_PATH *DevicePath,\r
+ IN EFI_ALLOCATE_TYPE Type,\r
+ IN OUT EFI_PHYSICAL_ADDRESS* Image,\r
+ OUT UINTN *FileSize\r
+ );\r
+\r
#endif\r
CharCount = AsciiSPrint (Buffer,sizeof (Buffer),"Total Time = %ld ms\n\n", DivU64x64Remainder (MultU64x32 (TimeStamp, 1000), TicksPerSecond, NULL));
SerialPortWrite ((UINT8 *) Buffer, CharCount);
}
+
+EFI_STATUS
+GetEnvironmentVariable (
+ IN CONST CHAR16* VariableName,
+ IN VOID* DefaultValue,
+ IN OUT UINTN* Size,
+ OUT VOID** Value
+ )
+{
+ EFI_STATUS Status;
+ UINTN VariableSize;
+
+ // Try to get the variable size.
+ *Value = NULL;
+ VariableSize = 0;
+ Status = gRT->GetVariable ((CHAR16 *) VariableName, &gEfiGlobalVariableGuid, NULL, &VariableSize, *Value);
+ if (Status == EFI_NOT_FOUND) {
+ if ((DefaultValue != NULL) && (Size != NULL) && (*Size != 0)) {
+ // If the environment variable does not exist yet then set it with the default value
+ Status = gRT->SetVariable (
+ (CHAR16*)VariableName,
+ &gEfiGlobalVariableGuid,
+ EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
+ *Size,
+ DefaultValue
+ );
+ *Value = DefaultValue;
+ } else {
+ return EFI_NOT_FOUND;
+ }
+ } else if (Status == EFI_BUFFER_TOO_SMALL) {
+ // Get the environment variable value
+ *Value = AllocatePool (VariableSize);
+ if (*Value == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Status = gRT->GetVariable ((CHAR16 *)VariableName, &gEfiGlobalVariableGuid, NULL, &VariableSize, *Value);
+ if (EFI_ERROR (Status)) {
+ FreePool(*Value);
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Size) {
+ *Size = VariableSize;
+ }
+ } else {
+ *Value = DefaultValue;
+ return Status;
+ }
+
+ return EFI_SUCCESS;
+}
#include <Library/DebugLib.h>
#include <Library/BdsLib.h>
#include <Library/PerformanceLib.h>
+#include <Library/PrintLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Guid/GlobalVariable.h>
#include <Guid/FileInfo.h>
#include <Protocol/DevicePath.h>
typedef BOOLEAN (*BDS_FILE_LOADER_SUPPORT) (
- IN EFI_DEVICE_PATH *DevicePath,
- IN EFI_HANDLE Handle,
- IN EFI_DEVICE_PATH *RemainingDevicePath
- );
+ IN EFI_DEVICE_PATH *DevicePath,
+ IN EFI_HANDLE Handle,
+ IN EFI_DEVICE_PATH *RemainingDevicePath
+ );
typedef EFI_STATUS (*BDS_FILE_LOADER_LOAD_IMAGE) (
- IN EFI_DEVICE_PATH *DevicePath,
- IN EFI_HANDLE Handle,
- IN EFI_DEVICE_PATH *RemainingDevicePath,
- IN EFI_ALLOCATE_TYPE Type,
- IN OUT EFI_PHYSICAL_ADDRESS* Image,
- OUT UINTN *ImageSize
- );
+ IN EFI_DEVICE_PATH *DevicePath,
+ IN EFI_HANDLE Handle,
+ IN EFI_DEVICE_PATH *RemainingDevicePath,
+ IN EFI_ALLOCATE_TYPE Type,
+ IN OUT EFI_PHYSICAL_ADDRESS* Image,
+ OUT UINTN *ImageSize
+ );
typedef struct {
BDS_FILE_LOADER_SUPPORT Support;
PrintPerformance (
VOID
);
+
EFI_STATUS
BdsLoadImage (
IN EFI_DEVICE_PATH *DevicePath,
BdsLinuxLoader.c
BdsAppLoader.c
BdsHelper.c
+ BdsLoadOption.c
[Packages]
MdePkg/MdePkg.dec
gEfiPxeBaseCodeProtocolGuid
gEfiDiskIoProtocolGuid
gEfiUsbIoProtocolGuid
+ gEfiLoadedImageProtocolGuid
[FeaturePcd]
#include "BdsInternal.h"
-EFI_STATUS
-GetEnvironmentVariable (
- IN CONST CHAR16* VariableName,
- IN VOID* DefaultValue,
- IN OUT UINTN* Size,
- OUT VOID** Value
- )
-{
- EFI_STATUS Status;
- UINTN VariableSize;
-
- // Try to get the variable size.
- *Value = NULL;
- VariableSize = 0;
- Status = gRT->GetVariable ((CHAR16 *) VariableName, &gEfiGlobalVariableGuid, NULL, &VariableSize, *Value);
- if (Status == EFI_NOT_FOUND) {
- if ((DefaultValue != NULL) && (Size != NULL) && (*Size != 0)) {
- // If the environment variable does not exist yet then set it with the default value
- Status = gRT->SetVariable (
- (CHAR16*)VariableName,
- &gEfiGlobalVariableGuid,
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
- *Size,
- DefaultValue
- );
- *Value = DefaultValue;
- } else {
- return EFI_NOT_FOUND;
- }
- } else if (Status == EFI_BUFFER_TOO_SMALL) {
- // Get the environment variable value
- *Value = AllocatePool (VariableSize);
- if (*Value == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Status = gRT->GetVariable ((CHAR16 *)VariableName, &gEfiGlobalVariableGuid, NULL, &VariableSize, *Value);
- if (EFI_ERROR (Status)) {
- FreePool(*Value);
- return EFI_INVALID_PARAMETER;
- }
-
- if (Size) {
- *Size = VariableSize;
- }
- } else {
- *Value = DefaultValue;
- return Status;
- }
-
- return EFI_SUCCESS;
-}
-
EFI_STATUS
EditHIInputStr (
IN OUT CHAR16 *CmdLine,
)
{
EFI_STATUS Status;
- EFI_LOAD_OPTION EfiLoadOption;
- UINTN EfiLoadOptionSize;
BDS_LOAD_OPTION *BdsLoadOption;
- Status = GetEnvironmentVariable (BootOption, NULL, &EfiLoadOptionSize, (VOID**)&EfiLoadOption);
+ Status = BootOptionFromLoadOptionVariable (BootOption, &BdsLoadOption);
if (!EFI_ERROR(Status)) {
- Status = BootOptionParseLoadOption (EfiLoadOption, EfiLoadOptionSize, &BdsLoadOption);
- if (!EFI_ERROR(Status)) {
- Status = BootOptionStart (BdsLoadOption);
- FreePool (BdsLoadOption);
- }
+ Status = BootOptionStart (BdsLoadOption);
+ FreePool (BdsLoadOption);
if (!EFI_ERROR(Status)) {
Status = EFI_SUCCESS;
return Status;\r
}\r
\r
-EFI_STATUS\r
-BootOptionParseLoadOption (\r
- IN EFI_LOAD_OPTION EfiLoadOption,\r
- IN UINTN EfiLoadOptionSize,\r
- OUT BDS_LOAD_OPTION **BdsLoadOption\r
- )\r
-{\r
- BDS_LOAD_OPTION *LoadOption;\r
- UINTN FilePathListLength;\r
- UINTN DescriptionLength;\r
-\r
- if (EfiLoadOption == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (EfiLoadOptionSize < sizeof(UINT32) + sizeof(UINT16) + sizeof(CHAR16) + sizeof(EFI_DEVICE_PATH_PROTOCOL)) {\r
- return EFI_BAD_BUFFER_SIZE;\r
- }\r
-\r
- LoadOption = (BDS_LOAD_OPTION*)AllocatePool(sizeof(BDS_LOAD_OPTION));\r
- if (LoadOption == NULL) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- LoadOption->LoadOption = EfiLoadOption;\r
- LoadOption->LoadOptionSize = EfiLoadOptionSize;\r
-\r
- LoadOption->Attributes = *(UINT32*)EfiLoadOption;\r
- FilePathListLength = *(UINT16*)(EfiLoadOption + sizeof(UINT32));\r
- LoadOption->Description = (CHAR16*)(EfiLoadOption + sizeof(UINT32) + sizeof(UINT16));\r
- DescriptionLength = StrSize (LoadOption->Description);\r
- LoadOption->FilePathList = (EFI_DEVICE_PATH_PROTOCOL*)(EfiLoadOption + sizeof(UINT32) + sizeof(UINT16) + DescriptionLength);\r
-\r
- if ((UINTN)((UINT8*)LoadOption->FilePathList + FilePathListLength - EfiLoadOption) == EfiLoadOptionSize) {\r
- LoadOption->OptionalData = NULL;\r
- } else {\r
- LoadOption->OptionalData = (BDS_LOADER_OPTIONAL_DATA *)((UINT8*)LoadOption->FilePathList + FilePathListLength);\r
- }\r
-\r
- *BdsLoadOption = LoadOption;\r
- return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-BootOptionFromLoadOptionVariable (\r
- IN UINT16 LoadOptionIndex,\r
- OUT BDS_LOAD_OPTION **BdsLoadOption\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CHAR16 BootVariableName[9];\r
- EFI_LOAD_OPTION EfiLoadOption;\r
- UINTN EfiLoadOptionSize;\r
-\r
- UnicodeSPrint (BootVariableName, 9 * sizeof(CHAR16), L"Boot%04X", LoadOptionIndex);\r
-\r
- Status = GetEnvironmentVariable (BootVariableName, NULL, &EfiLoadOptionSize, (VOID**)&EfiLoadOption);\r
- if (!EFI_ERROR(Status)) {\r
- Status = BootOptionParseLoadOption (EfiLoadOption,EfiLoadOptionSize,BdsLoadOption);\r
- if (!EFI_ERROR(Status)) {\r
- (*BdsLoadOption)->LoadOptionIndex = LoadOptionIndex;\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
EFI_STATUS\r
BootOptionList (\r
IN OUT LIST_ENTRY *BootOptionList\r
}\r
\r
for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
- Status = BootOptionFromLoadOptionVariable (BootOrder[Index],&BdsLoadOption);\r
+ Status = BootOptionFromLoadOptionIndex (BootOrder[Index], &BdsLoadOption);\r
if (!EFI_ERROR(Status)) {\r
BdsLoadOptionEntry = (BDS_LOAD_OPTION_ENTRY*)AllocatePool(sizeof(BDS_LOAD_OPTION_ENTRY));\r
BdsLoadOptionEntry->BdsLoadOption = BdsLoadOption;\r
return EFI_SUCCESS;\r
}\r
\r
-UINT16\r
-BootOptionAllocateBootIndex (\r
- VOID\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- UINT32 BootIndex;\r
- UINT16 *BootOrder;\r
- UINTN BootOrderSize;\r
- BOOLEAN Found;\r
-\r
- // Get the Boot Option Order from the environment variable\r
- Status = GetEnvironmentVariable (L"BootOrder", NULL, &BootOrderSize, (VOID**)&BootOrder);\r
- if (!EFI_ERROR(Status)) {\r
- for (BootIndex = 0; BootIndex <= 0xFFFF; BootIndex++) {\r
- Found = FALSE;\r
- for (Index = 0; Index < BootOrderSize / sizeof (UINT16); Index++) {\r
- if (BootOrder[Index] == BootIndex) {\r
- Found = TRUE;\r
- break;\r
- }\r
- }\r
- if (!Found) {\r
- return BootIndex;\r
- }\r
- }\r
- }\r
- // Return the first index\r
- return 0;\r
-}\r
-\r
STATIC\r
EFI_STATUS\r
BootOptionSetFields (\r