]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Disconnect.c
ShellPkg: acpiview: Add GT Frame Number validation to GTDT parser
[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
13STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
14 {L"-r", TypeFlag},\r
339a2b93 15 {L"-nc", TypeFlag},\r
4ba49616 16 {NULL, TypeMax}\r
17 };\r
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
4ba49616 25DisconnectAll(\r
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
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
46 // Retrieve the list of all handles from the handle database\r
47 //\r
48 Status = gBS->LocateHandleBuffer (\r
49 AllHandles,\r
50 NULL,\r
51 NULL,\r
52 &HandleCount,\r
53 &HandleBuffer\r
54 );\r
55 if (!EFI_ERROR (Status)) {\r
56 for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
57 Status = gBS->DisconnectController (\r
58 HandleBuffer[HandleIndex],\r
59 NULL,\r
60 NULL\r
61 );\r
62 }\r
63 gBS->FreePool(HandleBuffer);\r
64 //\r
65 // end of stealing\r
66 //\r
67 }\r
68 return (EFI_SUCCESS);\r
69}\r
70\r
361a8267 71/**\r
72 Function for 'disconnect' command.\r
73\r
74 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
75 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
76**/\r
4ba49616 77SHELL_STATUS\r
78EFIAPI\r
79ShellCommandRunDisconnect (\r
80 IN EFI_HANDLE ImageHandle,\r
81 IN EFI_SYSTEM_TABLE *SystemTable\r
82 )\r
83{\r
84 EFI_STATUS Status;\r
85 LIST_ENTRY *Package;\r
86 CHAR16 *ProblemParam;\r
87 SHELL_STATUS ShellStatus;\r
88 CONST CHAR16 *Param1;\r
89 CONST CHAR16 *Param2;\r
90 CONST CHAR16 *Param3;\r
91 EFI_HANDLE Handle1;\r
92 EFI_HANDLE Handle2;\r
93 EFI_HANDLE Handle3;\r
361a8267 94 UINT64 Intermediate1;\r
95 UINT64 Intermediate2;\r
96 UINT64 Intermediate3;\r
4ba49616 97\r
98 ShellStatus = SHELL_SUCCESS;\r
99\r
100 //\r
101 // initialize the shell lib (we must be in non-auto-init...)\r
102 //\r
103 Status = ShellInitialize();\r
104 ASSERT_EFI_ERROR(Status);\r
105\r
106 Status = CommandInit();\r
107 ASSERT_EFI_ERROR(Status);\r
108\r
109 //\r
110 // parse the command line\r
111 //\r
112 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
113 if (EFI_ERROR(Status)) {\r
114 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
ba0014b9 115 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"disconnect", ProblemParam);\r
4ba49616 116 FreePool(ProblemParam);\r
117 ShellStatus = SHELL_INVALID_PARAMETER;\r
118 } else {\r
119 ASSERT(FALSE);\r
120 }\r
121 } else {\r
122 if (ShellCommandLineGetFlag(Package, L"-r")){\r
123 if (ShellCommandLineGetCount(Package) > 1){\r
ba0014b9 124 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect");\r
4ba49616 125 ShellStatus = SHELL_INVALID_PARAMETER;\r
126 } else if (ShellCommandLineGetCount(Package) < 1) {\r
ba0014b9 127 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect");\r
4ba49616 128 ShellStatus = SHELL_INVALID_PARAMETER;\r
129 } else {\r
339a2b93
TS
130 Status = DisconnectAll ();\r
131 //\r
132 // Reconnect all consoles if -nc is not provided\r
133 //\r
134 if (!ShellCommandLineGetFlag (Package, L"-nc")){\r
135 ShellConnectFromDevPaths (L"ConInDev");\r
136 ShellConnectFromDevPaths (L"ConOutDev");\r
137 ShellConnectFromDevPaths (L"ErrOutDev");\r
138 ShellConnectFromDevPaths (L"ErrOut");\r
139 ShellConnectFromDevPaths (L"ConIn");\r
140 ShellConnectFromDevPaths (L"ConOut");\r
141 }\r
4ba49616 142 }\r
339a2b93
TS
143 } else if (ShellCommandLineGetFlag (Package, L"-nc")) {\r
144 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect");\r
145 ShellStatus = SHELL_INVALID_PARAMETER;\r
4ba49616 146 } else {\r
147 if (ShellCommandLineGetCount(Package) > 4){\r
ba0014b9 148 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"disconnect");\r
4ba49616 149 ShellStatus = SHELL_INVALID_PARAMETER;\r
150 } else if (ShellCommandLineGetCount(Package) < 2) {\r
ba0014b9 151 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_FEW), gShellDriver1HiiHandle, L"disconnect");\r
4ba49616 152 ShellStatus = SHELL_INVALID_PARAMETER;\r
153 } else {\r
154 //\r
155 // must have between 1 and 3 handles passed in ...\r
156 //\r
157 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
158 Param2 = ShellCommandLineGetRawValue(Package, 2);\r
159 Param3 = ShellCommandLineGetRawValue(Package, 3);\r
361a8267 160 ShellConvertStringToUint64(Param1, &Intermediate1, TRUE, FALSE);\r
161 Handle1 = Param1!=NULL?ConvertHandleIndexToHandle((UINTN)Intermediate1):NULL;\r
162 ShellConvertStringToUint64(Param2, &Intermediate2, TRUE, FALSE);\r
163 Handle2 = Param2!=NULL?ConvertHandleIndexToHandle((UINTN)Intermediate2):NULL;\r
164 ShellConvertStringToUint64(Param3, &Intermediate3, TRUE, FALSE);\r
165 Handle3 = Param3!=NULL?ConvertHandleIndexToHandle((UINTN)Intermediate3):NULL;\r
4ba49616 166\r
167 if (Param1 != NULL && Handle1 == NULL) {\r
ba0014b9 168 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param1);\r
4ba49616 169 ShellStatus = SHELL_INVALID_PARAMETER;\r
170 } else if (Param2 != NULL && Handle2 == NULL) {\r
ba0014b9 171 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param2);\r
4ba49616 172 ShellStatus = SHELL_INVALID_PARAMETER;\r
173 } else if (Param3 != NULL && Handle3 == NULL) {\r
ba0014b9 174 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"disconnect", Param3);\r
4ba49616 175 ShellStatus = SHELL_INVALID_PARAMETER;\r
4ba49616 176 } else if (Handle2 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
177 ASSERT(Param2 != NULL);\r
ba0014b9 178 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, L"disconnect", ShellStrToUintn(Param2), L"driver handle");\r
4ba49616 179 ShellStatus = SHELL_INVALID_PARAMETER;\r
180 } else {\r
181 ASSERT(Param1 != NULL);\r
4ba49616 182 Status = gBS->DisconnectController(Handle1, Handle2, Handle3);\r
6878e7a7 183 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_3P_RESULT), gShellDriver1HiiHandle, L"Disconnect", (UINTN)Intermediate1, (UINTN)Intermediate2, (UINTN)Intermediate3, Status);\r
4ba49616 184 }\r
185 }\r
186 }\r
187 }\r
188 if (ShellStatus == SHELL_SUCCESS) {\r
189 if (Status == EFI_SECURITY_VIOLATION) {\r
190 ShellStatus = SHELL_SECURITY_VIOLATION;\r
191 } else if (Status == EFI_INVALID_PARAMETER) {\r
192 ShellStatus = SHELL_INVALID_PARAMETER;\r
193 } else if (EFI_ERROR(Status)) {\r
194 ShellStatus = SHELL_NOT_FOUND;\r
195 }\r
196 }\r
197 return (ShellStatus);\r
198}\r