2 Main file for Disconnect shell Driver1 function.
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
11 #include "UefiShellDriver1CommandsLib.h"
13 STATIC CONST SHELL_PARAM_ITEM ParamList
[] = {
20 Disconnect everything.
22 @retval EFI_SUCCESS The operation was successful.
30 // Stolen from UEFI 2.3 spec (May 2009 version)
32 // Removed gBS local definition
36 // Disconnect All Handles Example
37 // The following example recusively disconnects all drivers from all
38 // controllers in a platform.
41 // EFI_BOOT_SERVICES *gBS;
43 EFI_HANDLE
*HandleBuffer
;
47 // Retrieve the list of all handles from the handle database
49 Status
= gBS
->LocateHandleBuffer (
56 if (!EFI_ERROR (Status
)) {
57 for (HandleIndex
= 0; HandleIndex
< HandleCount
; HandleIndex
++) {
58 Status
= gBS
->DisconnectController (
59 HandleBuffer
[HandleIndex
],
65 gBS
->FreePool (HandleBuffer
);
75 Function for 'disconnect' command.
77 @param[in] ImageHandle Handle to the Image (NULL if Internal).
78 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
82 ShellCommandRunDisconnect (
83 IN EFI_HANDLE ImageHandle
,
84 IN EFI_SYSTEM_TABLE
*SystemTable
90 SHELL_STATUS ShellStatus
;
101 ShellStatus
= SHELL_SUCCESS
;
104 // initialize the shell lib (we must be in non-auto-init...)
106 Status
= ShellInitialize ();
107 ASSERT_EFI_ERROR (Status
);
109 Status
= CommandInit ();
110 ASSERT_EFI_ERROR (Status
);
113 // parse the command line
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
;
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
;
133 Status
= DisconnectAll ();
135 // Reconnect all consoles if -nc is not provided
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");
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
;
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
;
158 // must have between 1 and 3 handles passed in ...
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
;
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
;
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
);
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
;
202 return (ShellStatus
);