]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Disconnect.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for Disconnect shell Driver1 function.\r
3\r
339a2b93 4 (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
c011b6c9 5 (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>\r
ba0014b9 6 Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
56ba3746 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
4ba49616 8\r
9**/\r
10\r
11#include "UefiShellDriver1CommandsLib.h"\r
12\r
47d20b54
MK
13STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
14 { L"-r", TypeFlag },\r
15 { L"-nc", TypeFlag },\r
16 { NULL, TypeMax }\r
17};\r
4ba49616 18\r
361a8267 19/**\r
20 Disconnect everything.\r
21\r
22 @retval EFI_SUCCESS The operation was successful.\r
23**/\r
4ba49616 24EFI_STATUS\r
47d20b54 25DisconnectAll (\r
4ba49616 26 VOID\r
27 )\r
28{\r
29 //\r
30 // Stolen from UEFI 2.3 spec (May 2009 version)\r
31 // Pages 171/172\r
32 // Removed gBS local definition\r
33 //\r
34\r
35 //\r
36 // Disconnect All Handles Example\r
37 // The following example recusively disconnects all drivers from all\r
38 // controllers in a platform.\r
39 //\r
47d20b54
MK
40 EFI_STATUS Status;\r
41 // EFI_BOOT_SERVICES *gBS;\r
42 UINTN HandleCount;\r
43 EFI_HANDLE *HandleBuffer;\r
44 UINTN HandleIndex;\r
45\r
4ba49616 46 //\r
47 // Retrieve the list of all handles from the handle database\r
48 //\r
49 Status = gBS->LocateHandleBuffer (\r
47d20b54
MK
50 AllHandles,\r
51 NULL,\r
52 NULL,\r
53 &HandleCount,\r
54 &HandleBuffer\r
55 );\r
4ba49616 56 if (!EFI_ERROR (Status)) {\r
57 for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
58 Status = gBS->DisconnectController (\r
47d20b54
MK
59 HandleBuffer[HandleIndex],\r
60 NULL,\r
61 NULL\r
62 );\r
4ba49616 63 }\r
47d20b54
MK
64\r
65 gBS->FreePool (HandleBuffer);\r
4ba49616 66 //\r
67 // end of stealing\r
68 //\r
69 }\r
47d20b54 70\r
4ba49616 71 return (EFI_SUCCESS);\r
72}\r
73\r
361a8267 74/**\r
75 Function for 'disconnect' command.\r
76\r
77 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
78 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
79**/\r
4ba49616 80SHELL_STATUS\r
81EFIAPI\r
82ShellCommandRunDisconnect (\r
83 IN EFI_HANDLE ImageHandle,\r
84 IN EFI_SYSTEM_TABLE *SystemTable\r
85 )\r
86{\r
47d20b54
MK
87 EFI_STATUS Status;\r
88 LIST_ENTRY *Package;\r
89 CHAR16 *ProblemParam;\r
90 SHELL_STATUS ShellStatus;\r
91 CONST CHAR16 *Param1;\r
92 CONST CHAR16 *Param2;\r
93 CONST CHAR16 *Param3;\r
94 EFI_HANDLE Handle1;\r
95 EFI_HANDLE Handle2;\r
96 EFI_HANDLE Handle3;\r
97 UINT64 Intermediate1;\r
98 UINT64 Intermediate2;\r
99 UINT64 Intermediate3;\r
100\r
101 ShellStatus = SHELL_SUCCESS;\r
4ba49616 102\r
103 //\r
104 // initialize the shell lib (we must be in non-auto-init...)\r
105 //\r
47d20b54
MK
106 Status = ShellInitialize ();\r
107 ASSERT_EFI_ERROR (Status);\r
4ba49616 108\r
47d20b54
MK
109 Status = CommandInit ();\r
110 ASSERT_EFI_ERROR (Status);\r
4ba49616 111\r
112 //\r
113 // parse the command line\r
114 //\r
115 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
116 if (EFI_ERROR (Status)) {\r
117 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
118 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"disconnect", ProblemParam);\r
119 FreePool (ProblemParam);\r
4ba49616 120 ShellStatus = SHELL_INVALID_PARAMETER;\r
121 } else {\r
47d20b54 122 ASSERT (FALSE);\r
4ba49616 123 }\r
124 } else {\r
47d20b54
MK
125 if (ShellCommandLineGetFlag (Package, L"-r")) {\r
126 if (ShellCommandLineGetCount (Package) > 1) {\r
127 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect");\r
4ba49616 128 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
129 } else if (ShellCommandLineGetCount (Package) < 1) {\r
130 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect");\r
4ba49616 131 ShellStatus = SHELL_INVALID_PARAMETER;\r
132 } else {\r
47d20b54
MK
133 Status = DisconnectAll ();\r
134 //\r
135 // Reconnect all consoles if -nc is not provided\r
136 //\r
137 if (!ShellCommandLineGetFlag (Package, L"-nc")) {\r
138 ShellConnectFromDevPaths (L"ConInDev");\r
139 ShellConnectFromDevPaths (L"ConOutDev");\r
140 ShellConnectFromDevPaths (L"ErrOutDev");\r
141 ShellConnectFromDevPaths (L"ErrOut");\r
142 ShellConnectFromDevPaths (L"ConIn");\r
143 ShellConnectFromDevPaths (L"ConOut");\r
144 }\r
4ba49616 145 }\r
339a2b93 146 } else if (ShellCommandLineGetFlag (Package, L"-nc")) {\r
47d20b54 147 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect");\r
339a2b93 148 ShellStatus = SHELL_INVALID_PARAMETER;\r
4ba49616 149 } else {\r
47d20b54
MK
150 if (ShellCommandLineGetCount (Package) > 4) {\r
151 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect");\r
4ba49616 152 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
153 } else if (ShellCommandLineGetCount (Package) < 2) {\r
154 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect");\r
4ba49616 155 ShellStatus = SHELL_INVALID_PARAMETER;\r
156 } else {\r
157 //\r
158 // must have between 1 and 3 handles passed in ...\r
159 //\r
47d20b54
MK
160 Param1 = ShellCommandLineGetRawValue (Package, 1);\r
161 Param2 = ShellCommandLineGetRawValue (Package, 2);\r
162 Param3 = ShellCommandLineGetRawValue (Package, 3);\r
163 ShellConvertStringToUint64 (Param1, &Intermediate1, TRUE, FALSE);\r
164 Handle1 = Param1 != NULL ? ConvertHandleIndexToHandle ((UINTN)Intermediate1) : NULL;\r
165 ShellConvertStringToUint64 (Param2, &Intermediate2, TRUE, FALSE);\r
166 Handle2 = Param2 != NULL ? ConvertHandleIndexToHandle ((UINTN)Intermediate2) : NULL;\r
167 ShellConvertStringToUint64 (Param3, &Intermediate3, TRUE, FALSE);\r
168 Handle3 = Param3 != NULL ? ConvertHandleIndexToHandle ((UINTN)Intermediate3) : NULL;\r
169\r
170 if ((Param1 != NULL) && (Handle1 == NULL)) {\r
171 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param1);\r
4ba49616 172 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
173 } else if ((Param2 != NULL) && (Handle2 == NULL)) {\r
174 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param2);\r
4ba49616 175 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
176 } else if ((Param3 != NULL) && (Handle3 == NULL)) {\r
177 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param3);\r
4ba49616 178 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
179 } else if ((Handle2 != NULL) && EFI_ERROR (gBS->OpenProtocol (Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
180 ASSERT (Param2 != NULL);\r
181 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, L"disconnect", ShellStrToUintn (Param2), L"driver handle");\r
4ba49616 182 ShellStatus = SHELL_INVALID_PARAMETER;\r
183 } else {\r
47d20b54
MK
184 ASSERT (Param1 != NULL);\r
185 Status = gBS->DisconnectController (Handle1, Handle2, Handle3);\r
186 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_3P_RESULT), gShellDriver1HiiHandle, L"Disconnect", (UINTN)Intermediate1, (UINTN)Intermediate2, (UINTN)Intermediate3, Status);\r
4ba49616 187 }\r
188 }\r
189 }\r
190 }\r
47d20b54 191\r
4ba49616 192 if (ShellStatus == SHELL_SUCCESS) {\r
193 if (Status == EFI_SECURITY_VIOLATION) {\r
194 ShellStatus = SHELL_SECURITY_VIOLATION;\r
195 } else if (Status == EFI_INVALID_PARAMETER) {\r
196 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54 197 } else if (EFI_ERROR (Status)) {\r
4ba49616 198 ShellStatus = SHELL_NOT_FOUND;\r
199 }\r
200 }\r
47d20b54 201\r
4ba49616 202 return (ShellStatus);\r
203}\r