]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiShellLevel2CommandsLib/Map.c
ShellPkg/map: Recognize CDROM change
[mirror_edk2.git] / ShellPkg / Library / UefiShellLevel2CommandsLib / Map.c
index 035aff1a0fa78f17cb8aefcd886f95b3c5945973..3f5925f507b7df330a61b6405e7a9565a6300c7d 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Main file for map shell level 2 command.\r
 \r
-  Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.<BR>\r
   (C) Copyright 2013-2015 Hewlett-Packard Development Company, L.P.<BR>\r
   (C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
   \r
@@ -34,7 +34,6 @@
   @retval FALSE           String has at least one other character.\r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 IsNumberLetterOnly(\r
   IN CONST CHAR16 *String,\r
   IN CONST UINTN  Len\r
@@ -65,7 +64,6 @@ IsNumberLetterOnly(
                           items (";" normally). \r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 SearchList(\r
   IN CONST CHAR16   *List,\r
   IN CONST CHAR16   *MetaTarget,\r
@@ -133,7 +131,6 @@ SearchList(
   @retval STR_MAP_MEDIA_FLOPPY    The media is a floppy drive.\r
 **/\r
 CHAR16*\r
-EFIAPI\r
 GetDeviceMediaType (\r
   IN  EFI_DEVICE_PATH_PROTOCOL     *DevicePath\r
   )\r
@@ -179,7 +176,6 @@ GetDeviceMediaType (
   @retval FALSE                     The handle does not have removable storage.\r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 IsRemoveableDevice (\r
   IN EFI_DEVICE_PATH_PROTOCOL      *DevicePath\r
   )\r
@@ -216,7 +212,6 @@ IsRemoveableDevice (
   @retval FALSE               The map should not be displayed.\r
 **/\r
 BOOLEAN\r
-EFIAPI\r
 MappingListHasType(\r
   IN CONST CHAR16     *MapList,\r
   IN CONST CHAR16     *Specific,\r
@@ -287,7 +282,6 @@ MappingListHasType(
   @retval EFI_SUCCESS               The mapping was displayed.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 PerformSingleMappingDisplay(\r
   IN CONST BOOLEAN    Verbose,\r
   IN CONST BOOLEAN    Consist,\r
@@ -461,7 +455,6 @@ PerformSingleMappingDisplay(
   @retval EFI_NOT_FOUND   Name was not a map on Handle.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 PerformSingleMappingDelete(\r
   IN CONST CHAR16     *Specific,\r
   IN CONST EFI_HANDLE Handle\r
@@ -512,7 +505,6 @@ CONST CHAR16 AnyF[] = L"F*";
 \r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 PerformMappingDisplay(\r
   IN CONST BOOLEAN Verbose,\r
   IN CONST BOOLEAN Consist,\r
@@ -690,7 +682,6 @@ PerformMappingDisplay(
   @sa PerformMappingDisplay\r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 PerformMappingDisplay2(\r
   IN CONST BOOLEAN Verbose,\r
   IN CONST BOOLEAN Consist,\r
@@ -743,7 +734,6 @@ PerformMappingDisplay2(
   @retval EFI_NOT_FOUND             Specific could not be found.\r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 PerformMappingDelete(\r
   IN CONST CHAR16  *Specific\r
   )\r
@@ -874,7 +864,6 @@ PerformMappingDelete(
 \r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 AddMappingFromMapping(\r
   IN CONST CHAR16     *Map,\r
   IN CONST CHAR16     *SName\r
@@ -931,7 +920,6 @@ AddMappingFromMapping(
 \r
 **/\r
 SHELL_STATUS\r
-EFIAPI\r
 AddMappingFromHandle(\r
   IN CONST EFI_HANDLE Handle,\r
   IN CONST CHAR16     *SName\r
@@ -991,6 +979,57 @@ STATIC CONST SHELL_PARAM_ITEM MapParamList[] = {
   {NULL, TypeMax}\r
   };\r
 \r
+/**\r
+  The routine issues dummy read for every physical block device to cause\r
+  the BlockIo re-installed if media change happened.\r
+**/\r
+VOID\r
+ProbeForMediaChange (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS                            Status;\r
+  UINTN                                 HandleCount;\r
+  EFI_HANDLE                            *Handles;\r
+  EFI_BLOCK_IO_PROTOCOL                 *BlockIo;\r
+  UINTN                                 Index;\r
+\r
+  gBS->LocateHandleBuffer (\r
+         ByProtocol,\r
+         &gEfiBlockIoProtocolGuid,\r
+         NULL,\r
+         &HandleCount,\r
+         &Handles\r
+         );\r
+  //\r
+  // Probe for media change for every physical block io\r
+  //\r
+  for (Index = 0; Index < HandleCount; Index++) {\r
+    Status = gBS->HandleProtocol (\r
+                    Handles[Index],\r
+                    &gEfiBlockIoProtocolGuid,\r
+                    (VOID **) &BlockIo\r
+                    );\r
+    if (!EFI_ERROR (Status)) {\r
+      if (!BlockIo->Media->LogicalPartition) {\r
+        //\r
+        // Per spec:\r
+        //   The function (ReadBlocks) must return EFI_NO_MEDIA or\r
+        //   EFI_MEDIA_CHANGED even if LBA, BufferSize, or Buffer are invalid so the caller can probe\r
+        //   for changes in media state.\r
+        //\r
+        BlockIo->ReadBlocks (\r
+                   BlockIo,\r
+                   BlockIo->Media->MediaId,\r
+                   0,\r
+                   0,\r
+                   NULL\r
+                   );\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
 /**\r
   Function for 'map' command.\r
 \r
@@ -1099,6 +1138,7 @@ ShellCommandRunMap (
                || ShellCommandLineGetFlag(Package, L"-u")\r
                || ShellCommandLineGetFlag(Package, L"-t")\r
               ){\r
+        ProbeForMediaChange ();\r
         if ( ShellCommandLineGetFlag(Package, L"-r")) {\r
           //\r
           // Do the reset\r