]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
HII Library Class interface refine.
[mirror_edk2.git] / Nt32Pkg / MiscSubClassPlatformDxe / MiscSubclassDriverEntryPoint.c
index 5eff1d95025d143ff56b30795dfab62a4e9ade7d..8c2bcc19ea0c2436efdef66035ea38f50526b6b6 100644 (file)
@@ -1,4 +1,4 @@
-/*++\r
+/**@file\r
 \r
 Copyright (c) 2006 - 2007, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
@@ -18,24 +18,13 @@ Abstract:
   This driver parses the mMiscSubclassDataTable structure and reports\r
   any generated data to the DataHub.\r
 \r
---*/\r
-\r
-//\r
-// Include common header file for this module.\r
-//\r
-#include "CommonHeader.h"\r
+**/\r
 \r
 #include "MiscSubclassDriver.h"\r
 \r
 \r
 extern UINT8  MiscSubclassStrings[];\r
 \r
-VOID\r
-EFIAPI\r
-WinNtIoProtocolNotifyFunction (\r
-  IN EFI_EVENT                Event,\r
-  IN VOID                     *Context\r
-  );\r
 \r
 //\r
 //\r
@@ -75,7 +64,7 @@ Returns:
 --*/\r
 {\r
   EFI_MISC_SUBCLASS_DRIVER_DATA MiscSubclass;\r
-  EFI_STATUS                    EfiStatus;\r
+  EFI_STATUS                    Status;\r
 \r
   //\r
   // Do nothing if data parameters are not valid.\r
@@ -108,7 +97,7 @@ Returns:
   //\r
   // Log Data Hub record.\r
   //\r
-  EfiStatus = DataHub->LogData (\r
+  Status = DataHub->LogData (\r
                         DataHub,\r
                         &gEfiMiscSubClassGuid,\r
                         &gEfiMiscSubClassGuid,\r
@@ -117,16 +106,16 @@ Returns:
                         sizeof (EFI_SUBCLASS_TYPE1_HEADER) + RecordLen\r
                         );\r
 \r
-  if (EFI_ERROR (EfiStatus)) {\r
+  if (EFI_ERROR (Status)) {\r
     DEBUG (\r
       (EFI_D_ERROR,\r
       "LogData(%d bytes) == %r\n",\r
       sizeof (EFI_SUBCLASS_TYPE1_HEADER) + RecordLen,\r
-      EfiStatus)\r
+      Status)\r
       );\r
   }\r
 \r
-  return EfiStatus;\r
+  return Status;\r
 }\r
 \r
 \r
@@ -157,16 +146,15 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_MISC_SUBCLASS_DRIVER_DATA RecordData;\r
-  EFI_DATA_HUB_PROTOCOL         *DataHub;\r
-  EFI_HII_PROTOCOL              *Hii;\r
-  EFI_HII_PACKAGES              *PackageList;\r
-  EFI_HII_HANDLE                HiiHandle;\r
-  EFI_STATUS                    EfiStatus;\r
-  UINTN                         Index;\r
-  BOOLEAN                       LogRecordData;\r
-  EFI_EVENT                     Event;\r
-  VOID                          *Registration;\r
+  EFI_MISC_SUBCLASS_DRIVER_DATA     RecordData;\r
+  EFI_DATA_HUB_PROTOCOL             *DataHub;\r
+  EFI_HII_HANDLE                    HiiHandle;\r
+  EFI_STATUS                        Status;\r
+  UINTN                             Index;\r
+  BOOLEAN                           LogRecordData;\r
+  EFI_MEMORY_SUBCLASS_DRIVER_DATA   MemorySubClassData; \r
+  UINT64                            TotalMemorySize;\r
+  CHAR16                            *Nt32MemString;\r
 \r
 \r
   //\r
@@ -180,37 +168,27 @@ Returns:
   //\r
   // Locate data hub protocol.\r
   //\r
-  EfiStatus = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, &DataHub);\r
+  Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, (VOID**)&DataHub);\r
 \r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DEBUG ((EFI_D_ERROR, "Could not locate DataHub protocol.  %r\n", EfiStatus));\r
-    return EfiStatus;\r
+  if (EFI_ERROR (Status)) {\r
+    DEBUG ((EFI_D_ERROR, "Could not locate DataHub protocol.  %r\n", Status));\r
+    return Status;\r
   } else if (DataHub == NULL) {\r
     DEBUG ((EFI_D_ERROR, "LocateProtocol(DataHub) returned NULL pointer!\n"));\r
     return EFI_DEVICE_ERROR;\r
   }\r
   //\r
