alder_lake_bios/Insyde/InsydeModulePkg/Universal/Disk/RamDiskApp/RamDiskApp.c

317 lines
8.8 KiB
C

/** @file
;******************************************************************************
;* Copyright (c) 2015 - 2020, Insyde Software Corp. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include <Uefi.h>
#include <Protocol/H2ORamDiskServices.h>
#include <Protocol/RamDisk.h>
#include <Library/PcdLib.h>
#include <Library/UefiLib.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Library/ShellLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/BaseLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/HiiDbLib.h>
#include <Library/HiiStringLib.h>
#include <Library/HiiConfigAccessLib.h>
//
// Global Variables
//
EFI_HII_HANDLE mHiiHandle;
SHELL_PARAM_ITEM RamDiskParamList[] = {
{
L"-c",
TypeFlag
},
{
L"-d",
TypeValue
},
{
L"-s",
TypeValue
},
{
L"-r",
TypeFlag
},
{
L"-i",
TypeFlag
},
{
L"-f",
TypeValue
},
{
L"-?",
TypeFlag
},
{
NULL,
TypeMax
},
};
/**
Diplay RAM Disk devices information.
@param[in] RamDiskServicesProtocol Indicates a pointer to the H2O_RAM_DISK_SERVICES_PROTOCOL
context.
**/
VOID
DisplayRamDiskInfo (
IN H2O_RAM_DISK_SERVICES_PROTOCOL *RamDiskServicesProtocol
)
{
UINT32 Index;
UINT32 RamDiskDeviceNum;
UINT64 RamDiskId;
UINT64 RamDiskSize;
BOOLEAN Removable;
EFI_STATUS Status = EFI_NOT_FOUND;
RamDiskDeviceNum = RamDiskServicesProtocol->GetRamDiskCount ();
RamDiskId = 0;
RamDiskSize = 0;
Print (L"RAM Disk devices Count = %d\n", RamDiskDeviceNum);
if (RamDiskDeviceNum == 0) {
return;
}
Print (L"NO ID Size(MB) Removable\n");
for (Index = 0; Index < RamDiskDeviceNum; Index++) {
Status = RamDiskServicesProtocol->GetRamDiskInfo (
Index,
&RamDiskSize,
&RamDiskId,
&Removable
);
if (Status == EFI_SUCCESS) {
Print (L"%02d ", Index);
Print (L"0x%-16lx ", RamDiskId);
Print (L"%-8d ", (RamDiskSize/(1024*1024)));
if (Removable) {
Print (L"TRUE");
} else {
Print (L"FALSE");
}
Print (L"\n");
}
}
}
/**
The user Entry Point for Application. The user code starts with this function
as the real entry point for the application.
@param[in] ImageHandle The firmware allocated handle for the EFI image.
@param[in] SystemTable A pointer to the EFI System Table.
@retval EFI_SUCCESS The entry point is executed successfully.
@retval other Some error occurs when executing this entry point.
**/
EFI_STATUS
EFIAPI
RamDiskAppMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;
LIST_ENTRY *ParamPackage;
H2O_RAM_DISK_SERVICES_PROTOCOL *RamDiskServicesProtocol;
UINT32 RamDiskSize;
UINT64 RamDiskId;
BOOLEAN Removable;
CONST CHAR16 *ValueStr;
CONST CHAR16 *ValueStrPtr;
EFI_RAM_DISK_PROTOCOL *Edk2RamDiskProtocol;
SHELL_FILE_HANDLE FileHandle;
UINT64 FileSize;
UINT8 *FileBuffer;
EFI_DEVICE_PATH_PROTOCOL *FileDevicePath;
//
// Register our string package with HII and return the handle to it.
//
mHiiHandle = HiiAddPackages (&gEfiCallerIdGuid, ImageHandle, RamDiskAppStrings, NULL);
ASSERT (mHiiHandle != NULL);
Status = ShellCommandLineParseEx (RamDiskParamList, &ParamPackage, NULL, TRUE, FALSE);
if (EFI_ERROR (Status)) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_RAM_DISK_INVALID_INPUT), mHiiHandle);
goto ON_EXIT;
}
if (ShellCommandLineGetFlag (ParamPackage, L"-?")) {
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_RAM_DISK_HELP), mHiiHandle);
goto ON_EXIT;
}
Status = gBS->LocateProtocol (
&gH2ORamDiskServicesProtocolGuid,
NULL,
(VOID **)&RamDiskServicesProtocol
);
if (EFI_ERROR (Status)) {
Print (L"RamDiskServicesProtocl not found!!!\n");
goto ON_EXIT;
}
Removable = FALSE;
RamDiskSize = 8;
RamDiskId = 0;
if (ShellCommandLineGetFlag (ParamPackage, L"-i")) {
DisplayRamDiskInfo (RamDiskServicesProtocol);
goto ON_EXIT;
}
//
// -f parameter to load file and register RAM disk
//
if(ShellCommandLineGetFlag (ParamPackage, L"-f")){
ValueStr = ShellCommandLineGetValue (ParamPackage, L"-f");
ValueStrPtr = ValueStr;
if (ValueStr != NULL) {
Status = ShellOpenFileByName (
ValueStrPtr,
&FileHandle,
EFI_FILE_MODE_READ,
EFI_FILE_READ_ONLY
);
if (EFI_ERROR (Status)) {
Print (L"Open file fail !!!\n");
goto ON_EXIT;
}
Status = ShellGetFileSize(FileHandle, &FileSize);
if (EFI_ERROR (Status)) {
Print (L"Get file size fail !!!\n");
goto ON_EXIT;
}
FileBuffer = AllocatePool(FileSize);
if (FileBuffer == NULL){
Print (L"Allocate Memory for file fail !!!\n");
Status = EFI_OUT_OF_RESOURCES;
goto ON_EXIT;
}
Status = ShellReadFile(FileHandle, &FileSize, FileBuffer);
if (EFI_ERROR (Status)) {
Print (L"Read file fail\n");
goto ON_EXIT;
}
Status = gBS->LocateProtocol (
&gEfiRamDiskProtocolGuid,
NULL,
(VOID **)&Edk2RamDiskProtocol
);
if (EFI_ERROR (Status)) {
Print (L"gEfiRamDiskProtocolGuid not found!!!\n");
goto ON_EXIT;
}
Status = Edk2RamDiskProtocol->Register (
(UINT64)(UINTN)FileBuffer,
FileSize,
&gEfiVirtualDiskGuid,
NULL,
&FileDevicePath
);
if (EFI_ERROR (Status)) {
Print (L"Register RAM Disk fail !!!\n");
goto ON_EXIT;
}
goto ON_EXIT;
} else {
Print (L"-f sholud given a file name !!!\n");
goto ON_EXIT;
}
}
if (ShellCommandLineGetFlag (ParamPackage, L"-c")) {
ValueStr = ShellCommandLineGetValue (ParamPackage, L"-s");
ValueStrPtr = ValueStr;
if (ValueStr != NULL) {
RamDiskSize = (UINT32)ShellStrToUintn (ValueStrPtr);
if (RamDiskSize < 1) {
Print (L"Minimal size is 1MB, change size to 1MB.\n");
RamDiskSize = 1;
}
if (RamDiskSize > 512) {
Print (L"Maxmal size is 512MB, change size to 512MB.\n");
RamDiskSize = 512;
}
}
if (ShellCommandLineGetFlag (ParamPackage, L"-r")) {
Removable = TRUE;
}
Status = RamDiskServicesProtocol->Create (
RamDiskSize,
Removable,
&RamDiskId
);
if (EFI_ERROR (Status)) {
Print (L"Status : %r\n", Status);
goto ON_EXIT;
}
if (Removable) {
Print (L"Create %d MB removable RAM Disk success.\n", RamDiskSize);
} else {
Print (L"Create %d MB RAM Disk success.\n", RamDiskSize);
}
Print (L"New RAM Disk ID : 0x%lx\n", RamDiskId);
goto ON_EXIT;
}
ValueStr = ShellCommandLineGetValue (ParamPackage, L"-d");
ValueStrPtr = ValueStr;
if (ValueStr != NULL) {
RamDiskId = (UINT64)ShellStrToUintn (ValueStrPtr);
Status = RamDiskServicesProtocol->Remove (RamDiskId);
if (EFI_ERROR (Status)) {
if (Status == EFI_DEVICE_ERROR) {
Print (L"This RAM Disk is not a removable device.\n");
} else if (Status == EFI_NOT_FOUND) {
Print (L"Cannot find specific RAM Disk.\n");
} else {
Print (L"Status : %r\n", Status);
}
goto ON_EXIT;
}
Print (L"Remove specific RAM Disk success.\n");
goto ON_EXIT;
}
ON_EXIT:
ShellCommandLineFreeVarList (ParamPackage);
HiiRemovePackages (mHiiHandle);
return Status;
}