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 - 2016, 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 18STATIC CONST SHELL_PARAM_ITEM ResetParamList[] = { 19 {L"-w", TypeValue}, 20 {L"-s", TypeValue}, 21 {L"-c", TypeValue}, 22 {L"-fwui", TypeFlag }, 23 {NULL, TypeMax } 24 }; 25 26/** 27 Function for 'reset' command. 28 29 @param[in] ImageHandle Handle to the Image (NULL if Internal). 30 @param[in] SystemTable Pointer to the System Table (NULL if Internal). 31**/ 32SHELL_STATUS 33EFIAPI 34ShellCommandRunReset ( 35 IN EFI_HANDLE ImageHandle, 36 IN EFI_SYSTEM_TABLE *SystemTable 37 ) 38{ 39 EFI_STATUS Status; 40 LIST_ENTRY *Package; 41 CONST CHAR16 *String; 42 CHAR16 *ProblemParam; 43 SHELL_STATUS ShellStatus; 44 UINT64 OsIndications; 45 UINT32 Attr; 46 UINTN DataSize; 47 48 ShellStatus = SHELL_SUCCESS; 49 ProblemParam = NULL; 50 51 // 52 // initialize the shell lib (we must be in non-auto-init...) 53 // 54 Status = ShellInitialize(); 55 ASSERT_EFI_ERROR(Status); 56 57 // 58 // parse the command line 59 // 60 Status = ShellCommandLineParse (ResetParamList, &Package, &ProblemParam, TRUE); 61 if (EFI_ERROR(Status)) { 62 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) { 63 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellLevel2HiiHandle, L"reset", ProblemParam); 64 FreePool(ProblemParam); 65 return (SHELL_INVALID_PARAMETER); 66 } else { 67 ASSERT(FALSE); 68 } 69 } else { 70 // 71 // check for "-?" 72 // 73 if (ShellCommandLineGetFlag(Package, L"-?")) { 74 ASSERT(FALSE); 75 } else if (ShellCommandLineGetRawValue(Package, 1) != NULL) { 76 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); 77 ShellStatus = SHELL_INVALID_PARAMETER; 78 } else { 79 80 if (ShellCommandLineGetFlag (Package, L"-fwui")) { 81 82 DataSize = sizeof (OsIndications); 83 Status = gRT->GetVariable ( 84 EFI_OS_INDICATIONS_SUPPORT_VARIABLE_NAME, &gEfiGlobalVariableGuid, 85 &Attr, &DataSize, &OsIndications 86 ); 87 if (!EFI_ERROR (Status)) { 88 if ((OsIndications & EFI_OS_INDICATIONS_BOOT_TO_FW_UI) != 0) { 89 DataSize = sizeof (OsIndications); 90 Status = gRT->GetVariable ( 91 EFI_OS_INDICATIONS_VARIABLE_NAME, &gEfiGlobalVariableGuid, 92 &Attr, &DataSize, &OsIndications 93 ); 94 if (!EFI_ERROR (Status)) { 95 OsIndications |= EFI_OS_INDICATIONS_BOOT_TO_FW_UI; 96 } else { 97 OsIndications = EFI_OS_INDICATIONS_BOOT_TO_FW_UI; 98 } 99 Status = gRT->SetVariable ( 100 EFI_OS_INDICATIONS_VARIABLE_NAME, &gEfiGlobalVariableGuid, 101 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, 102 sizeof (OsIndications), &OsIndications 103 ); 104 } 105 } 106 if (EFI_ERROR (Status)) { 107 ShellStatus = SHELL_UNSUPPORTED; 108 goto Error; 109 } 110 } 111 112 // 113 // check for warm reset flag, then shutdown reset flag, then cold (default) reset flag 114 // 115 if (ShellCommandLineGetFlag(Package, L"-w")) { 116 if (ShellCommandLineGetFlag(Package, L"-s") || ShellCommandLineGetFlag(Package, L"-c")) { 117 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); 118 ShellStatus = SHELL_INVALID_PARAMETER; 119 } else { 120 String = ShellCommandLineGetValue(Package, L"-w"); 121 if (String != NULL) { 122 gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, StrSize(String), (VOID*)String); 123 } else { 124 gRT->ResetSystem(EfiResetWarm, EFI_SUCCESS, 0, NULL); 125 } 126 } 127 } else if (ShellCommandLineGetFlag(Package, L"-s")) { 128 if (ShellCommandLineGetFlag(Package, L"-c")) { 129 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellLevel2HiiHandle, L"reset"); 130 ShellStatus = SHELL_INVALID_PARAMETER; 131 } else { 132 String = ShellCommandLineGetValue(Package, L"-s"); 133 DEBUG_CODE(ShellPrintEx(-1,-1,L"Reset with %s (%d bytes)", String, String!=NULL?StrSize(String):0);); 134 if (String != NULL) { 135 gRT->ResetSystem(EfiResetShutdown, EFI_SUCCESS, StrSize(String), (VOID*)String); 136 } else { 137 gRT->ResetSystem(EfiResetShutdown, EFI_SUCCESS, 0, NULL); 138 } 139 } 140 } else { 141 // 142 // this is default so dont worry about flag... 143 // 144 String = ShellCommandLineGetValue(Package, L"-c"); 145 if (String != NULL) { 146 gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, StrSize(String), (VOID*)String); 147 } else { 148 gRT->ResetSystem(EfiResetCold, EFI_SUCCESS, 0, NULL); 149 } 150 } 151 } 152 } 153 154 // 155 // we should never get here... so the free and return are for formality more than use 156 // as the ResetSystem function should not return... 157 // 158 159Error: 160 // 161 // free the command line package 162 // 163 ShellCommandLineFreeVarList (Package); 164 165 // 166 // return the status 167 // 168 return (ShellStatus); 169} 170 171