-/*++\r
+/**@file\r
\r
Copyright (c) 2006 - 2007, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
This driver parses the mMiscSubclassDataTable structure and reports\r
any generated data to the DataHub.\r
\r
---*/\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
--*/\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
//\r
// Log Data Hub record.\r
//\r
- EfiStatus = DataHub->LogData (\r
+ Status = DataHub->LogData (\r
DataHub,\r
&gEfiMiscSubClassGuid,\r
&gEfiMiscSubClassGuid,\r
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
\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
//\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
+ HiiLibAddPackages (1, &gEfiMiscSubClassGuid, NULL, &HiiHandle, MiscSubclassStrings);\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
+ if (EFI_ERROR (Status)) {\r
+ DEBUG ((EFI_D_ERROR, "Could not log default strings to Hii. %r\n", Status));\r
+ return Status;\r
}\r
//\r
//\r
//\r
// Log RecordData to Data Hub.\r
//\r
- EfiStatus = DataHub->LogData (\r
+ Status = DataHub->LogData (\r
DataHub,\r
&gEfiMiscSubClassGuid,\r
&gEfiMiscSubClassGuid,\r
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
// 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
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
-\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
+ 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
- // Retrieve the list of all handles from the handle database.\r
+ // Store memory size data record to data hub.\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
- //\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
+ 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
- TotalMemorySize = (UINT64) Atoi (WinNtIo->EnvString);\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