From d86b04fbe9955e3fc56f3f529a505005ad3a090f Mon Sep 17 00:00:00 2001 From: Qiu Shumin Date: Thu, 4 Dec 2014 01:18:04 +0000 Subject: ShellPkg: Connect all the consoles in "reconnect -r". Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Qiu Shumin Reviewed-by: Jaben Carsey git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16473 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Library/UefiShellDriver1CommandsLib/Connect.c | 26 +++++---- .../UefiShellDriver1CommandsLib/Reconnect.c | 65 ++++++++++++++++++++-- .../UefiShellDriver1CommandsLib.h | 15 +++++ 3 files changed, 89 insertions(+), 17 deletions(-) (limited to 'ShellPkg') diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c index 11b8e91bc5..bd4a374d91 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c @@ -93,6 +93,8 @@ ShellConnectPciRootBridge ( for (RootBridgeIndex = 0; RootBridgeIndex < RootBridgeHandleCount; RootBridgeIndex++) { gBS->ConnectController (RootBridgeHandleBuffer[RootBridgeIndex], NULL, NULL, FALSE); } + + FreePool (RootBridgeHandleBuffer); return EFI_SUCCESS; } @@ -192,7 +194,7 @@ ConnectControllers ( **/ EFI_STATUS EFIAPI -ConnectFromDevPaths ( +ShellConnectFromDevPaths ( IN CONST CHAR16 *Key ) { @@ -462,31 +464,31 @@ ShellCommandRunConnect ( // do the conin and conout from EFI variables // if the first fails dont 'loose' the error // - Status = ConnectFromDevPaths(L"ConInDev"); + Status = ShellConnectFromDevPaths(L"ConInDev"); if (EFI_ERROR(Status)) { - ConnectFromDevPaths(L"ConOutDev"); + ShellConnectFromDevPaths(L"ConOutDev"); } else { - Status = ConnectFromDevPaths(L"ConOutDev"); + Status = ShellConnectFromDevPaths(L"ConOutDev"); } if (EFI_ERROR(Status)) { - ConnectFromDevPaths(L"ErrOutDev"); + ShellConnectFromDevPaths(L"ErrOutDev"); } else { - Status = ConnectFromDevPaths(L"ErrOutDev"); + Status = ShellConnectFromDevPaths(L"ErrOutDev"); } if (EFI_ERROR(Status)) { - ConnectFromDevPaths(L"ErrOut"); + ShellConnectFromDevPaths(L"ErrOut"); } else { - Status = ConnectFromDevPaths(L"ErrOut"); + Status = ShellConnectFromDevPaths(L"ErrOut"); } if (EFI_ERROR(Status)) { - ConnectFromDevPaths(L"ConIn"); + ShellConnectFromDevPaths(L"ConIn"); } else { - Status = ConnectFromDevPaths(L"ConIn"); + Status = ShellConnectFromDevPaths(L"ConIn"); } if (EFI_ERROR(Status)) { - ConnectFromDevPaths(L"ConOut"); + ShellConnectFromDevPaths(L"ConOut"); } else { - Status = ConnectFromDevPaths(L"ConOut"); + Status = ShellConnectFromDevPaths(L"ConOut"); } if (EFI_ERROR(Status)) { ShellStatus = SHELL_DEVICE_ERROR; diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/Reconnect.c b/ShellPkg/Library/UefiShellDriver1CommandsLib/Reconnect.c index e6a0fba20d..e4747e310a 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/Reconnect.c +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/Reconnect.c @@ -1,7 +1,7 @@ /** @file Main file for Reconnect shell Driver1 function. - Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.
+ Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -14,6 +14,30 @@ #include "UefiShellDriver1CommandsLib.h" +STATIC CONST SHELL_PARAM_ITEM ParamList[] = { + {L"-r", TypeFlag}, + {NULL, TypeMax} + }; + +/** + Connect all the possible console devices. + +**/ +VOID +ConnectAllConsoles ( + VOID + ) +{ + ShellConnectFromDevPaths(L"ConInDev"); + ShellConnectFromDevPaths(L"ConOutDev"); + ShellConnectFromDevPaths(L"ErrOutDev"); + + ShellConnectFromDevPaths(L"ErrOut"); + ShellConnectFromDevPaths(L"ConIn"); + ShellConnectFromDevPaths(L"ConOut"); +} + + /** Function for 'reconnect' command. @@ -28,15 +52,46 @@ ShellCommandRunReconnect ( ) { SHELL_STATUS ShellStatus; + LIST_ENTRY *Package; + CHAR16 *ProblemParam; + EFI_STATUS Status; gInReconnect = TRUE; + ShellStatus = SHELL_SUCCESS; + + // + // initialize the shell lib (we must be in non-auto-init...) + // + Status = ShellInitialize(); + ASSERT_EFI_ERROR(Status); - ShellStatus = ShellCommandRunDisconnect(ImageHandle, SystemTable); - if (ShellStatus == SHELL_SUCCESS) { - ShellStatus = ShellCommandRunConnect(ImageHandle, SystemTable); - } + Status = CommandInit(); + ASSERT_EFI_ERROR(Status); + + // + // parse the command line + // + Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE); + if (EFI_ERROR(Status)) { + if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { + ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam); + FreePool(ProblemParam); + ShellStatus = SHELL_INVALID_PARAMETER; + } else { + ASSERT(FALSE); + } + } else { + ShellStatus = ShellCommandRunDisconnect(ImageHandle, SystemTable); + if (ShellStatus == SHELL_SUCCESS) { + if (ShellCommandLineGetFlag(Package, L"-r")) { + ConnectAllConsoles(); + } + ShellStatus = ShellCommandRunConnect(ImageHandle, SystemTable); + } + } gInReconnect = FALSE; return (ShellStatus); } + diff --git a/ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.h b/ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.h index 1b8e56822d..c65d0ed695 100644 --- a/ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.h +++ b/ShellPkg/Library/UefiShellDriver1CommandsLib/UefiShellDriver1CommandsLib.h @@ -207,5 +207,20 @@ ShellCommandRunUnload ( IN EFI_SYSTEM_TABLE *SystemTable ); +/** + Do a connect from an EFI variable via it's key name. + + @param[in] Key The name of the EFI Variable. + + @retval EFI_SUCCESS The operation was successful. +**/ +EFI_STATUS +EFIAPI +ShellConnectFromDevPaths ( + IN CONST CHAR16 *Key + ); + + + #endif -- cgit v1.2.3