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