]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiCpuPkg/AcpiCpuData.h: Support >4GB MMIO address
authorJeff Fan <jeff.fan@intel.com>
Thu, 23 Mar 2017 05:19:49 +0000 (13:19 +0800)
committerJeff Fan <jeff.fan@intel.com>
Mon, 27 Mar 2017 08:18:04 +0000 (16:18 +0800)
The current CPU_REGISTER_TABLE_ENTRY structure only defined UINT32 Index to
indicate MSR/MMIO address. It's ok for MSR because MSR address is UINT32 type
actually. But for MMIO address, UINT32 limits MMIO address exceeds 4GB.

This update on CPU_REGISTER_TABLE_ENTRY is to add additional UINT32 field
HighIndex to indicate the high 32bit MMIO address and original Index still
indicate the low 32bit MMIO address.

This update makes use of original padding space between ValidBitLength and
Value to add HighIndex.

Cc: Feng Tian <feng.tian@intel.com>
Cc: Michael Kinney <michael.d.kinney@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeff Fan <jeff.fan@intel.com>
Reviewed-by: Feng Tian <feng.tian@intel.com>
UefiCpuPkg/Include/AcpiCpuData.h
UefiCpuPkg/Library/RegisterCpuFeaturesLib/CpuFeaturesInitialize.c
UefiCpuPkg/Library/RegisterCpuFeaturesLib/RegisterCpuFeaturesLib.c
UefiCpuPkg/PiSmmCpuDxeSmm/CpuS3.c

index 130eb908953da05a5285cc5f8a958b1c354fb04a..ec092074cea52a09fbde16e066b3d2065dfc15e5 100644 (file)
@@ -29,11 +29,13 @@ typedef enum {
 // Element of register table entry\r
 //\r
 typedef struct {\r
-  REGISTER_TYPE  RegisterType;\r
-  UINT32         Index;\r
-  UINT8          ValidBitStart;\r
-  UINT8          ValidBitLength;\r
-  UINT64         Value;\r
+  REGISTER_TYPE  RegisterType;          // offset 0 - 3\r
+  UINT32         Index;                 // offset 4 - 7\r
+  UINT8          ValidBitStart;         // offset 8\r
+  UINT8          ValidBitLength;        // offset 9\r
+  UINT16         Reserved;              // offset 10 - 11\r
+  UINT32         HighIndex;             // offset 12-15, only valid for MemoryMapped\r
+  UINT64         Value;                 // offset 16-23\r
 } CPU_REGISTER_TABLE_ENTRY;\r
 \r
 //\r
index d879591ce0d833bb07d75276d5ccaf9bc2f9fe04..34e6c6bd5868e227deb34b34ee67d1d08b6b0fb2 100644 (file)
@@ -370,9 +370,9 @@ DumpRegisterTableOnProcessor (
     case MemoryMapped:
       DEBUG ((
         DebugPrintErrorLevel,
-        "Processor: %d:  MMIO: %x, Bit Start: %d, Bit Length: %d, Value: %lx\r\n",
+        "Processor: %d:  MMIO: %lx, Bit Start: %d, Bit Length: %d, Value: %lx\r\n",
         ProcessorNumber,
-        RegisterTableEntry->Index,
+        RegisterTableEntry->Index | LShiftU64 (RegisterTableEntry->HighIndex, 32),
         RegisterTableEntry->ValidBitStart,
         RegisterTableEntry->ValidBitLength,
         RegisterTableEntry->Value
@@ -628,7 +628,7 @@ ProgramProcessorRegister (
     case MemoryMapped:
       AcquireSpinLock (&CpuFeaturesData->MemoryMappedLock);
       MmioBitFieldWrite32 (
-        RegisterTableEntry->Index,
+        (UINTN)(RegisterTableEntry->Index | LShiftU64 (RegisterTableEntry->HighIndex, 32)),
         RegisterTableEntry->ValidBitStart,
         RegisterTableEntry->ValidBitStart + RegisterTableEntry->ValidBitLength - 1,
         (UINT32)RegisterTableEntry->Value
index 32189cbc79c954ce7d6675ddf79c6a33e83ddc5e..3fec2e6ca30230b99e5a1a139c64fad0f054f392 100644 (file)
@@ -551,6 +551,7 @@ CpuRegisterTableWriteWorker (
   RegisterTableEntry = (CPU_REGISTER_TABLE_ENTRY *) (UINTN) RegisterTable->RegisterTableEntry;
   RegisterTableEntry[RegisterTable->TableLength].RegisterType   = RegisterType;
   RegisterTableEntry[RegisterTable->TableLength].Index          = (UINT32) Index;
+  RegisterTableEntry[RegisterTable->TableLength].HighIndex      = (UINT32) RShiftU64 (Index, 32);
   RegisterTableEntry[RegisterTable->TableLength].ValidBitStart  = ValidBitStart;
   RegisterTableEntry[RegisterTable->TableLength].ValidBitLength = ValidBitLength;
   RegisterTableEntry[RegisterTable->TableLength].Value          = Value;
index c3280b88793290a7b28c72dd53ae09f532d9a9a3..940450149810d3dbebea356f8eab31d5ceb8422e 100644 (file)
@@ -315,7 +315,7 @@ SetProcessorRegister (
     case MemoryMapped:\r
       AcquireSpinLock (mMemoryMappedLock);\r
       MmioBitFieldWrite32 (\r
-        RegisterTableEntry->Index,\r
+        (UINTN)(RegisterTableEntry->Index | LShiftU64 (RegisterTableEntry->HighIndex, 32)),\r
         RegisterTableEntry->ValidBitStart,\r
         RegisterTableEntry->ValidBitStart + RegisterTableEntry->ValidBitLength - 1,\r
         (UINT32)RegisterTableEntry->Value\r