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
;
46 // Retrieve the list of all handles from the handle database
48 Status
= gBS
->LocateHandleBuffer (
55 if (!EFI_ERROR (Status
)) {
56 for (HandleIndex
= 0; HandleIndex
< HandleCount
; HandleIndex
++) {
57 Status
= gBS
->DisconnectController (
58 HandleBuffer
[HandleIndex
],
63 gBS
->FreePool(HandleBuffer
);
72 Function for 'disconnect' command.
74 @param[in] ImageHandle Handle to the Image (NULL if Internal).
75 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
79 ShellCommandRunDisconnect (
80 IN EFI_HANDLE ImageHandle
,
81 IN EFI_SYSTEM_TABLE
*SystemTable
87 SHELL_STATUS ShellStatus
;
98 ShellStatus
= SHELL_SUCCESS
;
101 // initialize the shell lib (we must be in non-auto-init...)
103 Status
= ShellInitialize();
104 ASSERT_EFI_ERROR(Status
);
106 Status
= CommandInit();
107 ASSERT_EFI_ERROR(Status
);
110 // parse the command line
112 Status
= ShellCommandLineParse (ParamList
, &Package
, &ProblemParam
, TRUE
);
113 if (EFI_ERROR(Status
)) {
114 if (Status
== EFI_VOLUME_CORRUPTED
&& ProblemParam
!= NULL
) {
115 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_PROBLEM
), gShellDriver1HiiHandle
, L
"disconnect", ProblemParam
);
116 FreePool(ProblemParam
);
117 ShellStatus
= SHELL_INVALID_PARAMETER
;
122 if (ShellCommandLineGetFlag(Package
, L
"-r")){
123 if (ShellCommandLineGetCount(Package
) > 1){
124 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"disconnect");
125 ShellStatus
= SHELL_INVALID_PARAMETER
;
126 } else if (ShellCommandLineGetCount(Package
) < 1) {
127 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDriver1HiiHandle
, L
"disconnect");
128 ShellStatus
= SHELL_INVALID_PARAMETER
;
130 Status
= DisconnectAll ();
132 // Reconnect all consoles if -nc is not provided
134 if (!ShellCommandLineGetFlag (Package
, L
"-nc")){
135 ShellConnectFromDevPaths (L
"ConInDev");
136 ShellConnectFromDevPaths (L
"ConOutDev");
137 ShellConnectFromDevPaths (L
"ErrOutDev");
138 ShellConnectFromDevPaths (L
"ErrOut");
139 ShellConnectFromDevPaths (L
"ConIn");
140 ShellConnectFromDevPaths (L
"ConOut");
143 } else if (ShellCommandLineGetFlag (Package
, L
"-nc")) {
144 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDriver1HiiHandle
, L
"disconnect");
145 ShellStatus
= SHELL_INVALID_PARAMETER
;
147 if (ShellCommandLineGetCount(Package
) > 4){
148 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_MANY
), gShellDriver1HiiHandle
, L
"disconnect");
149 ShellStatus
= SHELL_INVALID_PARAMETER
;
150 } else if (ShellCommandLineGetCount(Package
) < 2) {
151 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_TOO_FEW
), gShellDriver1HiiHandle
, L
"disconnect");
152 ShellStatus
= SHELL_INVALID_PARAMETER
;
155 // must have between 1 and 3 handles passed in ...
157 Param1
= ShellCommandLineGetRawValue(Package
, 1);
158 Param2
= ShellCommandLineGetRawValue(Package
, 2);
159 Param3
= ShellCommandLineGetRawValue(Package
, 3);
160 ShellConvertStringToUint64(Param1
, &Intermediate1
, TRUE
, FALSE
);
161 Handle1
= Param1
!=NULL
?ConvertHandleIndexToHandle((UINTN
)Intermediate1
):NULL
;
162 ShellConvertStringToUint64(Param2
, &Intermediate2
, TRUE
, FALSE
);
163 Handle2
= Param2
!=NULL
?ConvertHandleIndexToHandle((UINTN
)Intermediate2
):NULL
;
164 ShellConvertStringToUint64(Param3
, &Intermediate3
, TRUE
, FALSE
);
165 Handle3
= Param3
!=NULL
?ConvertHandleIndexToHandle((UINTN
)Intermediate3
):NULL
;
167 if (Param1
!= NULL
&& Handle1
== NULL
) {
168 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"disconnect", Param1
);
169 ShellStatus
= SHELL_INVALID_PARAMETER
;
170 } else if (Param2
!= NULL
&& Handle2
== NULL
) {
171 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"disconnect", Param2
);
172 ShellStatus
= SHELL_INVALID_PARAMETER
;
173 } else if (Param3
!= NULL
&& Handle3
== NULL
) {
174 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_INV_HANDLE
), gShellDriver1HiiHandle
, L
"disconnect", Param3
);
175 ShellStatus
= SHELL_INVALID_PARAMETER
;
176 } else if (Handle2
!= NULL
&& EFI_ERROR(gBS
->OpenProtocol(Handle2
, &gEfiDriverBindingProtocolGuid
, NULL
, gImageHandle
, NULL
, EFI_OPEN_PROTOCOL_TEST_PROTOCOL
))) {
177 ASSERT(Param2
!= NULL
);
178 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_GEN_HANDLE_NOT
), gShellDriver1HiiHandle
, L
"disconnect", ShellStrToUintn(Param2
), L
"driver handle");
179 ShellStatus
= SHELL_INVALID_PARAMETER
;
181 ASSERT(Param1
!= NULL
);
182 Status
= gBS
->DisconnectController(Handle1
, Handle2
, Handle3
);
183 ShellPrintHiiEx(-1, -1, NULL
, STRING_TOKEN (STR_3P_RESULT
), gShellDriver1HiiHandle
, L
"Disconnect", (UINTN
)Intermediate1
, (UINTN
)Intermediate2
, (UINTN
)Intermediate3
, Status
);
188 if (ShellStatus
== SHELL_SUCCESS
) {
189 if (Status
== EFI_SECURITY_VIOLATION
) {
190 ShellStatus
= SHELL_SECURITY_VIOLATION
;
191 } else if (Status
== EFI_INVALID_PARAMETER
) {
192 ShellStatus
= SHELL_INVALID_PARAMETER
;
193 } else if (EFI_ERROR(Status
)) {
194 ShellStatus
= SHELL_NOT_FOUND
;
197 return (ShellStatus
);