summaryrefslogtreecommitdiff
path: root/Nt32Pkg/CpuRuntimeDxe
diff options
context:
space:
mode:
authorAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>2007-07-26 21:33:37 +0000
committerAJFISH <AJFISH@6f19259b-4bc3-4df7-8a09-765794883524>2007-07-26 21:33:37 +0000
commitb397fbbbf952ce05c4552d5f2aabeac74aec8aad (patch)
tree55057e3936adb9c6b001f7a39ef9c126df953da3 /Nt32Pkg/CpuRuntimeDxe
parent0963b13df50273487a38784a64f7003e95981dea (diff)
removed gEfiWinNtCPUSpeedGuid, gEfiWinNtCPUModelGuid, and gEfiWinNtMemoryGuid. Replaced them with the PCD values they represent. There was no need to use the driver model, when you could get PCD value directly. Also removed local copies of Atoi() in several modules. Fixed bug in reporting of memory size.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3458 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'Nt32Pkg/CpuRuntimeDxe')
-rw-r--r--Nt32Pkg/CpuRuntimeDxe/Cpu.c440
-rw-r--r--Nt32Pkg/CpuRuntimeDxe/CpuDriver.h75
-rw-r--r--Nt32Pkg/CpuRuntimeDxe/CpuIo.c335
-rw-r--r--Nt32Pkg/CpuRuntimeDxe/CpuRuntimeDxe.inf6
4 files changed, 211 insertions, 645 deletions
diff --git a/Nt32Pkg/CpuRuntimeDxe/Cpu.c b/Nt32Pkg/CpuRuntimeDxe/Cpu.c
index a3317526a..f0e22a4c4 100644
--- a/Nt32Pkg/CpuRuntimeDxe/Cpu.c
+++ b/Nt32Pkg/CpuRuntimeDxe/Cpu.c
@@ -25,21 +25,35 @@ Abstract:
#include "CpuDriver.h"
+
+CPU_ARCH_PROTOCOL_PRIVATE mCpuTemplate = {
+ CPU_ARCH_PROT_PRIVATE_SIGNATURE,
+ NULL,
+ {
+ WinNtFlushCpuDataCache,
+ WinNtEnableInterrupt,
+ WinNtDisableInterrupt,
+ WinNtGetInterruptState,
+ WinNtInit,
+ WinNtRegisterInterruptHandler,
+ WinNtGetTimerValue,
+ WinNtSetMemoryAttributes,
+ 0,
+ 4
+ },
+ {
+ CpuMemoryServiceRead,
+ CpuMemoryServiceWrite,
+ CpuIoServiceRead,
+ CpuIoServiceWrite
+ },
+ 0,
+ TRUE
+};
+
#define EFI_CPU_DATA_MAXIMUM_LENGTH 0x100
-EFI_STATUS
-EFIAPI
-InitializeCpu (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- );
-VOID
-EFIAPI
-WinNtIoProtocolNotifyFunction (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
typedef union {
EFI_CPU_DATA_RECORD *DataRecord;
@@ -57,7 +71,6 @@ EFI_SUBCLASS_TYPE1_HEADER mCpuDataRecordHeader = {
//
// Service routines for the driver
//
-STATIC
EFI_STATUS
EFIAPI
WinNtFlushCpuDataCache (
@@ -104,7 +117,7 @@ Returns:
return EFI_UNSUPPORTED;
}
-STATIC
+
EFI_STATUS
EFIAPI
WinNtEnableInterrupt (
@@ -138,7 +151,7 @@ Returns:
return EFI_SUCCESS;
}
-STATIC
+
EFI_STATUS
EFIAPI
WinNtDisableInterrupt (
@@ -172,7 +185,7 @@ Returns:
return EFI_SUCCESS;
}
-STATIC
+
EFI_STATUS
EFIAPI
WinNtGetInterruptState (
@@ -213,7 +226,7 @@ Returns:
return EFI_SUCCESS;
}
-STATIC
+
EFI_STATUS
EFIAPI
WinNtInit (
@@ -247,7 +260,7 @@ Returns:
return EFI_UNSUPPORTED;
}
-STATIC
+
EFI_STATUS
EFIAPI
WinNtRegisterInterruptHandler (
@@ -293,7 +306,7 @@ Returns:
return EFI_UNSUPPORTED;
}
-STATIC
+
EFI_STATUS
EFIAPI
WinNtGetTimerValue (
@@ -333,7 +346,7 @@ Returns:
return EFI_UNSUPPORTED;
}
-STATIC
+
EFI_STATUS
EFIAPI
WinNtSetMemoryAttributes (
@@ -385,150 +398,9 @@ Returns:
}
-EFI_STATUS
-EFIAPI
-InitializeCpu (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-/*++
-
-Routine Description:
-
- Initialize the state information for the CPU Architectural Protocol
-
-Arguments:
-
- ImageHandle of the loaded driver
- Pointer to the System Table
-
-Returns:
-
- Status
-
- EFI_SUCCESS - protocol instance can be published
- EFI_OUT_OF_RESOURCES - cannot allocate protocol data structure
- EFI_DEVICE_ERROR - cannot create the thread
-
---*/
-// TODO: SystemTable - add argument and description to function comment
-{
- EFI_STATUS Status;
- EFI_EVENT Event;
- CPU_ARCH_PROTOCOL_PRIVATE *Private;
- VOID *Registration;
-
- Private = AllocatePool (sizeof (CPU_ARCH_PROTOCOL_PRIVATE));
- ASSERT (Private != NULL);
-
- Private->Signature = CPU_ARCH_PROT_PRIVATE_SIGNATURE;
- Private->Cpu.FlushDataCache = WinNtFlushCpuDataCache;
- Private->Cpu.EnableInterrupt = WinNtEnableInterrupt;
- Private->Cpu.DisableInterrupt = WinNtDisableInterrupt;
- Private->Cpu.GetInterruptState = WinNtGetInterruptState;
- Private->Cpu.Init = WinNtInit;
- Private->Cpu.RegisterInterruptHandler = WinNtRegisterInterruptHandler;
- Private->Cpu.GetTimerValue = WinNtGetTimerValue;
- Private->Cpu.SetMemoryAttributes = WinNtSetMemoryAttributes;
-
- Private->Cpu.NumberOfTimers = 0;
- Private->Cpu.DmaBufferAlignment = 4;
-
- Private->InterruptState = TRUE;
-
- Private->CpuIo.Mem.Read = CpuMemoryServiceRead;
- Private->CpuIo.Mem.Write = CpuMemoryServiceWrite;
- Private->CpuIo.Io.Read = CpuIoServiceRead;
- Private->CpuIo.Io.Write = CpuIoServiceWrite;
-
-
- Private->Handle = NULL;
- Status = gBS->InstallMultipleProtocolInterfaces (
- &Private->Handle,
- &gEfiCpuArchProtocolGuid, &Private->Cpu,
- &gEfiCpuIoProtocolGuid, &Private->CpuIo,
- NULL
- );
- ASSERT_EFI_ERROR (Status);
-
- //
- // Install notify function to store processor data to HII database and data hub.
- //
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_CALLBACK,
- WinNtIoProtocolNotifyFunction,
- ImageHandle,
- &Event
- );
- ASSERT (!EFI_ERROR (Status));
-
- Status = gBS->RegisterProtocolNotify (
- &gEfiWinNtIoProtocolGuid,
- Event,
- &Registration
- );
- ASSERT (!EFI_ERROR (Status));
-
- //
- // Should be at EFI_D_INFO, but lets us now things are running
- //
- DEBUG ((EFI_D_ERROR, "CPU Architectural Protocol Loaded\n"));
-
-
-
- return Status;
-}
-
-UINTN
-Atoi (
- CHAR16 *String
- )
-/*++
-
-Routine Description:
- Convert a unicode string to a UINTN
-
-Arguments:
- String - Unicode string.
-
-Returns:
- UINTN of the number represented by String.
-
---*/
-{
- UINTN Number;
- CHAR16 *Str;
-
- //
- // skip preceeding white space
- //
- Str = String;
- while ((*Str) && (*Str == ' ' || *Str == '"')) {
- Str++;
- }
- //
- // Convert ot a Number
- //
- Number = 0;
- while (*Str != '\0') {
- if ((*Str >= '0') && (*Str <= '9')) {
- Number = (Number * 10) +*Str - '0';
- } else {
- break;
- }
-
- Str++;
- }
-
- return Number;
-}
-
VOID
-EFIAPI
-WinNtIoProtocolNotifyFunction (
- IN EFI_EVENT Event,
- IN VOID *Context
+CpuUpdateDataHub (
+ VOID
)
/*++
@@ -546,54 +418,31 @@ Returns:
{
EFI_STATUS Status;
EFI_CPU_DATA_RECORD_BUFFER RecordBuffer;
- EFI_DATA_RECORD_HEADER *Record;
- EFI_SUBCLASS_TYPE1_HEADER *DataHeader;
UINT32 HeaderSize;
UINT32 TotalSize;
- UINTN HandleCount;
- UINTN HandleIndex;
- UINT64 MonotonicCount;
- BOOLEAN RecordFound;
- EFI_HANDLE *HandleBuffer;
- EFI_WIN_NT_IO_PROTOCOL *WinNtIo;
EFI_DATA_HUB_PROTOCOL *DataHub;
EFI_HII_PROTOCOL *Hii;
EFI_HII_HANDLE StringHandle;
EFI_HII_PACKAGES *PackageList;
STRING_REF Token;
- DataHub = NULL;
- Token = 0;
- MonotonicCount = 0;
- RecordFound = FALSE;
//
- // Retrieve the list of all handles from the handle database
- //
- Status = gBS->LocateHandleBuffer (
- AllHandles,
- &gEfiWinNtIoProtocolGuid,
- NULL,
- &HandleCount,
- &HandleBuffer
- );
- if (EFI_ERROR (Status)) {
- return ;
- }
- //
- // Locate HII protocol
+ // Locate DataHub protocol.
//
- Status = gBS->LocateProtocol (&gEfiHiiProtocolGuid, NULL, &Hii);
+ Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, &DataHub);
if (EFI_ERROR (Status)) {
- return ;
+ return;
}
+
//
// Locate DataHub protocol.
//
- Status = gBS->LocateProtocol (&gEfiDataHubProtocolGuid, NULL, &DataHub);
+ Status = gBS->LocateProtocol (&gEfiHiiProtocolGuid, NULL, &Hii);
if (EFI_ERROR (Status)) {
- return ;
+ return;
}
+
//
// Initialize data record header
//
@@ -605,123 +454,98 @@ Returns:
return ;
}
+ //
+ // Initialize strings to HII database
+ //
+ PackageList = PreparePackages (1, &gEfiProcessorProducerGuid, CpuStrings);
+ Status = Hii->NewPack (Hii, PackageList, &StringHandle);
+ ASSERT (!EFI_ERROR (Status));
+ FreePool (PackageList);
+
CopyMem (RecordBuffer.Raw, &mCpuDataRecordHeader, HeaderSize);
//
- // Search the Handle array to find the CPU model and speed information
+ // Store processor version data record to data hub
//
- for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
- Status = gBS->OpenProtocol (
- HandleBuffer[HandleIndex],
- &gEfiWinNtIoProtocolGuid,
- &WinNtIo,
- Context,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- continue;
- }
-
- if ((WinNtIo->WinNtThunk->Signature == EFI_WIN_NT_THUNK_PROTOCOL_SIGNATURE) &&
- CompareGuid (WinNtIo->TypeGuid, &gEfiWinNtCPUModelGuid)
- ) {
- //
- // Check if this record has been stored in data hub
- //
- do {
- Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);
- if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
- DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);
- if (CompareGuid (&Record->DataRecordGuid, &gEfiProcessorSubClassGuid) &&
- (DataHeader->RecordType == ProcessorVersionRecordType)
- ) {
- RecordFound = TRUE;
- }
- }
- } while (MonotonicCount != 0);
-
- if (RecordFound) {
- RecordFound = FALSE;
- continue;
- }
- //
- // Initialize strings to HII database
- //
- PackageList = PreparePackages (1, &gEfiProcessorProducerGuid, CpuStrings);
-
- Status = Hii->NewPack (Hii, PackageList, &StringHandle);
- ASSERT (!EFI_ERROR (Status));
-
- FreePool (PackageList);
-
- //
- // Store processor version data record to data hub
- //
- Status = Hii->NewString (Hii, NULL, StringHandle, &Token, WinNtIo->EnvString);
- ASSERT (!EFI_ERROR (Status));
-
- RecordBuffer.DataRecord->DataRecordHeader.RecordType = ProcessorVersionRecordType;
- RecordBuffer.DataRecord->VariableRecord.ProcessorVersion = Token;
- TotalSize = HeaderSize + sizeof (EFI_PROCESSOR_VERSION_DATA);
-
- Status = DataHub->LogData (
- DataHub,
- &gEfiProcessorSubClassGuid,
- &gEfiProcessorProducerGuid,
- EFI_DATA_RECORD_CLASS_DATA,
- RecordBuffer.Raw,
- TotalSize
- );
- }
-
- if ((WinNtIo->WinNtThunk->Signature == EFI_WIN_NT_THUNK_PROTOCOL_SIGNATURE) &&
- CompareGuid (WinNtIo->TypeGuid, &gEfiWinNtCPUSpeedGuid)
- ) {
- //
- // Check if this record has been stored in data hub
- //
- do {
- Status = DataHub->GetNextRecord (DataHub, &MonotonicCount, NULL, &Record);
- if (Record->DataRecordClass == EFI_DATA_RECORD_CLASS_DATA) {
- DataHeader = (EFI_SUBCLASS_TYPE1_HEADER *) (Record + 1);
- if (CompareGuid (&Record->DataRecordGuid, &gEfiProcessorSubClassGuid) &&
- (DataHeader->RecordType == ProcessorCoreFrequencyRecordType)
- ) {
- RecordFound = TRUE;
- }
- }
- } while (MonotonicCount != 0);
-
- if (RecordFound) {
- RecordFound = FALSE;
- continue;
- }
- //
- // Store CPU frequency data record to data hub
- //
- RecordBuffer.DataRecord->DataRecordHeader.RecordType = ProcessorCoreFrequencyRecordType;
- RecordBuffer.DataRecord->VariableRecord.ProcessorCoreFrequency.Value = (UINT16) Atoi (WinNtIo->EnvString);
- RecordBuffer.DataRecord->VariableRecord.ProcessorCoreFrequency.Exponent = 6;
- TotalSize = HeaderSize + sizeof (EFI_PROCESSOR_CORE_FREQUENCY_DATA);
-
- Status = DataHub->LogData (
- DataHub,
- &gEfiProcessorSubClassGuid,
- &gEfiProcessorProducerGuid,
- EFI_DATA_RECORD_CLASS_DATA,
- RecordBuffer.Raw,
- TotalSize
- );
-
- FreePool (RecordBuffer.Raw);
- }
-
- gBS->CloseProtocol (
- HandleBuffer[HandleIndex],
- &gEfiWinNtIoProtocolGuid,
- Context,
- NULL
- );
- }
+ Token = 0;
+ Status = Hii->NewString (Hii, NULL, StringHandle, &Token, (CHAR16 *)PcdGetPtr (PcdWinNtCpuModel));
+ ASSERT (!EFI_ERROR (Status));
+
+ RecordBuffer.DataRecord->DataRecordHeader.RecordType = ProcessorVersionRecordType;
+ RecordBuffer.DataRecord->VariableRecord.ProcessorVersion = Token;
+ TotalSize = HeaderSize + sizeof (EFI_PROCESSOR_VERSION_DATA);
+
+ Status = DataHub->LogData (
+ DataHub,
+ &gEfiProcessorSubClassGuid,
+ &gEfiProcessorProducerGuid,
+ EFI_DATA_RECORD_CLASS_DATA,
+ RecordBuffer.Raw,
+ TotalSize
+ );
+
+ //
+ // Store CPU frequency data record to data hub
+ //
+ RecordBuffer.DataRecord->DataRecordHeader.RecordType = ProcessorCoreFrequencyRecordType;
+ RecordBuffer.DataRecord->VariableRecord.ProcessorCoreFrequency.Value = (UINT16) StrDecimalToUintn (PcdGetPtr (PcdWinNtCpuSpeed));
+ RecordBuffer.DataRecord->VariableRecord.ProcessorCoreFrequency.Exponent = 6;
+ TotalSize = HeaderSize + sizeof (EFI_PROCESSOR_CORE_FREQUENCY_DATA);
+
+ Status = DataHub->LogData (
+ DataHub,
+ &gEfiProcessorSubClassGuid,
+ &gEfiProcessorProducerGuid,
+ EFI_DATA_RECORD_CLASS_DATA,
+ RecordBuffer.Raw,
+ TotalSize
+ );
+
+ FreePool (RecordBuffer.Raw);
+}
+
+
+
+EFI_STATUS
+EFIAPI
+InitializeCpu (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+/*++
+
+Routine Description:
+
+ Initialize the state information for the CPU Architectural Protocol
+
+Arguments:
+
+ ImageHandle of the loaded driver
+ Pointer to the System Table
+
+Returns:
+
+ Status
+
+ EFI_SUCCESS - protocol instance can be published
+ EFI_OUT_OF_RESOURCES - cannot allocate protocol data structure
+ EFI_DEVICE_ERROR - cannot create the thread
+
+--*/
+{
+ EFI_STATUS Status;
+
+ CpuUpdateDataHub ();
+
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &mCpuTemplate.Handle,
+ &gEfiCpuArchProtocolGuid, &mCpuTemplate.Cpu,
+ &gEfiCpuIoProtocolGuid, &mCpuTemplate.CpuIo,
+ NULL
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ return Status;
}
+
+
diff --git a/Nt32Pkg/CpuRuntimeDxe/CpuDriver.h b/Nt32Pkg/CpuRuntimeDxe/CpuDriver.h
index 15316fb68..d05ba613e 100644
--- a/Nt32Pkg/CpuRuntimeDxe/CpuDriver.h
+++ b/Nt32Pkg/CpuRuntimeDxe/CpuDriver.h
@@ -30,12 +30,14 @@ Abstract:
#include <Guid/DataHubRecords.h>
#include <Protocol/CpuIo.h>
#include <Protocol/WinNtIo.h>
+#include <Library/BaseLib.h>
#include <Library/DebugLib.h>
#include <Library/HiiLibFramework.h>
#include <Library/UefiDriverEntryPoint.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
+#include <Library/PcdLib.h>
extern UINT8 CpuStrings[];
@@ -108,4 +110,77 @@ CpuIoServiceWrite (
);
+EFI_STATUS
+EFIAPI
+InitializeCpu (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ );
+
+EFI_STATUS
+EFIAPI
+WinNtFlushCpuDataCache (
+ IN EFI_CPU_ARCH_PROTOCOL *This,
+ IN EFI_PHYSICAL_ADDRESS Start,
+ IN UINT64 Length,
+ IN EFI_CPU_FLUSH_TYPE FlushType
+ );
+
+EFI_STATUS
+EFIAPI
+WinNtEnableInterrupt (
+ IN EFI_CPU_ARCH_PROTOCOL *This
+ );
+
+EFI_STATUS
+EFIAPI
+WinNtDisableInterrupt (
+ IN EFI_CPU_ARCH_PROTOCOL *This
+ );
+
+EFI_STATUS
+EFIAPI
+WinNtGetInterruptState (
+ IN EFI_CPU_ARCH_PROTOCOL *This,
+ OUT BOOLEAN *State
+ );
+
+EFI_STATUS
+EFIAPI
+WinNtInit (
+ IN EFI_CPU_ARCH_PROTOCOL *This,
+ IN EFI_CPU_INIT_TYPE InitType
+ );
+
+EFI_STATUS
+EFIAPI
+WinNtRegisterInterruptHandler (
+ IN EFI_CPU_ARCH_PROTOCOL *This,
+ IN EFI_EXCEPTION_TYPE InterruptType,
+ IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
+ );
+
+EFI_STATUS
+EFIAPI
+WinNtGetTimerValue (
+ IN EFI_CPU_ARCH_PROTOCOL *This,
+ IN UINT32 TimerIndex,
+ OUT UINT64 *TimerValue,
+ OUT UINT64 *TimerPeriod OPTIONAL
+ );
+
+EFI_STATUS
+EFIAPI
+WinNtSetMemoryAttributes (
+ IN EFI_CPU_ARCH_PROTOCOL *This,
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,
+ IN UINT64 Length,
+ IN UINT64 Attributes
+ );
+
+
+
+
+
+
#endif
diff --git a/Nt32Pkg/CpuRuntimeDxe/CpuIo.c b/Nt32Pkg/CpuRuntimeDxe/CpuIo.c
deleted file mode 100644
index 4aaa431d5..000000000
--- a/Nt32Pkg/CpuRuntimeDxe/CpuIo.c
+++ /dev/null
@@ -1,335 +0,0 @@
-/*++
-
-Copyright (c) 2006, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-Module Name:
-
- CpuIo.c
-
-Abstract:
-
- This is the code that publishes the CPU I/O Protocol.
- The intent herein is to have a single I/O service that can load
- as early as possible, extend into runtime, and be layered upon by
- the implementations of architectural protocols and the PCI Root
- Bridge I/O Protocol.
-
---*/
-
-#include <CpuDriver.h>
-
-#define IA32_MAX_IO_ADDRESS 0xFFFF
-#define IA32_MAX_MEM_ADDRESS 0xFFFFFFFF
-
-EFI_CPU_IO_PROTOCOL mCpuIoProtocol;
-
-EFI_STATUS
-CpuIoCheckAddressRange (
- IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN VOID *Buffer,
- IN UINT64 Limit
- );
-
-EFI_STATUS
-EFIAPI
-CpuMemoryServiceRead (
- IN EFI_CPU_IO_PROTOCOL *This,
- IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-/*++
-
-Routine Description:
-
- Perform the Memory Access Read service for the CPU I/O Protocol
-
-Arguments:
-
- Pointer to an instance of the CPU I/O Protocol
- Width of the Memory Access
- Address of the Memory access
- Count of the number of accesses to perform
- Pointer to the buffer to read or write from memory
-
-Returns:
-
- Status
-
- EFI_SUCCESS - The data was read from or written to the EFI
- System.
- EFI_INVALID_PARAMETER - Width is invalid for this EFI System.
- EFI_INVALID_PARAMETER - Buffer is NULL.
- EFI_UNSUPPORTED - The Buffer is not aligned for the given Width.
- EFI_UNSUPPORTED - The address range specified by Address, Width,
- and Count is not valid for this EFI System.
-
---*/
-// TODO: This - add argument and description to function comment
-{
- EFI_STATUS Status;
-
- if (!Buffer) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = CpuIoCheckAddressRange (Width, Address, Count, Buffer, IA32_MAX_MEM_ADDRESS);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Do nothing for Nt32 version
- //
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-CpuMemoryServiceWrite (
- IN EFI_CPU_IO_PROTOCOL *This,
- IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-/*++
-
-Routine Description:
-
- Perform the Memory Access Read service for the CPU I/O Protocol
-
-Arguments:
-
- Pointer to an instance of the CPU I/O Protocol
- Width of the Memory Access
- Address of the Memory access
- Count of the number of accesses to perform
- Pointer to the buffer to read or write from memory
-
-Returns:
-
- Status
-
- EFI_SUCCESS - The data was read from or written to the EFI System.
- EFI_INVALID_PARAMETER - Width is invalid for this EFI System.
- EFI_INVALID_PARAMETER - Buffer is NULL.
- EFI_UNSUPPORTED - The Buffer is not aligned for the given Width.
- EFI_UNSUPPORTED - The address range specified by Address, Width, and
- Count is not valid for this EFI System.
-
---*/
-// TODO: This - add argument and description to function comment
-{
- EFI_STATUS Status;
-
- if (!Buffer) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = CpuIoCheckAddressRange (Width, Address, Count, Buffer, IA32_MAX_MEM_ADDRESS);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Do nothing for Nt32 version
- //
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-CpuIoServiceRead (
- IN EFI_CPU_IO_PROTOCOL *This,
- IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
- IN UINT64 UserAddress,
- IN UINTN Count,
- IN OUT VOID *UserBuffer
- )
-/*++
-
-Routine Description:
-
- This is the service that implements the I/O read
-
-Arguments:
-
- Pointer to an instance of the CPU I/O Protocol
- Width of the Memory Access
- Address of the I/O access
- Count of the number of accesses to perform
- Pointer to the buffer to read or write from I/O space
-
-Returns:
-
- Status
- EFI_SUCCESS - The data was read from or written to the EFI System.
- EFI_INVALID_PARAMETER - Width is invalid for this EFI System.
- EFI_INVALID_PARAMETER - Buffer is NULL.
- EFI_UNSUPPORTED - The Buffer is not aligned for the given Width.
- EFI_UNSUPPORTED - The address range specified by Address, Width, and
- Count is not valid for this EFI System.
---*/
-// TODO: This - add argument and description to function comment
-// TODO: UserAddress - add argument and description to function comment
-// TODO: UserBuffer - add argument and description to function comment
-{
- UINTN Address;
- EFI_STATUS Status;
-
- if (!UserBuffer) {
- return EFI_INVALID_PARAMETER;
- }
-
- Address = (UINTN) UserAddress;
-
- if (Width >= EfiCpuIoWidthMaximum) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = CpuIoCheckAddressRange (Width, Address, Count, UserBuffer, IA32_MAX_IO_ADDRESS);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Do nothing for Nt32 version
- //
- return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-CpuIoServiceWrite (
- IN EFI_CPU_IO_PROTOCOL *This,
- IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
- IN UINT64 UserAddress,
- IN UINTN Count,
- IN OUT VOID *UserBuffer
- )
-/*++
-
-Routine Description:
-
-
- This is the service that implements the I/O Write
-
-Arguments:
-
- Pointer to an instance of the CPU I/O Protocol
- Width of the Memory Access
- Address of the I/O access
- Count of the number of accesses to perform
- Pointer to the buffer to read or write from I/O space
-
-Returns:
-
- Status
-
- Status
- EFI_SUCCESS - The data was read from or written to the EFI System.
- EFI_INVALID_PARAMETER - Width is invalid for this EFI System.
- EFI_INVALID_PARAMETER - Buffer is NULL.
- EFI_UNSUPPORTED - The Buffer is not aligned for the given Width.
- EFI_UNSUPPORTED - The address range specified by Address, Width, and
- Count is not valid for this EFI System.
-
---*/
-// TODO: This - add argument and description to function comment
-// TODO: UserAddress - add argument and description to function comment
-// TODO: UserBuffer - add argument and description to function comment
-{
- UINTN Address;
- EFI_STATUS Status;
-
- if (!UserBuffer) {
- return EFI_INVALID_PARAMETER;
- }
-
- Address = (UINTN) UserAddress;
-
- if (Width >= EfiCpuIoWidthMaximum) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = CpuIoCheckAddressRange (Width, Address, Count, UserBuffer, IA32_MAX_IO_ADDRESS);
- if (EFI_ERROR (Status)) {
- return Status;
- }
-
- //
- // Do nothing for Nt32 version
- //
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-CpuIoCheckAddressRange (
- IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN VOID *Buffer,
- IN UINT64 Limit
- )
-/*++
-
-Routine Description:
-
- TODO: Add function description
-
-Arguments:
-
- Width - TODO: add argument description
- Address - TODO: add argument description
- Count - TODO: add argument description
- Buffer - TODO: add argument description
- Limit - TODO: add argument description
-
-Returns:
-
- EFI_UNSUPPORTED - TODO: Add description for return value
- EFI_UNSUPPORTED - TODO: Add description for return value
- EFI_UNSUPPORTED - TODO: Add description for return value
- EFI_SUCCESS - TODO: Add description for return value
-
---*/
-{
- UINTN AlignMask;
-
- if (Address > Limit) {
- return EFI_UNSUPPORTED;
- }
-
- //
- // For FiFo type, the target address won't increase during the access, so treat count as 1
- //
- if (Width >= EfiCpuIoWidthFifoUint8 && Width <= EfiCpuIoWidthFifoUint64) {
- Count = 1;
- }
-
- Width = Width & 0x03;
- if (Address - 1 + (1 << Width) * Count > Limit) {
- return EFI_UNSUPPORTED;
- }
-
- AlignMask = (1 << Width) - 1;
- if ((UINTN) Buffer & AlignMask) {
- return EFI_UNSUPPORTED;
- }
-
- return EFI_SUCCESS;
-}
-
-
diff --git a/Nt32Pkg/CpuRuntimeDxe/CpuRuntimeDxe.inf b/Nt32Pkg/CpuRuntimeDxe/CpuRuntimeDxe.inf
index dedc893bd..de8f93bf2 100644
--- a/Nt32Pkg/CpuRuntimeDxe/CpuRuntimeDxe.inf
+++ b/Nt32Pkg/CpuRuntimeDxe/CpuRuntimeDxe.inf
@@ -50,8 +50,6 @@
DebugLib
[Guids]
- gEfiWinNtCPUSpeedGuid # SOMETIMES_CONSUMED
- gEfiWinNtCPUModelGuid # SOMETIMES_CONSUMED
gEfiProcessorSubClassGuid # SOMETIMES_CONSUMED
gEfiProcessorProducerGuid # SOMETIMES_CONSUMED
@@ -63,5 +61,9 @@
gEfiCpuIoProtocolGuid # PROTOCOL ALWAYS_PRODUCED
gEfiCpuArchProtocolGuid # PROTOCOL ALWAYS_PRODUCED
+[PcdsDynamic.common]
+ PcdWinNtCpuSpeed|gEfiNt32PkgTokenSpaceGuid
+ PcdWinNtCpuModel|gEfiNt32PkgTokenSpaceGuid
+
[Depex]
gEfiDataHubProtocolGuid AND gEfiHiiProtocolGuid