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