1 /** @file 2 Main file for attrib shell level 2 function. 3 4 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR> 5 Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR> 6 This program and the accompanying materials 7 are licensed and made available under the terms and conditions of the BSD License 8 which accompanies this distribution. The full text of the license may be found at 9 http://opensource.org/licenses/bsd-license.php 10 11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 13 14 **/ 15 16 #include "UefiShellLevel2CommandsLib.h" 17 18 STATIC CONST SHELL_PARAM_ITEM ResetParamList[] = { 19 {L"-w", TypeValue}, 20 {L"-s", TypeValue}, 21 {L"-c", TypeValue}, 22 {NULL, TypeMax} 23 }; 24 25 /** 26 Function for 'reset' command. 27 28 @param[in] ImageHandle Handle to the Image (NULL if Internal). 29 @param[in] SystemTable Pointer to the System Table (NULL if Internal). 30 **/ 31 SHELL_STATUS 32 EFIAPI 33 ShellCommandRunReset ( 34 IN EFI_HANDLE ImageHandle, 35 IN EFI_SYSTEM_TABLE *SystemTable 36 ) 37 { 38 EFI_STATUS Status; 39 LIST_ENTRY *Package; 40 CONST CHAR16 *String; 41 CHAR16 *ProblemParam; 42 SHELL_STATUS ShellStatus; 43 44 ShellStatus = SHELL_SUCCESS; 45 ProblemParam = NULL; 46 47 // 48 // initialize the shell lib (we must be in non-auto-init...) 49 // 50 Status = ShellInitialize(); 51 ASSERT_EFI_ERROR(Status); 52 53 // 54 // parse the command line 55 // 56 Status = ShellCommandLineParse (ResetParamList, &Package, &ProblemParam, TRUE); 57 if (EFI_ERROR(Status)) { 58 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { 59 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"reset", ProblemParam); 60 FreePool(ProblemParam); 61 return (SHELL_INVALID_PARAMETER); 62 } else { 63 ASSERT(FALSE); 64 } 65 } else { 66 // 67 // check for "-?" 68 // 69 if (ShellCommandLineGetFlag(Package, L"-?")) { 70 ASSERT(FALSE); 71 } else if (ShellCommandLineGetRawValue(Package, 1) != NULL) { 72 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); 73 ShellStatus = SHELL_INVALID_PARAMETER; 74 } else { 75 // 76 // check for warm reset flag, then shutdown reset flag, then cold (default) reset flag 77 // 78 if (ShellCommandLineGetFlag(Package, L"-w")) { 79 if (ShellCommandLineGetFlag(Package, L"-s") || ShellCommandLineGetFlag(Package, L"-c")) { 80 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); 81 ShellStatus = SHELL_INVALID_PARAMETER; 82 } else { 83 String = ShellCommandLineGetValue(Package, L"-w"); 84 if (String != NULL) { 85 gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, StrSize(String), (VOID*)String); 86 } else { 87 gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL); 88 } 89 } 90 } else if (ShellCommandLineGetFlag(Package, L"-s")) { 91 if (ShellCommandLineGetFlag(Package, L"-c")) { 92 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); 93 ShellStatus = SHELL_INVALID_PARAMETER; 94 } else { 95 String = ShellCommandLineGetValue(Package, L"-s"); 96 DEBUG_CODE(ShellPrintEx(-1,-1,L"Reset with %s (%d bytes)", String, String!=NULL?StrSize(String):0);); 97 if (String != NULL) { 98 gRT->ResetSystem(EfiResetShutdown, EFI_SUCCESS, StrSize(String), (VOID*)String); 99 } else { 100 gRT->ResetSystem(EfiResetShutdown, EFI_SUCCESS, 0, NULL); 101 } 102 } 103 } else { 104 // 105 // this is default so dont worry about flag... 106 // 107 String = ShellCommandLineGetValue(Package, L"-c"); 108 if (String != NULL) { 109 gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, StrSize(String), (VOID*)String); 110 } else { 111 gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); 112 } 113 } 114 } 115 } 116 117 // 118 // we should never get here... so the free and return are for formality more than use 119 // as the ResetSystem function should not return... 120 // 121 122 // 123 // free the command line package 124 // 125 ShellCommandLineFreeVarList (Package); 126 127 // 128 // return the status 129 // 130 return (ShellStatus); 131 } 132 133