-  // Locate hii protocol.\r
-  //\r
-  EfiStatus = gBS->LocateProtocol (&gEfiHiiProtocolGuid, NULL, &Hii);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DEBUG ((EFI_D_ERROR, "Could not locate Hii protocol.  %r\n", EfiStatus));\r
-    return EfiStatus;\r
-  } else if (Hii == NULL) {\r
-    DEBUG ((EFI_D_ERROR, "LocateProtocol(Hii) returned NULL pointer!\n"));\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
   // Add our default strings to the HII database. They will be modified later.\r
   //\r
-  PackageList = PreparePackages (1, &gEfiMiscSubClassGuid, MiscSubclassStrings);\r
-  EfiStatus   = Hii->NewPack (Hii, PackageList, &HiiHandle);\r
-  FreePool (PackageList);\r
-\r
-  if (EFI_ERROR (EfiStatus)) {\r
-    DEBUG ((EFI_D_ERROR, "Could not log default strings to Hii.  %r\n", EfiStatus));\r
-    return EfiStatus;\r
+  HiiHandle = HiiAddPackages (\r
+                &gEfiMiscSubClassGuid,\r
+                NULL,\r
+                MiscSubclassStrings,\r
+                NULL\r
+                );\r
+  if (HiiHandle == NULL) {\r
+    DEBUG ((EFI_D_ERROR, "Could not log default strings to Hii.  %r\n", Status));\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
   //\r
   //\r
@@ -255,7 +233,7 @@ Returns:
       //\r
       // Log RecordData to Data Hub.\r
       //\r
-      EfiStatus = DataHub->LogData (\r
+      Status = DataHub->LogData (\r
                             DataHub,\r
                             &gEfiMiscSubClassGuid,\r
                             &gEfiMiscSubClassGuid,\r
@@ -264,12 +242,12 @@ Returns:
                             sizeof (EFI_SUBCLASS_TYPE1_HEADER) + mMiscSubclassDataTable[Index].RecordLen\r
                             );\r
 \r
-      if (EFI_ERROR (EfiStatus)) {\r
+      if (EFI_ERROR (Status)) {\r
         DEBUG (\r
           (EFI_D_ERROR,\r
           "LogData(%d bytes) == %r\n",\r
           sizeof (EFI_SUBCLASS_TYPE1_HEADER) + mMiscSubclassDataTable[Index].RecordLen,\r
-          EfiStatus)\r
+          Status)\r
           );\r
       }\r
 \r
@@ -281,29 +259,16 @@ Returns:
     // is no more data to log.\r
     //\r
     for (;;) {\r
-      //\r
-      //\r
-      //\r
-      EfiStatus = (*mMiscSubclassDataTable[Index].Function)\r
-        (\r
-          mMiscSubclassDataTable[Index].RecordType, &mMiscSubclassDataTable[Index].RecordLen, &RecordData.Record, &\r
-            LogRecordData\r
-        );\r
-\r
-      //\r
-      //\r
-      //\r
-      if (EFI_ERROR (EfiStatus)) {\r
+      Status = (*mMiscSubclassDataTable[Index].Function)(mMiscSubclassDataTable[Index].RecordType, &mMiscSubclassDataTable[Index].RecordLen, &RecordData.Record, &LogRecordData);\r
+      if (EFI_ERROR (Status)) {\r
         break;\r
       }\r
 \r
       if (!LogRecordData) {\r
         break;\r
       }\r
-      //\r
-      //\r
-      //\r
-      EfiStatus = DataHub->LogData (\r
+\r
+      Status = DataHub->LogData (\r
                             DataHub,\r
                             &gEfiMiscSubClassGuid,\r
                             &gEfiMiscSubClassGuid,\r
@@ -312,212 +277,62 @@ Returns:
                             sizeof (EFI_SUBCLASS_TYPE1_HEADER) + mMiscSubclassDataTable[Index].RecordLen\r
                             );\r
 \r
-      if (EFI_ERROR (EfiStatus)) {\r
+      if (EFI_ERROR (Status)) {\r
         DEBUG (\r
           (EFI_D_ERROR,\r
           "LogData(%d bytes) == %r\n",\r
           sizeof (EFI_SUBCLASS_TYPE1_HEADER) + mMiscSubclassDataTable[Index].RecordLen,\r
-          EfiStatus)\r
+          Status)\r
           );\r
       }\r
     }\r
   }\r
-  //\r
-  // Install notify function to fetch memory data through WinNtIo protocol and store to data hub.\r
-  //\r
-  EfiStatus = gBS->CreateEvent (\r
-                    EVT_NOTIFY_SIGNAL,\r
-                    TPL_CALLBACK,\r
-                    WinNtIoProtocolNotifyFunction,\r
-                    ImageHandle,\r
-                    &Event\r
-                    );\r
-  ASSERT (!EFI_ERROR (EfiStatus));\r
-\r
-  EfiStatus = gBS->RegisterProtocolNotify (\r
-                    &gEfiWinNtIoProtocolGuid,\r
-                    Event,\r
-                    &Registration\r
-                    );\r
-  ASSERT (!EFI_ERROR (EfiStatus));\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-UINTN\r
-Atoi (\r
-  CHAR16  *String\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  Convert a unicode string to a UINTN\r
-\r
-Arguments:\r
-  String - Unicode string.\r
-\r
-Returns:\r
-  UINTN of the number represented by String.\r
-\r
---*/\r
-{\r
-  UINTN   Number;\r
-  CHAR16  *Str;\r
 \r
+  \r
   //\r
-  // skip preceeding white space\r
+  // Log Memory Size info based on PCD setting.\r
   //\r
-  Str = String;\r
-  while ((*Str) && (*Str == ' ' || *Str == '"')) {\r
-    Str++;\r
-  }\r
+  MemorySubClassData.Header.Instance    = 1;\r
+  MemorySubClassData.Header.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
+  MemorySubClassData.Header.RecordType  = EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER;\r
+\r
   //\r
-  // Convert ot a Number\r
+  // Process Memory String in form size!size ...\r
+  // So 64!64 is 128 MB\r
   //\r
-  Number = 0;\r
-  while (*Str != '\0') {\r
-    if ((*Str >= '0') && (*Str <= '9')) {\r
-      Number = (Number * 10) +*Str - '0';\r
-    } else {\r
-      break;\r
+  Nt32MemString   = PcdGetPtr (PcdWinNtMemorySize);\r
+  for (TotalMemorySize = 0; *Nt32MemString != '\0';) {\r
+    TotalMemorySize += StrDecimalToUint64 (Nt32MemString);\r
+    while (*Nt32MemString != '\0') {\r
+      if (*Nt32MemString == '!') {\r
+        Nt32MemString++;       \r
+        break;\r
+      }\r
+      Nt32MemString++;\r
     }\r
-\r
-    Str++;\r
   }\r
 \r
-  return Number;\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-WinNtIoProtocolNotifyFunction (\r
-  IN EFI_EVENT                Event,\r
-  IN VOID                     *Context\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function will log memory size data to data hub.\r
+  MemorySubClassData.Record.ArrayStartAddress.MemoryArrayStartAddress               = 0;\r
+  MemorySubClassData.Record.ArrayStartAddress.MemoryArrayEndAddress                 = LShiftU64 (TotalMemorySize, 20) - 1;\r
+  MemorySubClassData.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName  = gEfiMemoryProducerGuid;\r
+  MemorySubClassData.Record.ArrayStartAddress.PhysicalMemoryArrayLink.Instance      = 1;\r
+  MemorySubClassData.Record.ArrayStartAddress.PhysicalMemoryArrayLink.SubInstance   = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
+  MemorySubClassData.Record.ArrayStartAddress.MemoryArrayPartitionWidth             = 0;\r
 \r
-Arguments:\r
-Event        - Event whose notification function is being invoked.\r
-Context      - Pointer to the notification function's context.\r
-\r
-Returns:\r
-    EFI_STATUS.\r
-\r
---*/\r
-{\r
-  EFI_STATUS                      Status;\r
-  EFI_MEMORY_SUBCLASS_DRIVER_DATA MemorySubClassData;\r
-  EFI_DATA_RECORD_HEADER          *Record;\r
-  EFI_SUBCLASS_TYPE1_HEADER       *DataHeader;\r
-  UINTN                           HandleCount;\r
-  UINTN                           HandleIndex;\r
-  UINT64                          MonotonicCount;\r
-  BOOLEAN                         RecordFound;\r
-  EFI_HANDLE                      *HandleBuffer;\r
-  EFI_WIN_NT_IO_PROTOCOL          *WinNtIo;\r
-  EFI_DATA_HUB_PROTOCOL           *DataHub;\r
-  UINT64                          TotalMemorySize;\r
-\r
-  DataHub         = NULL;\r
-  MonotonicCount  = 0;\r
-  RecordFound     = FALSE;\r
-\r
-  //\r
-  // Retrieve the list of all handles from the handle database.\r
-  //\r
-  Status = gBS->LocateHandleBuffer (\r
-                  AllHandles,\r
-                  &gEfiWinNtIoProtocolGuid,\r
-                  NULL,\r
-                  &HandleCount,\r
-                  &HandleBuffer\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return ;\r
-  }\r
   //\r
-  // Locate DataHub protocol.\r
+  // Store memory size data record to data hub.\r
   //\r
-  Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, &DataHub);\r
-  if (EFI_ERROR (Status)) {\r
-    return ;\r
-  }\r
-  //\r
-  // Search the Handle array to find the meory size information.\r
-  //\r
-  for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {\r
-    Status = gBS->OpenProtocol (\r
-                    HandleBuffer[HandleIndex],\r
-                    &gEfiWinNtIoProtocolGuid,\r
-                    &WinNtIo,\r
-                    Context,\r
-                    NULL,\r
-                    EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      continue;\r
-    }\r
-\r
-    if ((WinNtIo->WinNtThunk->Signature == EFI_WIN_NT_THUNK_PROTOCOL_SIGNATURE) &&\r
-        CompareGuid (WinNtIo->TypeGuid, &gEfiWinNtMemoryGuid)\r
-          ) {\r
-      //\r
-      // Check if this record has been stored in data hub.\r
-      //\r
-      do {\r
-        Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);\r
-        if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {\r
-          DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);\r
-          if (CompareGuid (&Record->DataRecordGuid, &gEfiProcessorSubClassGuid) &&\r
-              (DataHeader->RecordType == EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER)\r
-              ) {\r
-            RecordFound = TRUE;\r
-          }\r
-        }\r
-      } while (MonotonicCount != 0);\r
-\r
-      if (RecordFound) {\r
-        RecordFound = FALSE;\r
-        continue;\r
-      }\r
-      //\r
-      // Initialize data record.\r
-      //\r
-      MemorySubClassData.Header.Instance    = 1;\r
-      MemorySubClassData.Header.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
-      MemorySubClassData.Header.RecordType  = EFI_MEMORY_ARRAY_START_ADDRESS_RECORD_NUMBER;\r
-\r
-      TotalMemorySize                       = (UINT64) Atoi (WinNtIo->EnvString);\r
+  Status = DataHub->LogData (\r
+                      DataHub,\r
+                      &gEfiMemorySubClassGuid,\r
+                      &gEfiMemoryProducerGuid,\r
+                      EFI_DATA_RECORD_CLASS_DATA,\r
+                      &MemorySubClassData,\r
+                      sizeof (EFI_SUBCLASS_TYPE1_HEADER) + sizeof (EFI_MEMORY_ARRAY_START_ADDRESS_DATA)\r
+                      );\r
 \r
-      MemorySubClassData.Record.ArrayStartAddress.MemoryArrayStartAddress               = 0;\r
-      MemorySubClassData.Record.ArrayStartAddress.MemoryArrayEndAddress                 = LShiftU64 (TotalMemorySize, 20) - 1;\r
-      MemorySubClassData.Record.ArrayStartAddress.PhysicalMemoryArrayLink.ProducerName  = gEfiMemoryProducerGuid;\r
-      MemorySubClassData.Record.ArrayStartAddress.PhysicalMemoryArrayLink.Instance      = 1;\r
-      MemorySubClassData.Record.ArrayStartAddress.PhysicalMemoryArrayLink.SubInstance = EFI_SUBCLASS_INSTANCE_NON_APPLICABLE;\r
-      MemorySubClassData.Record.ArrayStartAddress.MemoryArrayPartitionWidth = 0;\r
 \r
-      //\r
-      // Store memory size data record to data hub.\r
-      //\r
-      Status = DataHub->LogData (\r
-                          DataHub,\r
-                          &gEfiMemorySubClassGuid,\r
-                          &gEfiMemoryProducerGuid,\r
-                          EFI_DATA_RECORD_CLASS_DATA,\r
-                          &MemorySubClassData,\r
-                          sizeof (EFI_SUBCLASS_TYPE1_HEADER) + sizeof (EFI_MEMORY_ARRAY_START_ADDRESS_DATA)\r
-                          );\r
-    }\r
-\r
-    gBS->CloseProtocol (\r
-          HandleBuffer[HandleIndex],\r
-          &gEfiWinNtIoProtocolGuid,\r
-          Context,\r
-          NULL\r
-          );\r
-  }\r
+  return EFI_SUCCESS;\r
 }\r
 \r
+\r