]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c
return value not follow spec.
[mirror_edk2.git] / MdeModulePkg / Universal / Console / ConSplitterDxe / ConSplitter.c
index c8a773d75cb8d46383df470a0e4605eaeea5ef51..3389f62f98051c4bff361360ab204bffec474663 100644 (file)
@@ -379,23 +379,11 @@ ConSplitterDriverEntry(
           FeaturePcdGet (PcdConOutUgaSupport));\r
 \r
   //\r
-  // The driver creates virtual handles for ConIn, ConOut, and StdErr.\r
+  // The driver creates virtual handles for ConIn, ConOut.\r
   // The virtual handles will always exist even if no console exist in the\r
   // system. This is need to support hotplug devices like USB.\r
   //\r
   //\r
-  // Create virtual device handle for StdErr Splitter\r
-  //\r
-  Status = ConSplitterTextOutConstructor (&mStdErr);\r
-  if (!EFI_ERROR (Status)) {\r
-    Status = gBS->InstallMultipleProtocolInterfaces (\r
-                    &mStdErr.VirtualHandle,\r
-                    &gEfiSimpleTextOutProtocolGuid,\r
-                    &mStdErr.TextOut,\r
-                    NULL\r
-                    );\r
-  }\r
-  //\r
   // Create virtual device handle for ConIn Splitter\r
   //\r
   Status = ConSplitterTextInConstructor (&mConIn);\r
@@ -1327,6 +1315,25 @@ ConSplitterStdErrDriverBindingStart (
   EFI_STATUS                       Status;\r
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;\r
 \r
+  if (mStdErr.CurrentNumberOfConsoles == 0) {\r
+    //\r
+    // Create virtual device handle for StdErr Splitter\r
+    //\r
+    Status = ConSplitterTextOutConstructor (&mStdErr);\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &mStdErr.VirtualHandle,\r
+                      &gEfiSimpleTextOutProtocolGuid,\r
+                      &mStdErr.TextOut,\r
+                      NULL\r
+                      );\r
+    }\r
+    \r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+  }\r
+\r
   //\r
   // Start ConSplitter on ControllerHandle, and create the virtual\r
   // agrogated console device on first call Start for a StandardError handle.\r
@@ -1360,6 +1367,19 @@ ConSplitterStdErrDriverBindingStart (
   }\r
 \r
   if (mStdErr.CurrentNumberOfConsoles == 1) {\r
+    //\r
+    // Create virtual device handle for StdErr Splitter\r
+    //\r
+    Status = ConSplitterTextOutConstructor (&mStdErr);\r
+    if (!EFI_ERROR (Status)) {\r
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &mStdErr.VirtualHandle,\r
+                      &gEfiSimpleTextOutProtocolGuid,\r
+                      &mStdErr.TextOut,\r
+                      NULL\r
+                      );\r
+    }\r
+\r
     gST->StandardErrorHandle  = mStdErr.VirtualHandle;\r
     gST->StdErr               = &mStdErr.TextOut;\r
     //\r
@@ -1726,6 +1746,16 @@ ConSplitterStdErrDriverBindingStop (
           gST->Hdr.HeaderSize,\r
           &gST->Hdr.CRC32\r
           );\r
+\r
+    //\r
+    // Uninstall Simple Text Output protocol from StdErr Handle.\r
+    //\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           mStdErr.VirtualHandle,\r
+           &gEfiSimpleTextOutProtocolGuid,\r
+           &mStdErr.TextOut,\r
+           NULL\r
+           );\r
   }\r
 \r
   return Status;\r
@@ -3636,7 +3666,6 @@ ConSplitterTextInRegisterKeyNotify (
   @retval EFI_SUCCESS              The notification function was unregistered\r
                                    successfully.\r
   @retval EFI_INVALID_PARAMETER    The NotificationHandle is invalid.\r
-  @retval EFI_NOT_FOUND            Can not find the matching entry in database.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -3690,8 +3719,10 @@ ConSplitterTextInUnregisterKeyNotify (
     }\r
   }\r
 \r
-  return EFI_NOT_FOUND;\r
-\r
+  //\r
+  // NotificationHandle is not found in database\r
+  //\r
+  return EFI_INVALID_PARAMETER;\r
 }\r
 \r
 \r
@@ -4145,6 +4176,7 @@ ConSplitterTextOutOutputString (
   Private         = TEXT_OUT_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   BackSpaceCount  = 0;\r
+\r
   for (TargetString = WString; *TargetString != L'\0'; TargetString++) {\r
     if (*TargetString == CHAR_BACKSPACE) {\r
       BackSpaceCount++;\r