mirror of https://github.com/acidanthera/audk.git
Remove BdsLibConnectConsoleVariableWithoutDispatch() and enhance BdsLibConnectDevicePath() to only call gDS->Dispatch() when the current TPL is TPL_APPLICATION
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Chao B Zhang <chao.b.zhang@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14211 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
9fc9446897
commit
37406c34c3
|
@ -4,7 +4,7 @@
|
||||||
2) BDS boot device connect interface.
|
2) BDS boot device connect interface.
|
||||||
3) BDS Misc interfaces for mainting boot variable, ouput string.
|
3) BDS Misc interfaces for mainting boot variable, ouput string.
|
||||||
|
|
||||||
Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials are licensed and made available under
|
This program and the accompanying materials are licensed and made available under
|
||||||
the terms and conditions of the BSD License that accompanies this distribution.
|
the terms and conditions of the BSD License that accompanies this distribution.
|
||||||
The full text of the license may be found at
|
The full text of the license may be found at
|
||||||
|
@ -531,30 +531,6 @@ BdsLibConnectConsoleVariable (
|
||||||
IN CHAR16 *ConVarName
|
IN CHAR16 *ConVarName
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
Connect the console device base on the variable ConVarName, if
|
|
||||||
device path of the ConVarName is multi-instance device path and
|
|
||||||
anyone of the instances is connected success, then this function
|
|
||||||
will return success.
|
|
||||||
Dispatch service is not called when the handle associate with one
|
|
||||||
device path node can not be created successfully. Here no driver
|
|
||||||
dependency is assumed exist, so need not to call this service.
|
|
||||||
|
|
||||||
@param ConVarName Console related variable name, ConIn, ConOut,
|
|
||||||
ErrOut.
|
|
||||||
|
|
||||||
@retval EFI_NOT_FOUND There is not any console devices connected
|
|
||||||
success
|
|
||||||
@retval EFI_SUCCESS Success connect any one instance of the console
|
|
||||||
device path base on the variable ConVarName.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
BdsLibConnectConsoleVariableWithOutDispatch (
|
|
||||||
IN CHAR16 *ConVarName
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Bds device path related lib functions
|
// Bds device path related lib functions
|
||||||
//
|
//
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
BDS Lib functions which relate with connect the device
|
BDS Lib functions which relate with connect the device
|
||||||
|
|
||||||
Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -65,17 +65,14 @@ BdsLibGenericConnectAll (
|
||||||
BdsLibConnectAllConsoles ();
|
BdsLibConnectAllConsoles ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function will create all handles associate with every device
|
This function will create all handles associate with every device
|
||||||
path node. If the handle associate with one device path node can not
|
path node. If the handle associate with one device path node can not
|
||||||
be created successfully, Dispatch service which load the missing drivers
|
be created successfully, then still give chance to do the dispatch,
|
||||||
is called according to input parameter, since in some cases no driver
|
which load the missing drivers if possible.
|
||||||
dependency is assumed exist, so may need not to call this service.
|
|
||||||
|
|
||||||
@param DevicePathToConnect The device path which will be connected, it can be
|
@param DevicePathToConnect The device path which will be connected, it can be
|
||||||
a multi-instance device path
|
a multi-instance device path
|
||||||
@param NeedDispatch Whether requires dispatch service during connection
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS All handles associate with every device path node
|
@retval EFI_SUCCESS All handles associate with every device path node
|
||||||
have been created
|
have been created
|
||||||
|
@ -85,9 +82,9 @@ BdsLibGenericConnectAll (
|
||||||
|
|
||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ConnectDevicePathInternal (
|
EFIAPI
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect,
|
BdsLibConnectDevicePath (
|
||||||
IN BOOLEAN NeedDispatch
|
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
@ -99,11 +96,14 @@ ConnectDevicePathInternal (
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
EFI_HANDLE PreviousHandle;
|
EFI_HANDLE PreviousHandle;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
|
EFI_TPL CurrentTpl;
|
||||||
|
|
||||||
if (DevicePathToConnect == NULL) {
|
if (DevicePathToConnect == NULL) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CurrentTpl = EfiGetCurrentTpl ();
|
||||||
|
|
||||||
DevicePath = DuplicateDevicePath (DevicePathToConnect);
|
DevicePath = DuplicateDevicePath (DevicePathToConnect);
|
||||||
if (DevicePath == NULL) {
|
if (DevicePath == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
@ -152,7 +152,10 @@ ConnectDevicePathInternal (
|
||||||
// Status == EFI_SUCCESS means a driver was dispatched
|
// Status == EFI_SUCCESS means a driver was dispatched
|
||||||
// Status == EFI_NOT_FOUND means no new drivers were dispatched
|
// Status == EFI_NOT_FOUND means no new drivers were dispatched
|
||||||
//
|
//
|
||||||
if (NeedDispatch) {
|
if (CurrentTpl == TPL_APPLICATION) {
|
||||||
|
//
|
||||||
|
// Dispatch calls LoadImage/StartImage which cannot run at TPL > TPL_APPLICATION
|
||||||
|
//
|
||||||
Status = gDS->Dispatch ();
|
Status = gDS->Dispatch ();
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
|
@ -199,32 +202,6 @@ ConnectDevicePathInternal (
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
This function will create all handles associate with every device
|
|
||||||
path node. If the handle associate with one device path node can not
|
|
||||||
be created successfully, then still give chance to do the dispatch,
|
|
||||||
which load the missing drivers if possible.
|
|
||||||
|
|
||||||
@param DevicePathToConnect The device path which will be connected, it can be
|
|
||||||
a multi-instance device path
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS All handles associate with every device path node
|
|
||||||
have been created
|
|
||||||
@retval EFI_OUT_OF_RESOURCES There is no resource to create new handles
|
|
||||||
@retval EFI_NOT_FOUND Create the handle associate with one device path
|
|
||||||
node failed
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
BdsLibConnectDevicePath (
|
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return ConnectDevicePathInternal(DevicePathToConnect, TRUE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function will connect all current system handles recursively.
|
This function will connect all current system handles recursively.
|
||||||
|
|
||||||
|
|
|
@ -181,114 +181,6 @@ UpdateSystemTableConsole (
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
Connect the console device base on the variable ConVarName, if
|
|
||||||
device path of the ConVarName is multi-instance device path and
|
|
||||||
anyone of the instances is connected success, this function will
|
|
||||||
return success.
|
|
||||||
Dispatch service is called basing on input when the handle associate
|
|
||||||
with one device path node can not be created successfully. Since in
|
|
||||||
some cases we assume driver dependency does not exist and do not
|
|
||||||
need to call this service.
|
|
||||||
|
|
||||||
@param ConVarName Console related variable name, ConIn, ConOut,
|
|
||||||
ErrOut.
|
|
||||||
@param NeedDispatch Whether requires dispatch service during connection
|
|
||||||
|
|
||||||
@retval EFI_NOT_FOUND There is not any console devices connected
|
|
||||||
success
|
|
||||||
@retval EFI_SUCCESS Success connect any one instance of the console
|
|
||||||
device path base on the variable ConVarName.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
ConnectConsoleVariableInternal (
|
|
||||||
IN CHAR16 *ConVarName,
|
|
||||||
IN BOOLEAN NeedDispatch
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
EFI_DEVICE_PATH_PROTOCOL *StartDevicePath;
|
|
||||||
UINTN VariableSize;
|
|
||||||
EFI_DEVICE_PATH_PROTOCOL *Instance;
|
|
||||||
EFI_DEVICE_PATH_PROTOCOL *Next;
|
|
||||||
EFI_DEVICE_PATH_PROTOCOL *CopyOfDevicePath;
|
|
||||||
UINTN Size;
|
|
||||||
BOOLEAN DeviceExist;
|
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
DeviceExist = FALSE;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Check if the console variable exist
|
|
||||||
//
|
|
||||||
StartDevicePath = BdsLibGetVariableAndSize (
|
|
||||||
ConVarName,
|
|
||||||
&gEfiGlobalVariableGuid,
|
|
||||||
&VariableSize
|
|
||||||
);
|
|
||||||
if (StartDevicePath == NULL) {
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
CopyOfDevicePath = StartDevicePath;
|
|
||||||
do {
|
|
||||||
//
|
|
||||||
// Check every instance of the console variable
|
|
||||||
//
|
|
||||||
Instance = GetNextDevicePathInstance (&CopyOfDevicePath, &Size);
|
|
||||||
if (Instance == NULL) {
|
|
||||||
FreePool (StartDevicePath);
|
|
||||||
return EFI_UNSUPPORTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
Next = Instance;
|
|
||||||
while (!IsDevicePathEndType (Next)) {
|
|
||||||
Next = NextDevicePathNode (Next);
|
|
||||||
}
|
|
||||||
|
|
||||||
SetDevicePathEndNode (Next);
|
|
||||||
//
|
|
||||||
// Connect the USB console
|
|
||||||
// USB console device path is a short-form device path that
|
|
||||||
// starts with the first element being a USB WWID
|
|
||||||
// or a USB Class device path
|
|
||||||
//
|
|
||||||
if ((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) &&
|
|
||||||
((DevicePathSubType (Instance) == MSG_USB_CLASS_DP)
|
|
||||||
|| (DevicePathSubType (Instance) == MSG_USB_WWID_DP)
|
|
||||||
)) {
|
|
||||||
Status = BdsLibConnectUsbDevByShortFormDP (0xFF, Instance);
|
|
||||||
if (!EFI_ERROR (Status)) {
|
|
||||||
DeviceExist = TRUE;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//
|
|
||||||
// Connect the instance device path
|
|
||||||
//
|
|
||||||
Status = ConnectDevicePathInternal (Instance, NeedDispatch);
|
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
//
|
|
||||||
// Delete the instance from the console varialbe
|
|
||||||
//
|
|
||||||
BdsLibUpdateConsoleVariable (ConVarName, NULL, Instance);
|
|
||||||
} else {
|
|
||||||
DeviceExist = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
FreePool(Instance);
|
|
||||||
} while (CopyOfDevicePath != NULL);
|
|
||||||
|
|
||||||
FreePool (StartDevicePath);
|
|
||||||
|
|
||||||
if (!DeviceExist) {
|
|
||||||
return EFI_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function update console variable based on ConVarName, it can
|
This function update console variable based on ConVarName, it can
|
||||||
add or remove one specific console device path from the variable
|
add or remove one specific console device path from the variable
|
||||||
|
@ -447,35 +339,86 @@ BdsLibConnectConsoleVariable (
|
||||||
IN CHAR16 *ConVarName
|
IN CHAR16 *ConVarName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return ConnectConsoleVariableInternal(ConVarName, TRUE);
|
EFI_STATUS Status;
|
||||||
}
|
EFI_DEVICE_PATH_PROTOCOL *StartDevicePath;
|
||||||
|
UINTN VariableSize;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *Instance;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *Next;
|
||||||
|
EFI_DEVICE_PATH_PROTOCOL *CopyOfDevicePath;
|
||||||
|
UINTN Size;
|
||||||
|
BOOLEAN DeviceExist;
|
||||||
|
|
||||||
/**
|
Status = EFI_SUCCESS;
|
||||||
Connect the console device base on the variable ConVarName, if
|
DeviceExist = FALSE;
|
||||||
device path of the ConVarName is multi-instance device path and
|
|
||||||
anyone of the instances is connected success, then this function
|
|
||||||
will return success.
|
|
||||||
Dispatch service is not called when the handle associate with one
|
|
||||||
device path node can not be created successfully. Here no driver
|
|
||||||
dependency is assumed exist, so need not to call this service.
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check if the console variable exist
|
||||||
|
//
|
||||||
|
StartDevicePath = BdsLibGetVariableAndSize (
|
||||||
|
ConVarName,
|
||||||
|
&gEfiGlobalVariableGuid,
|
||||||
|
&VariableSize
|
||||||
|
);
|
||||||
|
if (StartDevicePath == NULL) {
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
@param ConVarName Console related variable name, ConIn, ConOut,
|
CopyOfDevicePath = StartDevicePath;
|
||||||
ErrOut.
|
do {
|
||||||
|
//
|
||||||
|
// Check every instance of the console variable
|
||||||
|
//
|
||||||
|
Instance = GetNextDevicePathInstance (&CopyOfDevicePath, &Size);
|
||||||
|
if (Instance == NULL) {
|
||||||
|
FreePool (StartDevicePath);
|
||||||
|
return EFI_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
|
||||||
@retval EFI_NOT_FOUND There is not any console devices connected
|
Next = Instance;
|
||||||
success
|
while (!IsDevicePathEndType (Next)) {
|
||||||
@retval EFI_SUCCESS Success connect any one instance of the console
|
Next = NextDevicePathNode (Next);
|
||||||
device path base on the variable ConVarName.
|
}
|
||||||
|
|
||||||
**/
|
SetDevicePathEndNode (Next);
|
||||||
EFI_STATUS
|
//
|
||||||
EFIAPI
|
// Connect the USB console
|
||||||
BdsLibConnectConsoleVariableWithOutDispatch (
|
// USB console device path is a short-form device path that
|
||||||
IN CHAR16 *ConVarName
|
// starts with the first element being a USB WWID
|
||||||
)
|
// or a USB Class device path
|
||||||
{
|
//
|
||||||
return ConnectConsoleVariableInternal(ConVarName, FALSE);
|
if ((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) &&
|
||||||
|
((DevicePathSubType (Instance) == MSG_USB_CLASS_DP)
|
||||||
|
|| (DevicePathSubType (Instance) == MSG_USB_WWID_DP)
|
||||||
|
)) {
|
||||||
|
Status = BdsLibConnectUsbDevByShortFormDP (0xFF, Instance);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
DeviceExist = TRUE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// Connect the instance device path
|
||||||
|
//
|
||||||
|
Status = BdsLibConnectDevicePath (Instance);
|
||||||
|
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
//
|
||||||
|
// Delete the instance from the console varialbe
|
||||||
|
//
|
||||||
|
BdsLibUpdateConsoleVariable (ConVarName, NULL, Instance);
|
||||||
|
} else {
|
||||||
|
DeviceExist = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FreePool(Instance);
|
||||||
|
} while (CopyOfDevicePath != NULL);
|
||||||
|
|
||||||
|
FreePool (StartDevicePath);
|
||||||
|
|
||||||
|
if (!DeviceExist) {
|
||||||
|
return EFI_NOT_FOUND;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/** @file
|
/** @file
|
||||||
BDS library definition, include the file and data structure
|
BDS library definition, include the file and data structure
|
||||||
|
|
||||||
Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
are licensed and made available under the terms and conditions of the BSD License
|
||||||
which accompanies this distribution. The full text of the license may be found at
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -158,28 +158,4 @@ ValidateOption (
|
||||||
UINTN VariableSize
|
UINTN VariableSize
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
This function will create all handles associate with every device
|
|
||||||
path node. If the handle associate with one device path node can not
|
|
||||||
be created successfully, Dispatch service which load the missing drivers
|
|
||||||
is called basing on input parameter, since in some cases no driver
|
|
||||||
dependency is assumed exist, so may need not to call this service.
|
|
||||||
|
|
||||||
@param DevicePathToConnect The device path which will be connected, it can be
|
|
||||||
a multi-instance device path
|
|
||||||
@param NeedDispatch Whether requires dispatch service during connection
|
|
||||||
|
|
||||||
@retval EFI_SUCCESS All handles associate with every device path node
|
|
||||||
have been created
|
|
||||||
@retval EFI_OUT_OF_RESOURCES There is no resource to create new handles
|
|
||||||
@retval EFI_NOT_FOUND Create the handle associate with one device path
|
|
||||||
node failed
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
ConnectDevicePathInternal (
|
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect,
|
|
||||||
IN BOOLEAN NeedDispatch
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif // _BDS_LIB_H_
|
#endif // _BDS_LIB_H_
|
||||||
|
|
Loading…
Reference in New Issue