예제 #1
0
VOID
EFIAPI
SEnvBusSpecificDriverOverride (
  IN EFI_HANDLE       h,
  IN VOID             *Interface
  )
/*++

Routine Description:

Arguments:

  h         - An EFI handle
  Interface - The interface

Returns:

--*/
{
  EFI_STATUS                                Status;
  EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;
  EFI_HANDLE                                ImageHandle;
  EFI_LOADED_IMAGE_PROTOCOL                 *Image;

  Print (L"\n");
  BusSpecificDriverOverride = Interface;
  do {
    Status = BusSpecificDriverOverride->GetDriver (
                                          BusSpecificDriverOverride,
                                          &ImageHandle
                                          );
    if (!EFI_ERROR (Status)) {
      Status = BS->HandleProtocol (
                    ImageHandle,
                    &gEfiLoadedImageProtocolGuid,
                    (VOID **) &Image
                    );
      if (!EFI_ERROR (Status)) {
        PrintToken (
          STRING_TOKEN (STR_SHELLENV_DPROT_DRV_FILE),
          HiiEnvHandle,
          SEnvHandleToNumber (ImageHandle),
          LibDevicePathToStr (Image->FilePath)
          );
      }
    }
  } while (!EFI_ERROR (Status));
}
//
// TDS 4.1.1
//
EFI_STATUS
BBTestGetDriverFunctionManualTest (
  IN EFI_BB_TEST_PROTOCOL       *This,
  IN VOID                       *ClientInterface,
  IN EFI_TEST_LEVEL             TestLevel,
  IN EFI_HANDLE                 SupportHandle
  )
{
  EFI_STANDARD_TEST_LIBRARY_PROTOCOL          *StandardLib;
  EFI_STATUS                                  Status;
  EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL   *BusOverride;


  EFI_TEST_ASSERTION                          AssertionType;
  EFI_HANDLE                                  DriverImageHandle;
  EFI_HANDLE                                  DriverImageHandleBack;
  EFI_DEVICE_PATH_PROTOCOL                    *DevicePath;
  CHAR16                                      *DevicePathStr;
  UINTN                                       DriverCount;
  EFI_INPUT_KEY                               Key;

  //
  // Get the Standard Library Interface
  //
  Status = gtBS->HandleProtocol (
                   SupportHandle,
                   &gEfiStandardTestLibraryGuid,
                   &StandardLib
                   );

  if (EFI_ERROR(Status)) {
    StandardLib->RecordAssertion (
                   StandardLib,
                   EFI_TEST_ASSERTION_FAILED,
                   gTestGenericFailureGuid,
                   L"BS.HandleProtocol - Handle standard test library",
                   L"%a:%d:Status - %r",
                   __FILE__,
                   __LINE__,
                   Status
                   );
    return Status;
  }

  BusOverride = (EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *)ClientInterface;

  DriverCount = 0;
  DriverImageHandle = NULL;
  DriverImageHandleBack = NULL;

  //
  // Circularly call GetDriver() with DriverImageHandle
  // being the one retrieved by the last call of GetDriver(),
  // until EFI_NOT_FOUND returned.
  //

  do {
    Status = BusOverride->GetDriver (
                            BusOverride,
                            &DriverImageHandle
                            );
    if (!EFI_ERROR (Status)) {
      AssertionType = EFI_TEST_ASSERTION_PASSED;
      StandardLib->RecordAssertion (
                     StandardLib,
                     AssertionType,
                     gBusSpecificDriverOverrideBBTestFunctionAssertionGuid001,
                     L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Verification of GetDriver interface",
                     L"%a:%d:ImangeHandle:0x%x",
                     __FILE__,
                     __LINE__,
                     DriverImageHandle
                     );
      DriverCount++;

      //
      // Call the second time
      //
      Status = BusOverride->GetDriver (
                            BusOverride,
                            &DriverImageHandleBack
                            );
      if (!EFI_ERROR (Status)) {
        AssertionType = EFI_TEST_ASSERTION_PASSED;
      } else {
        AssertionType = EFI_TEST_ASSERTION_FAILED;
      }
      StandardLib->RecordAssertion (
                     StandardLib,
                     AssertionType,
                     gBusSpecificDriverOverrideBBTestFunctionAssertionGuid002,
                     L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Verification of GetDriver interface, the second times",
                     L"%a:%d:ImangeHandle:0x%x",
                     __FILE__,
                     __LINE__,
                     DriverImageHandleBack
                     );

      //
      // The handle returned two times should be the same
      //
      if (DriverImageHandle == DriverImageHandleBack) {
        AssertionType = EFI_TEST_ASSERTION_PASSED;
      } else {
        AssertionType = EFI_TEST_ASSERTION_FAILED;
      }
      StandardLib->RecordAssertion (
                     StandardLib,
                     AssertionType,
                     gBusSpecificDriverOverrideBBTestFunctionAssertionGuid003,
                     L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Call the same image handle twice, the returned handle should be same",
                     L"%a:%d:ImageHandle 1st : 0x%x, ImageHandle 2nd : 0x%x",
                     __FILE__,
                     __LINE__,
                     DriverImageHandle,
                     DriverImageHandleBack
                     );
    }
  } while (!EFI_ERROR (Status));

  if (Status == EFI_NOT_FOUND) {
    AssertionType = EFI_TEST_ASSERTION_PASSED;
  } else {
    AssertionType = EFI_TEST_ASSERTION_FAILED;
  }
  StandardLib->RecordAssertion (
                 StandardLib,
                 AssertionType,
                 gBusSpecificDriverOverrideBBTestConformanceAssertionGuid001,
                 L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Verification of GetDriver interface, last times",
                 L"%a:%d:Status = %r, Expected = %r",
                 __FILE__,
                 __LINE__,
                 Status,
                 EFI_NOT_FOUND
                 );


  //
  // Output device path
  //
  Status = LocateDevicePathFromBusOverride (BusOverride,&DevicePath,StandardLib);
  if (EFI_ERROR(Status)) {
    return EFI_DEVICE_ERROR;
  }

  DevicePathStr = DevicePathToStr (DevicePath);
  if (DevicePathStr != NULL) {
    Print (L"\r\nCurrent Device: %s",  DevicePathStr);
    gtBS->FreePool (DevicePathStr);

    DevicePathStr=NULL;

    Print (L"\r\nTotal %d EFI driver was found!", DriverCount);
    //
    // Ask, is it correct?
    //
    gtST->ConIn->ReadKeyStroke (gtST->ConIn, &Key);
    Print (L"Is it correct (Y/N)?");

    do {
      Status = gtST->ConIn->ReadKeyStroke (gtST->ConIn, &Key);
    } while (EFI_ERROR(Status));

    Print (L"%c\n", Key.UnicodeChar);

    AssertionType = EFI_TEST_ASSERTION_FAILED;
    if ((Key.UnicodeChar == 'Y') || (Key.UnicodeChar == 'y')) {
      AssertionType = EFI_TEST_ASSERTION_PASSED;
    }

    StandardLib->RecordAssertion (
                   StandardLib,
                   AssertionType,
                   gBusSpecificDriverOverrideBBTestFunctionAssertionGuid004,
                   L"EFI_BUS_SPECIFIC_DRIVER_OVERRIDE.GetDriver - Verification of GetDriver interface, user's view",
                   L"%a:%d",
                   __FILE__,
                   __LINE__
                   );

  }

  return EFI_SUCCESS;
}