windows-nt/Source/XPSP1/NT/base/efiutil/sdk/shell/shellenv/protid.c
2020-09-26 16:20:57 +08:00

971 lines
26 KiB
C

/*++
Copyright (c) 1998 Intel Corporation
Module Name:
protid.c
Abstract:
Shell environment protocol id information management
Revision History
--*/
#include "shelle.h"
#include "efivar.h"
#include "LegacyBoot.h"
#include "VgaClass.h"
#include "EfiConSplit.h"
#include "intload.h"
#define PROTOCOL_INFO_SIGNATURE EFI_SIGNATURE_32('s','p','i','n')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
/* parsing info for the protocol */
EFI_GUID ProtocolId;
CHAR16 *IdString;
SHELLENV_DUMP_PROTOCOL_INFO DumpToken;
SHELLENV_DUMP_PROTOCOL_INFO DumpInfo;
/* database info on which handles are supporting this protocol */
UINTN NoHandles;
EFI_HANDLE *Handles;
} PROTOCOL_INFO;
struct {
CHAR16 *IdString;
SHELLENV_DUMP_PROTOCOL_INFO DumpInfo;
SHELLENV_DUMP_PROTOCOL_INFO DumpToken;
EFI_GUID ProtocolId;
} SEnvInternalProtocolInfo[] = {
L"DevIo", NULL, NULL, DEVICE_IO_PROTOCOL,
L"fs", NULL, NULL, SIMPLE_FILE_SYSTEM_PROTOCOL,
L"diskio", NULL, NULL, DISK_IO_PROTOCOL,
L"blkio", SEnvBlkIo, NULL, BLOCK_IO_PROTOCOL,
L"txtin", NULL, NULL, SIMPLE_TEXT_INPUT_PROTOCOL,
L"txtout", SEnvTextOut, NULL, SIMPLE_TEXT_OUTPUT_PROTOCOL,
L"fs", NULL, NULL, SIMPLE_FILE_SYSTEM_PROTOCOL,
L"load", NULL, NULL, LOAD_FILE_PROTOCOL,
L"image", SEnvImage, SEnvImageTok, LOADED_IMAGE_PROTOCOL,
L"varstore", NULL, NULL, VARIABLE_STORE_PROTOCOL,
L"unicode", NULL, NULL, UNICODE_COLLATION_PROTOCOL,
L"LegacyBoot", NULL, NULL, LEGACY_BOOT_PROTOCOL,
L"serialio", NULL, NULL, SERIAL_IO_PROTOCOL,
L"pxebc", NULL, NULL, EFI_PXE_BASE_CODE_PROTOCOL,
L"net", NULL, NULL, EFI_SIMPLE_NETWORK_PROTOCOL,
L"VgaClass", NULL, NULL, VGA_CLASS_DRIVER_PROTOCOL,
L"TxtOutSplit", NULL, NULL, TEXT_OUT_SPLITER_PROTOCOL,
L"ErrOutSplit", NULL, NULL, ERROR_OUT_SPLITER_PROTOCOL,
L"TxtInSplit", NULL, NULL, TEXT_IN_SPLITER_PROTOCOL,
L"dpath", SEnvDPath, SEnvDPathTok, DEVICE_PATH_PROTOCOL,
/* just plain old protocol ids */
L"ShellInt", NULL, NULL, SHELL_INTERFACE_PROTOCOL,
L"SEnv", NULL, NULL, ENVIRONMENT_VARIABLE_ID,
L"ShellProtId", NULL, NULL, PROTOCOL_ID_ID,
L"ShellDevPathMap", NULL, NULL, DEVICE_PATH_MAPPING_ID,
L"ShellAlias", NULL, NULL, ALIAS_ID,
/* ID guids */
L"G0", NULL, NULL, { 0,0,0,0,0,0,0,0,0,0,0 },
L"Efi", NULL, NULL, EFI_GLOBAL_VARIABLE,
L"GenFileInfo", NULL, NULL, EFI_FILE_INFO_ID,
L"FileSysInfo", NULL, NULL, EFI_FILE_SYSTEM_INFO_ID,
L"PcAnsi", NULL, NULL, DEVICE_PATH_MESSAGING_PC_ANSI,
L"Vt100", NULL, NULL, DEVICE_PATH_MESSAGING_VT_100,
L"InternalLoad", NULL, NULL, INTERNAL_LOAD_PROTOCOL,
L"Unknown Device", NULL, NULL, UNKNOWN_DEVICE_GUID,
NULL
} ;
/*
* SEnvProtocolInfo - A list of all known protocol info structures
*/
LIST_ENTRY SEnvProtocolInfo;
/*
*
*/
VOID
INTERNAL
SEnvInitProtocolInfo (
VOID
)
{
InitializeListHead (&SEnvProtocolInfo);
}
VOID
INTERNAL
SEnvLoadInternalProtInfo (
VOID
)
/* Initialize internal protocol handlers */
{
UINTN Index;
for (Index=0; SEnvInternalProtocolInfo[Index].IdString; Index += 1) {
SEnvAddProtocol (
&SEnvInternalProtocolInfo[Index].ProtocolId,
SEnvInternalProtocolInfo[Index].DumpToken,
SEnvInternalProtocolInfo[Index].DumpInfo,
SEnvInternalProtocolInfo[Index].IdString
);
}
}
PROTOCOL_INFO *
SEnvGetProtById (
IN EFI_GUID *Protocol,
IN BOOLEAN GenId
)
/* Locate a protocol handle by guid */
{
PROTOCOL_INFO *Prot;
LIST_ENTRY *Link;
UINTN LastId, Id;
CHAR16 s[40];
ASSERT_LOCKED(&SEnvGuidLock);
/*
* Find the protocol entry for this id
*/
LastId = 0;
for (Link=SEnvProtocolInfo.Flink; Link != &SEnvProtocolInfo; Link=Link->Flink) {
Prot = CR(Link, PROTOCOL_INFO, Link, PROTOCOL_INFO_SIGNATURE);
if (CompareGuid(&Prot->ProtocolId, Protocol) == 0) {
return Prot;
}
if (Prot->IdString[0] == 'g') {
Id = Atoi(Prot->IdString+1);
LastId = Id > LastId ? Id : LastId;
}
}
/*
* If the protocol id is not found, gen a string for it if needed
*/
Prot = NULL;
if (GenId) {
SPrint (s, sizeof(s), L"g%d", LastId+1);
Prot = AllocateZeroPool (sizeof(PROTOCOL_INFO));
if (Prot) {
Prot->Signature = PROTOCOL_INFO_SIGNATURE;
CopyMem (&Prot->ProtocolId, Protocol, sizeof(EFI_GUID));
Prot->IdString = StrDuplicate(s);
InsertTailList (&SEnvProtocolInfo, &Prot->Link);
}
}
return Prot;
}
PROTOCOL_INFO *
SEnvGetProtByStr (
IN CHAR16 *Str
)
{
PROTOCOL_INFO *Prot;
LIST_ENTRY *Link;
UINTN Index;
EFI_GUID Guid;
CHAR16 c;
CHAR16 *p;
ASSERT_LOCKED(&SEnvGuidLock);
/* Search for short name match */
for (Link=SEnvProtocolInfo.Flink; Link != &SEnvProtocolInfo; Link=Link->Flink) {
Prot = CR(Link, PROTOCOL_INFO, Link, PROTOCOL_INFO_SIGNATURE);
if (StriCmp(Prot->IdString, Str) == 0) {
return Prot;
}
}
/* Convert Str to guid and then match */
if (StrLen(Str) == 36 && Str[9] == '-' && Str[19] == '-' && Str[24] == '-') {
Guid.Data1 = (UINT32) xtoi(Str+0);
Guid.Data2 = (UINT16) xtoi(Str+10);
Guid.Data3 = (UINT16) xtoi(Str+15);
for (Index=0; Index < 8; Index++) {
p = Str+25+Index*2;
c = p[3];
p[3] = 0;
Guid.Data4[Index] = (UINT8) xtoi(p);
p[3] = c;
}
for (Link=SEnvProtocolInfo.Flink; Link != &SEnvProtocolInfo; Link=Link->Flink) {
Prot = CR(Link, PROTOCOL_INFO, Link, PROTOCOL_INFO_SIGNATURE);
if (CompareGuid(&Prot->ProtocolId, &Guid) == 0) {
return Prot;
}
}
}
return NULL;
}
EFI_STATUS
SEnvIGetProtID (
IN CHAR16 *Str,
OUT EFI_GUID *ProtId
)
{
PROTOCOL_INFO *Prot;
EFI_STATUS Status;
AcquireLock (&SEnvGuidLock);
Status = EFI_NOT_FOUND;
CopyMem (ProtId, &NullGuid, sizeof(EFI_GUID));
Prot = SEnvGetProtByStr (Str);
if (Prot) {
CopyMem (ProtId, &Prot->ProtocolId, sizeof(EFI_GUID));
Status = EFI_SUCCESS;
}
ReleaseLock (&SEnvGuidLock);
return Status;
}
VOID
SEnvAddProtocol (
IN EFI_GUID *Protocol,
IN SHELLENV_DUMP_PROTOCOL_INFO DumpToken OPTIONAL,
IN SHELLENV_DUMP_PROTOCOL_INFO DumpInfo OPTIONAL,
IN CHAR16 *IdString
)
/* Published interface to add protocol handlers */
{
SEnvIAddProtocol (TRUE, Protocol, DumpToken, DumpInfo, IdString);
}
VOID
INTERNAL
SEnvIAddProtocol (
IN BOOLEAN SaveId,
IN EFI_GUID *Protocol,
IN SHELLENV_DUMP_PROTOCOL_INFO DumpToken OPTIONAL,
IN SHELLENV_DUMP_PROTOCOL_INFO DumpInfo OPTIONAL,
IN CHAR16 *IdString
)
/* Internal interface to add protocol handlers */
{
PROTOCOL_INFO *Prot;
BOOLEAN StoreInfo;
CHAR16 *ObsoleteName;
ObsoleteName = NULL;
StoreInfo = FALSE;
AcquireLock (&SEnvGuidLock);
/*
* Get the current protocol info
*/
Prot = SEnvGetProtById (Protocol, FALSE);
if (Prot) {
/*
* If the name has changed, delete the old var
*/
if (StriCmp (Prot->IdString, IdString)) {
ObsoleteName = Prot->IdString;
StoreInfo = TRUE;
} else {
FreePool (Prot->IdString);
}
Prot->IdString = NULL;
} else {
/*
* Allocate new protocol info
*/
Prot = AllocateZeroPool (sizeof(PROTOCOL_INFO));
Prot->Signature = PROTOCOL_INFO_SIGNATURE;
StoreInfo = TRUE;
}
/*
* Apply any updates to the protocol info
*/
if (Prot) {
CopyMem (&Prot->ProtocolId, Protocol, sizeof(EFI_GUID));
Prot->IdString = StrDuplicate(IdString);
Prot->DumpToken = DumpToken;
Prot->DumpInfo = DumpInfo;
if (Prot->Link.Flink) {
RemoveEntryList (&Prot->Link);
}
InsertTailList (&SEnvProtocolInfo, &Prot->Link);
}
ReleaseLock (&SEnvGuidLock);
/*
* If the name changed, delete the old name
*/
if (ObsoleteName) {
RT->SetVariable (ObsoleteName, &SEnvProtId, 0, 0, NULL);
FreePool (ObsoleteName);
}
/*
* Store the protocol idstring to a variable
*/
if (Prot && StoreInfo && SaveId) {
RT->SetVariable (
Prot->IdString,
&SEnvProtId,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,
sizeof(EFI_GUID),
&Prot->ProtocolId
);
}
}
VOID
INTERNAL
SEnvLoadHandleProtocolInfo (
IN EFI_GUID *SkipProtocol
)
/* Code to load the internal handle cross-reference info for each protocol */
{
PROTOCOL_INFO *Prot;
LIST_ENTRY *Link;
AcquireLock (&SEnvGuidLock);
for (Link=SEnvProtocolInfo.Flink; Link != &SEnvProtocolInfo; Link=Link->Flink) {
Prot = CR(Link, PROTOCOL_INFO, Link, PROTOCOL_INFO_SIGNATURE);
if (!SkipProtocol || CompareGuid(SkipProtocol, &Prot->ProtocolId) != 0) {
LibLocateHandle (
ByProtocol,
&Prot->ProtocolId,
NULL,
&Prot->NoHandles,
&Prot->Handles
);
}
}
ReleaseLock (&SEnvGuidLock);
}
VOID
INTERNAL
SEnvFreeHandleProtocolInfo (
VOID
)
/* Free the internal handle cross-reference protocol info */
{
PROTOCOL_INFO *Prot;
LIST_ENTRY *Link;
AcquireLock (&SEnvGuidLock);
for (Link=SEnvProtocolInfo.Flink; Link != &SEnvProtocolInfo; Link=Link->Flink) {
Prot = CR(Link, PROTOCOL_INFO, Link, PROTOCOL_INFO_SIGNATURE);
if (Prot->NoHandles) {
FreePool (Prot->Handles);
Prot->Handles = NULL;
Prot->NoHandles = 0;
}
}
ReleaseLock (&SEnvGuidLock);
}
CHAR16 *
INTERNAL
SEnvIGetProtocol (
IN EFI_GUID *ProtocolId,
IN BOOLEAN GenId
)
/* Published interface to lookup a protocol id string */
{
PROTOCOL_INFO *Prot;
CHAR16 *Id;
ASSERT_LOCKED (&SEnvGuidLock);
Prot = SEnvGetProtById(ProtocolId, GenId);
Id = Prot ? Prot->IdString : NULL;
return Id;
}
CHAR16 *
SEnvGetProtocol (
IN EFI_GUID *ProtocolId,
IN BOOLEAN GenId
)
/* Published interface to lookup a protocol id string */
{
CHAR16 *Id;
AcquireLock (&SEnvGuidLock);
Id = SEnvIGetProtocol(ProtocolId, GenId);
ReleaseLock (&SEnvGuidLock);
return Id;
}
EFI_STATUS
INTERNAL
SEnvCmdProt (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
/* Code for internal "prot" command */
{
PROTOCOL_INFO *Prot;
LIST_ENTRY *Link;
UINTN Len, SLen;
CHAR16 *p;
UINTN Index;
BOOLEAN PageBreaks;
UINTN TempColumn;
UINTN ScreenCount;
UINTN ScreenSize;
CHAR16 ReturnStr[1];
InitializeShellApplication (ImageHandle, SystemTable);
PageBreaks = FALSE;
for (Index = 1;Index < SI->Argc; Index++) {
p = SI->Argv[Index];
if (*p == '-') {
switch (p[1]) {
case 'b' :
case 'B' :
PageBreaks = TRUE;
ST->ConOut->QueryMode (ST->ConOut, ST->ConOut->Mode->Mode, &TempColumn, &ScreenSize);
ScreenCount = 0;
break;
default :
Print(L"guid : Unknown flag %s\n",p);
return EFI_INVALID_PARAMETER;
}
}
}
AcquireLock (&SEnvGuidLock);
/*
* Find the protocol entry for this id
*/
SLen = 0;
for (Link=SEnvProtocolInfo.Flink; Link != &SEnvProtocolInfo; Link=Link->Flink) {
Prot = CR(Link, PROTOCOL_INFO, Link, PROTOCOL_INFO_SIGNATURE);
Len = StrLen(Prot->IdString);
if (StrLen(Prot->IdString) > SLen) {
SLen = Len;
}
}
for (Link=SEnvProtocolInfo.Flink; Link != &SEnvProtocolInfo; Link=Link->Flink) {
Prot = CR(Link, PROTOCOL_INFO, Link, PROTOCOL_INFO_SIGNATURE);
/* Can't use Lib function to dump the guid as it may lookup the "short name" for it */
/*
* BUGBUG : Have to release and reacquire the lock for output redirection of this command
* to work properly. Otherwise, we get an ASSERT from RaiseTPL().
*/
ReleaseLock (&SEnvGuidLock);
Print(L" %h-.*s : %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x %c\n",
SLen,
Prot->IdString,
Prot->ProtocolId.Data1,
Prot->ProtocolId.Data2,
Prot->ProtocolId.Data3,
Prot->ProtocolId.Data4[0],
Prot->ProtocolId.Data4[1],
Prot->ProtocolId.Data4[2],
Prot->ProtocolId.Data4[3],
Prot->ProtocolId.Data4[4],
Prot->ProtocolId.Data4[5],
Prot->ProtocolId.Data4[6],
Prot->ProtocolId.Data4[7],
(Prot->DumpToken || Prot->DumpInfo) ? L'*' : L' '
);
if (PageBreaks) {
ScreenCount++;
if (ScreenCount > ScreenSize - 4) {
ScreenCount = 0;
Print (L"\nPress Return to contiue :");
Input (L"", ReturnStr, sizeof(ReturnStr)/sizeof(CHAR16));
Print (L"\n\n");
}
}
AcquireLock (&SEnvGuidLock);
}
ReleaseLock (&SEnvGuidLock);
return EFI_SUCCESS;
}
VOID
SEnvDHProt (
IN BOOLEAN Verbose,
IN UINTN HandleNo,
IN EFI_HANDLE Handle
)
{
PROTOCOL_INFO *Prot;
LIST_ENTRY *Link;
VOID *Interface;
UINTN Index;
EFI_STATUS Status;
SHELLENV_DUMP_PROTOCOL_INFO Dump;
if (!HandleNo) {
for (HandleNo=0; HandleNo < SEnvNoHandles; HandleNo++) {
if (SEnvHandles[HandleNo] == Handle) {
break;
}
}
HandleNo += 1;
}
Print (Verbose ? L"%NHandle %h02x (%hX)\n" : L"%N %h2x: ", HandleNo, Handle);
for (Link=SEnvProtocolInfo.Flink; Link != &SEnvProtocolInfo; Link=Link->Flink) {
Prot = CR(Link, PROTOCOL_INFO, Link, PROTOCOL_INFO_SIGNATURE);
for (Index=0; Index < Prot->NoHandles; Index++) {
/*
* If this handle supports this protocol, dump it
*/
if (Prot->Handles[Index] == Handle) {
Dump = Verbose ? Prot->DumpInfo : Prot->DumpToken;
Status = BS->HandleProtocol (Handle, &Prot->ProtocolId, &Interface);
if (Verbose) {
Print (L" %hs ", Prot->IdString);
if (Dump && !EFI_ERROR(Status)) {
Dump (Handle, Interface);
}
Print (L"\n");
} else {
if (Dump && !EFI_ERROR(Status)) {
Dump (Handle, Interface);
} else {
Print (L"%hs ", Prot->IdString);
}
}
}
}
}
Print (Verbose ? L"%N" : L"%N\n");
}
EFI_STATUS
INTERNAL
SEnvCmdDH (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
/* Code for internal "DH" command */
{
BOOLEAN ByProtocol;
CHAR16 *Arg, *p;
EFI_STATUS Status;
UINTN Index;
PROTOCOL_INFO *Prot;
BOOLEAN PageBreaks;
UINTN TempColumn;
UINTN ScreenCount;
UINTN ScreenSize;
CHAR16 ReturnStr[1];
/*
* Initialize
*/
InitializeShellApplication (ImageHandle, SystemTable);
Arg = NULL;
ByProtocol = FALSE;
/*
* Crack args
*/
PageBreaks = FALSE;
for (Index = 1; Index < SI->Argc; Index += 1) {
p = SI->Argv[Index];
if (*p == '-') {
switch (p[1]) {
case 'p':
case 'P':
ByProtocol = TRUE;
break;
case 'b' :
case 'B' :
PageBreaks = TRUE;
ST->ConOut->QueryMode (ST->ConOut, ST->ConOut->Mode->Mode, &TempColumn, &ScreenSize);
ScreenCount = 0;
break;
default:
Print (L"%EDH: Unkown flag %s\n", p);
Status = EFI_INVALID_PARAMETER;
goto Done;
}
continue;
}
if (!Arg) {
Arg = p;
continue;
}
Print (L"%EDH: too many arguments\n");
Status = EFI_INVALID_PARAMETER;
goto Done;
}
/*
*
* Load handle & protocol info tables
*/
SEnvLoadHandleTable ();
SEnvLoadHandleProtocolInfo (NULL);
if (Arg) {
if (ByProtocol) {
AcquireLock (&SEnvGuidLock);
Prot = SEnvGetProtByStr (Arg);
ReleaseLock (&SEnvGuidLock);
if (Prot) {
/* Dump the handles on this protocol */
Print(L"%NHandle dump by protocol '%s'\n", Prot->IdString);
for (Index=0; Index < Prot->NoHandles; Index++) {
SEnvDHProt (FALSE, 0, Prot->Handles[Index]);
if (PageBreaks) {
ScreenCount++;
if (ScreenCount > ScreenSize - 4) {
ScreenCount = 0;
Print (L"\nPress Return to contiue :");
Input (L"", ReturnStr, sizeof(ReturnStr)/sizeof(CHAR16));
Print (L"\n\n");
}
}
}
} else {
Print(L"%EDH: Protocol '%s' not found\n", Arg);
}
} else {
/* Dump 1 handle */
Index = SEnvHandleNoFromStr(Arg) - 1;
if (Index > SEnvNoHandles) {
Print(L"%EDH: Invalid handle #\n");
} else {
SEnvDHProt (TRUE, Index+1, SEnvHandles[Index]);
}
}
} else {
/* Dump all handles */
Print(L"%NHandle dump\n");
for (Index=0; Index < SEnvNoHandles; Index++) {
SEnvDHProt (FALSE, Index+1, SEnvHandles[Index]);
if (PageBreaks) {
ScreenCount++;
if (ScreenCount > ScreenSize - 4) {
ScreenCount = 0;
Print (L"\nPress Return to contiue :");
Input (L"", ReturnStr, sizeof(ReturnStr)/sizeof(CHAR16));
Print (L"\n\n");
}
}
}
}
Status = EFI_SUCCESS;
Done:
SEnvFreeHandleTable ();
return Status;
}
extern LIST_ENTRY SEnvMap;
extern LIST_ENTRY SEnvEnv;
extern LIST_ENTRY SEnvAlias;
EFI_STATUS
SEnvLoadDefaults (
IN EFI_HANDLE Image,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
LIST_ENTRY DefCmds;
POOL_PRINT Path;
DEFAULT_CMD *Cmd;
PROTOCOL_INFO *ProtFs, *ProtBlkIo;
UINTN Index, HandleNo;
CHAR16 *DefaultMapping;
InitializeShellApplication (Image, SystemTable);
/*
* If we have some settings, use those
*/
if (!IsListEmpty(&SEnvMap) || !IsListEmpty(&SEnvEnv) || !IsListEmpty(&SEnvAlias)) {
return EFI_SUCCESS;
}
/*
* There are no settings, build some defaults
*/
InitializeListHead (&DefCmds);
ZeroMem (&Path, sizeof(Path));
AcquireLock (&SEnvLock);
SEnvLoadHandleTable();
SEnvLoadHandleProtocolInfo (NULL);
AcquireLock (&SEnvGuidLock);
ProtFs = SEnvGetProtByStr(L"fs");
ProtBlkIo = SEnvGetProtByStr(L"blkio");
ReleaseLock (&SEnvGuidLock);
/*
* Run all the devices that support a File System and add a default
* mapping and path setting for each device
*/
CatPrint (&Path, L"set path ");
for (Index=0; Index < ProtFs->NoHandles; Index++) {
for (HandleNo=0; HandleNo < SEnvNoHandles; HandleNo++) {
if (SEnvHandles[HandleNo] == ProtFs->Handles[Index]) {
break;
}
}
HandleNo += 1;
Cmd = AllocateZeroPool(sizeof(DEFAULT_CMD));
Cmd->Line = Cmd->Buffer;
SPrint(Cmd->Line, sizeof(Cmd->Buffer), L"map fs%x %x", Index, HandleNo);
InsertTailList(&DefCmds, &Cmd->Link);
/* append this device to the path */
CatPrint (&Path, L"fs%x:\\efi\\tools;fs%x:\\;", Index, Index);
}
CatPrint (&Path, L".");
/*
* Run all the devices that support a BlockIo and add a default
* mapping for the device
*/
for (Index=0; Index < ProtBlkIo->NoHandles; Index++) {
for (HandleNo=0; HandleNo < SEnvNoHandles; HandleNo++) {
if (SEnvHandles[HandleNo] == ProtBlkIo->Handles[Index]) {
break;
}
}
HandleNo += 1;
Cmd = AllocateZeroPool(sizeof(DEFAULT_CMD));
Cmd->Line = Cmd->Buffer;
SPrint(Cmd->Line, sizeof(Cmd->Buffer), L"map blk%x %x", Index, HandleNo);
InsertTailList(&DefCmds, &Cmd->Link);
}
/* release handle table resources & lock */
SEnvFreeHandleTable();
ReleaseLock (&SEnvLock);
/*
* execute all the queue commands
*/
while (!IsListEmpty(&DefCmds)) {
Cmd = CR(DefCmds.Flink, DEFAULT_CMD, Link, 0);
SEnvExecute (Image, Cmd->Line, TRUE);
RemoveEntryList (&Cmd->Link);
FreePool (Cmd);
}
SEnvExecute (Image, Path.str, TRUE);
SEnvExecute (Image, L"alias dir ls", TRUE);
SEnvExecute (Image, L"alias md mkdir", TRUE);
SEnvExecute (Image, L"alias rd rm", TRUE);
SEnvExecute (Image, L"alias del rm", TRUE);
SEnvExecute (Image, L"alias copy cp", TRUE);
DefaultMapping = SEnvGetDefaultMapping(Image);
if (DefaultMapping!=NULL) {
ZeroMem (&Path, sizeof(Path));
CatPrint(&Path,L"%s:",DefaultMapping);
SEnvExecute (Image, Path.str, TRUE);
}
FreePool (Path.str);
return EFI_SUCCESS;
}
EFI_STATUS
SEnvReloadDefaults (
IN EFI_HANDLE Image,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
LIST_ENTRY DefCmds;
POOL_PRINT Path;
DEFAULT_CMD *Cmd;
PROTOCOL_INFO *ProtFs, *ProtBlkIo;
UINTN Index, HandleNo;
InitializeShellApplication (Image, SystemTable);
/*
* There are no settings, build some defaults
*/
InitializeListHead (&DefCmds);
ZeroMem (&Path, sizeof(Path));
AcquireLock (&SEnvLock);
SEnvLoadHandleTable();
SEnvLoadHandleProtocolInfo (NULL);
AcquireLock (&SEnvGuidLock);
ProtFs = SEnvGetProtByStr(L"fs");
ProtBlkIo = SEnvGetProtByStr(L"blkio");
ReleaseLock (&SEnvGuidLock);
/*
* Run all the devices that support a File System and add a default
* mapping and path setting for each device
*/
CatPrint (&Path, L"set path ");
for (Index=0; Index < ProtFs->NoHandles; Index++) {
for (HandleNo=0; HandleNo < SEnvNoHandles; HandleNo++) {
if (SEnvHandles[HandleNo] == ProtFs->Handles[Index]) {
break;
}
}
HandleNo += 1;
Cmd = AllocateZeroPool(sizeof(DEFAULT_CMD));
Cmd->Line = Cmd->Buffer;
SPrint(Cmd->Line, sizeof(Cmd->Buffer), L"map fs%x %x", Index, HandleNo);
InsertTailList(&DefCmds, &Cmd->Link);
/* append this device to the path */
CatPrint (&Path, L"fs%x:\\efi\\tools;fs%x:\\;", Index, Index);
}
CatPrint (&Path, L".");
/*
* Run all the devices that support a BlockIo and add a default
* mapping for the device
*/
for (Index=0; Index < ProtBlkIo->NoHandles; Index++) {
for (HandleNo=0; HandleNo < SEnvNoHandles; HandleNo++) {
if (SEnvHandles[HandleNo] == ProtBlkIo->Handles[Index]) {
break;
}
}
HandleNo += 1;
Cmd = AllocateZeroPool(sizeof(DEFAULT_CMD));
Cmd->Line = Cmd->Buffer;
SPrint(Cmd->Line, sizeof(Cmd->Buffer), L"map blk%x %x", Index, HandleNo);
InsertTailList(&DefCmds, &Cmd->Link);
}
/* release handle table resources & lock */
SEnvFreeHandleTable();
ReleaseLock (&SEnvLock);
/*
* execute all the queue commands
*/
while (!IsListEmpty(&DefCmds)) {
Cmd = CR(DefCmds.Flink, DEFAULT_CMD, Link, 0);
SEnvExecute (Image, Cmd->Line, TRUE);
RemoveEntryList (&Cmd->Link);
FreePool (Cmd);
}
SEnvExecute (Image, Path.str, TRUE);
FreePool (Path.str);
return EFI_SUCCESS;
}