#include "Platform.h"\r
#include "Xen.h"\r
\r
-STATIC UINT32 mXenLeaf = 0;\r
+STATIC UINT32 mXenLeaf = 0;\r
\r
-EFI_XEN_INFO mXenInfo;\r
+EFI_XEN_INFO mXenInfo;\r
\r
//\r
// Location of the firmware info struct setup by hvmloader.\r
// Only the E820 table is used by OVMF.\r
//\r
-EFI_XEN_OVMF_INFO *mXenHvmloaderInfo;\r
-STATIC EFI_E820_ENTRY64 mE820Entries[128];\r
-STATIC UINT32 mE820EntriesCount;\r
+EFI_XEN_OVMF_INFO *mXenHvmloaderInfo;\r
+STATIC EFI_E820_ENTRY64 mE820Entries[128];\r
+STATIC UINT32 mE820EntriesCount;\r
\r
/**\r
Returns E820 map provided by Xen\r
**/\r
EFI_STATUS\r
XenGetE820Map (\r
- EFI_E820_ENTRY64 **Entries,\r
- UINT32 *Count\r
+ EFI_E820_ENTRY64 **Entries,\r
+ UINT32 *Count\r
)\r
{\r
- INTN ReturnCode;\r
- xen_memory_map_t Parameters;\r
- UINTN LoopIndex;\r
- UINTN Index;\r
- EFI_E820_ENTRY64 TmpEntry;\r
+ INTN ReturnCode;\r
+ xen_memory_map_t Parameters;\r
+ UINTN LoopIndex;\r
+ UINTN Index;\r
+ EFI_E820_ENTRY64 TmpEntry;\r
\r
//\r
// Get E820 produced by hvmloader\r
//\r
if (mXenHvmloaderInfo != NULL) {\r
ASSERT (mXenHvmloaderInfo->E820 < MAX_ADDRESS);\r
- *Entries = (EFI_E820_ENTRY64 *)(UINTN) mXenHvmloaderInfo->E820;\r
- *Count = mXenHvmloaderInfo->E820EntriesCount;\r
+ *Entries = (EFI_E820_ENTRY64 *)(UINTN)mXenHvmloaderInfo->E820;\r
+ *Count = mXenHvmloaderInfo->E820EntriesCount;\r
\r
return EFI_SUCCESS;\r
}\r
\r
if (mE820EntriesCount > 0) {\r
*Entries = mE820Entries;\r
- *Count = mE820EntriesCount;\r
+ *Count = mE820EntriesCount;\r
return EFI_SUCCESS;\r
}\r
\r
for (LoopIndex = 1; LoopIndex < mE820EntriesCount; LoopIndex++) {\r
for (Index = LoopIndex; Index < mE820EntriesCount; Index++) {\r
if (mE820Entries[Index - 1].BaseAddr > mE820Entries[Index].BaseAddr) {\r
- TmpEntry = mE820Entries[Index];\r
- mE820Entries[Index] = mE820Entries[Index - 1];\r
+ TmpEntry = mE820Entries[Index];\r
+ mE820Entries[Index] = mE820Entries[Index - 1];\r
mE820Entries[Index - 1] = TmpEntry;\r
}\r
}\r
}\r
\r
- *Count = mE820EntriesCount;\r
+ *Count = mE820EntriesCount;\r
*Entries = mE820Entries;\r
\r
return EFI_SUCCESS;\r
XenConnect (\r
)\r
{\r
- UINT32 Index;\r
- UINT32 TransferReg;\r
- UINT32 TransferPages;\r
- UINT32 XenVersion;\r
- EFI_XEN_OVMF_INFO *Info;\r
- CHAR8 Sig[sizeof (Info->Signature) + 1];\r
- UINT32 *PVHResetVectorData;\r
- RETURN_STATUS Status;\r
+ UINT32 Index;\r
+ UINT32 TransferReg;\r
+ UINT32 TransferPages;\r
+ UINT32 XenVersion;\r
+ EFI_XEN_OVMF_INFO *Info;\r
+ CHAR8 Sig[sizeof (Info->Signature) + 1];\r
+ UINT32 *PVHResetVectorData;\r
+ RETURN_STATUS Status;\r
\r
ASSERT (mXenLeaf != 0);\r
\r
}\r
\r
for (Index = 0; Index < TransferPages; Index++) {\r
- AsmWriteMsr64 (TransferReg,\r
- (UINTN) mXenInfo.HyperPages +\r
- (Index << EFI_PAGE_SHIFT) + Index);\r
+ AsmWriteMsr64 (\r
+ TransferReg,\r
+ (UINTN)mXenInfo.HyperPages +\r
+ (Index << EFI_PAGE_SHIFT) + Index\r
+ );\r
}\r
\r
//\r
//\r
\r
AsmCpuid (mXenLeaf + 1, &XenVersion, NULL, NULL, NULL);\r
- DEBUG ((DEBUG_ERROR, "Detected Xen version %d.%d\n",\r
- XenVersion >> 16, XenVersion & 0xFFFF));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "Detected Xen version %d.%d\n",\r
+ XenVersion >> 16,\r
+ XenVersion & 0xFFFF\r
+ ));\r
mXenInfo.VersionMajor = (UINT16)(XenVersion >> 16);\r
mXenInfo.VersionMinor = (UINT16)(XenVersion & 0xFFFF);\r
\r
// Check if there are information left by hvmloader\r
//\r
\r
- Info = (EFI_XEN_OVMF_INFO *)(UINTN) OVMF_INFO_PHYSICAL_ADDRESS;\r
+ Info = (EFI_XEN_OVMF_INFO *)(UINTN)OVMF_INFO_PHYSICAL_ADDRESS;\r
//\r
// Copy the signature, and make it null-terminated.\r
//\r
- AsciiStrnCpyS (Sig, sizeof (Sig), (CHAR8 *) &Info->Signature,\r
- sizeof (Info->Signature));\r
+ AsciiStrnCpyS (\r
+ Sig,\r
+ sizeof (Sig),\r
+ (CHAR8 *)&Info->Signature,\r
+ sizeof (Info->Signature)\r
+ );\r
if (AsciiStrCmp (Sig, "XenHVMOVMF") == 0) {\r
mXenHvmloaderInfo = Info;\r
} else {\r
// booted via the PVH entry point.\r
//\r
\r
- PVHResetVectorData = (VOID *)(UINTN) PcdGet32 (PcdXenPvhStartOfDayStructPtr);\r
+ PVHResetVectorData = (VOID *)(UINTN)PcdGet32 (PcdXenPvhStartOfDayStructPtr);\r
//\r
// That magic value is written in XenResetVector/Ia32/XenPVHMain.asm\r
//\r
if (PVHResetVectorData[1] == SIGNATURE_32 ('X', 'P', 'V', 'H')) {\r
- struct hvm_start_info *HVMStartInfo;\r
+ struct hvm_start_info *HVMStartInfo;\r
\r
- HVMStartInfo = (VOID *)(UINTN) PVHResetVectorData[0];\r
+ HVMStartInfo = (VOID *)(UINTN)PVHResetVectorData[0];\r
if (HVMStartInfo->magic == XEN_HVM_START_MAGIC_VALUE) {\r
ASSERT (HVMStartInfo->rsdp_paddr != 0);\r
if (HVMStartInfo->rsdp_paddr != 0) {\r
BuildGuidDataHob (\r
&gEfiXenInfoGuid,\r
&mXenInfo,\r
- sizeof(mXenInfo)\r
+ sizeof (mXenInfo)\r
);\r
\r
//\r
VOID\r
)\r
{\r
- UINT8 Signature[13];\r
+ UINT8 Signature[13];\r
\r
if (mXenLeaf != 0) {\r
return TRUE;\r
\r
Signature[12] = '\0';\r
for (mXenLeaf = 0x40000000; mXenLeaf < 0x40010000; mXenLeaf += 0x100) {\r
- AsmCpuid (mXenLeaf,\r
- NULL,\r
- (UINT32 *) &Signature[0],\r
- (UINT32 *) &Signature[4],\r
- (UINT32 *) &Signature[8]);\r
-\r
- if (!AsciiStrCmp ((CHAR8 *) Signature, "XenVMMXenVMM")) {\r
+ AsmCpuid (\r
+ mXenLeaf,\r
+ NULL,\r
+ (UINT32 *)&Signature[0],\r
+ (UINT32 *)&Signature[4],\r
+ (UINT32 *)&Signature[8]\r
+ );\r
+\r
+ if (!AsciiStrCmp ((CHAR8 *)Signature, "XenVMMXenVMM")) {\r
return TRUE;\r
}\r
}\r
VOID\r
)\r
{\r
- EFI_E820_ENTRY64 *E820Map;\r
- UINT32 E820EntriesCount;\r
- EFI_STATUS Status;\r
- EFI_E820_ENTRY64 *Entry;\r
- UINTN Index;\r
- UINT64 LapicBase;\r
- UINT64 LapicEnd;\r
-\r
+ EFI_E820_ENTRY64 *E820Map;\r
+ UINT32 E820EntriesCount;\r
+ EFI_STATUS Status;\r
+ EFI_E820_ENTRY64 *Entry;\r
+ UINTN Index;\r
+ UINT64 LapicBase;\r
+ UINT64 LapicEnd;\r
\r
DEBUG ((DEBUG_INFO, "Using memory map provided by Xen\n"));\r
\r
// Parse RAM in E820 map\r
//\r
E820EntriesCount = 0;\r
- Status = XenGetE820Map (&E820Map, &E820EntriesCount);\r
+ Status = XenGetE820Map (&E820Map, &E820EntriesCount);\r
ASSERT_EFI_ERROR (Status);\r
\r
AddMemoryBaseSizeHob (0, 0xA0000);\r
AddReservedMemoryBaseSizeHob (0xA0000, BASE_1MB - 0xA0000, TRUE);\r
\r
LapicBase = PcdGet32 (PcdCpuLocalApicBaseAddress);\r
- LapicEnd = LapicBase + SIZE_1MB;\r
+ LapicEnd = LapicBase + SIZE_1MB;\r
AddIoMemoryRangeHob (LapicBase, LapicEnd);\r
\r
for (Index = 0; Index < E820EntriesCount; Index++) {\r
- UINT64 Base;\r
- UINT64 End;\r
- UINT64 ReservedBase;\r
- UINT64 ReservedEnd;\r
+ UINT64 Base;\r
+ UINT64 End;\r
+ UINT64 ReservedBase;\r
+ UINT64 ReservedEnd;\r
\r
Entry = &E820Map[Index];\r
\r
// Round up the start address, and round down the end address.\r
//\r
Base = ALIGN_VALUE (Entry->BaseAddr, (UINT64)EFI_PAGE_SIZE);\r
- End = (Entry->BaseAddr + Entry->Length) & ~(UINT64)EFI_PAGE_MASK;\r
+ End = (Entry->BaseAddr + Entry->Length) & ~(UINT64)EFI_PAGE_MASK;\r
\r
//\r
// Ignore the first 1MB, this is handled before the loop.\r
if (Base < BASE_1MB) {\r
Base = BASE_1MB;\r
}\r
+\r
if (Base >= End) {\r
continue;\r
}\r
\r
switch (Entry->Type) {\r
- case EfiAcpiAddressRangeMemory:\r
- AddMemoryRangeHob (Base, End);\r
- break;\r
- case EfiAcpiAddressRangeACPI:\r
- AddReservedMemoryRangeHob (Base, End, FALSE);\r
- break;\r
- case EfiAcpiAddressRangeReserved:\r
- //\r
- // hvmloader marks a range that overlaps with the local APIC memory\r
- // mapped region as reserved, but CpuDxe wants it as mapped IO. We\r
- // have already added it as mapped IO, so skip it here.\r
- //\r
-\r
- //\r
- // add LAPIC predecessor range, if any\r
- //\r
- ReservedBase = Base;\r
- ReservedEnd = MIN (End, LapicBase);\r
- if (ReservedBase < ReservedEnd) {\r
- AddReservedMemoryRangeHob (ReservedBase, ReservedEnd, FALSE);\r
- }\r
-\r
- //\r
- // add LAPIC successor range, if any\r
- //\r
- ReservedBase = MAX (Base, LapicEnd);\r
- ReservedEnd = End;\r
- if (ReservedBase < ReservedEnd) {\r
- AddReservedMemoryRangeHob (ReservedBase, ReservedEnd, FALSE);\r
- }\r
- break;\r
- default:\r
- break;\r
+ case EfiAcpiAddressRangeMemory:\r
+ AddMemoryRangeHob (Base, End);\r
+ break;\r
+ case EfiAcpiAddressRangeACPI:\r
+ AddReservedMemoryRangeHob (Base, End, FALSE);\r
+ break;\r
+ case EfiAcpiAddressRangeReserved:\r
+ //\r
+ // hvmloader marks a range that overlaps with the local APIC memory\r
+ // mapped region as reserved, but CpuDxe wants it as mapped IO. We\r
+ // have already added it as mapped IO, so skip it here.\r
+ //\r
+\r
+ //\r
+ // add LAPIC predecessor range, if any\r
+ //\r
+ ReservedBase = Base;\r
+ ReservedEnd = MIN (End, LapicBase);\r
+ if (ReservedBase < ReservedEnd) {\r
+ AddReservedMemoryRangeHob (ReservedBase, ReservedEnd, FALSE);\r
+ }\r
+\r
+ //\r
+ // add LAPIC successor range, if any\r
+ //\r
+ ReservedBase = MAX (Base, LapicEnd);\r
+ ReservedEnd = End;\r
+ if (ReservedBase < ReservedEnd) {\r
+ AddReservedMemoryRangeHob (ReservedBase, ReservedEnd, FALSE);\r
+ }\r
+\r
+ break;\r
+ default:\r
+ break;\r
}\r
}\r
}\r
\r
-\r
-/**\r
- Perform Xen PEI initialization.\r
-\r
- @return EFI_SUCCESS Xen initialized successfully\r
- @return EFI_NOT_FOUND Not running under Xen\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeXen (\r
- VOID\r
- )\r
-{\r
- RETURN_STATUS PcdStatus;\r
-\r
- PcdStatus = PcdSetBoolS (PcdPciDisableBusEnumeration, TRUE);\r
- ASSERT_RETURN_ERROR (PcdStatus);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
EFI_STATUS\r
PhysicalAddressIdentityMapping (\r
- IN EFI_PHYSICAL_ADDRESS AddressToMap\r
+ IN EFI_PHYSICAL_ADDRESS AddressToMap\r
)\r
{\r
INTN Index;\r
\r
// L4 / Top level Page Directory Pointers\r
\r
- L4 = (VOID*)(UINTN)PcdGet32 (PcdOvmfSecPageTablesBase);\r
+ L4 = (VOID *)(UINTN)PcdGet32 (PcdOvmfSecPageTablesBase);\r
Index = PML4_OFFSET (AddressToMap);\r
\r
if (!L4[Index].Bits.Present) {\r
\r
ZeroMem (L3, EFI_PAGE_SIZE);\r
\r
- L4[Index].Bits.ReadWrite = 1;\r
- L4[Index].Bits.Accessed = 1;\r
+ L4[Index].Bits.ReadWrite = 1;\r
+ L4[Index].Bits.Accessed = 1;\r
L4[Index].Bits.PageTableBaseAddress = (EFI_PHYSICAL_ADDRESS)L3 >> 12;\r
- L4[Index].Bits.Present = 1;\r
+ L4[Index].Bits.Present = 1;\r
}\r
\r
// L3 / Next level Page Directory Pointers\r
\r
- L3 = (VOID*)(EFI_PHYSICAL_ADDRESS)(L4[Index].Bits.PageTableBaseAddress << 12);\r
+ L3 = (VOID *)(EFI_PHYSICAL_ADDRESS)(L4[Index].Bits.PageTableBaseAddress << 12);\r
Index = PDP_OFFSET (AddressToMap);\r
\r
if (!L3[Index].Bits.Present) {\r
\r
ZeroMem (PageTable, EFI_PAGE_SIZE);\r
\r
- L3[Index].Bits.ReadWrite = 1;\r
- L3[Index].Bits.Accessed = 1;\r
+ L3[Index].Bits.ReadWrite = 1;\r
+ L3[Index].Bits.Accessed = 1;\r
L3[Index].Bits.PageTableBaseAddress = (EFI_PHYSICAL_ADDRESS)PageTable >> 12;\r
- L3[Index].Bits.Present = 1;\r
+ L3[Index].Bits.Present = 1;\r
}\r
\r
// L2 / Page Table Entries\r
\r
- PageTable = (VOID*)(EFI_PHYSICAL_ADDRESS)(L3[Index].Bits.PageTableBaseAddress << 12);\r
- Index = PDE_OFFSET (AddressToMap);\r
+ PageTable = (VOID *)(EFI_PHYSICAL_ADDRESS)(L3[Index].Bits.PageTableBaseAddress << 12);\r
+ Index = PDE_OFFSET (AddressToMap);\r
\r
if (!PageTable[Index].Bits.Present) {\r
- PageTable[Index].Bits.ReadWrite = 1;\r
- PageTable[Index].Bits.Accessed = 1;\r
- PageTable[Index].Bits.Dirty = 1;\r
- PageTable[Index].Bits.MustBe1 = 1;\r
+ PageTable[Index].Bits.ReadWrite = 1;\r
+ PageTable[Index].Bits.Accessed = 1;\r
+ PageTable[Index].Bits.Dirty = 1;\r
+ PageTable[Index].Bits.MustBe1 = 1;\r
PageTable[Index].Bits.PageTableBaseAddress = AddressToMap >> 21;\r
- PageTable[Index].Bits.Present = 1;\r
+ PageTable[Index].Bits.Present = 1;\r
}\r
\r
CpuFlushTlb ();\r
STATIC\r
EFI_STATUS\r
MapSharedInfoPage (\r
- IN VOID *PagePtr\r
+ IN VOID *PagePtr\r
)\r
{\r
xen_add_to_physmap_t Parameters;\r
\r
Parameters.domid = DOMID_SELF;\r
Parameters.space = XENMAPSPACE_shared_info;\r
- Parameters.idx = 0;\r
- Parameters.gpfn = (UINTN)PagePtr >> EFI_PAGE_SHIFT;\r
- ReturnCode = XenHypercallMemoryOp (XENMEM_add_to_physmap, &Parameters);\r
+ Parameters.idx = 0;\r
+ Parameters.gpfn = (UINTN)PagePtr >> EFI_PAGE_SHIFT;\r
+ ReturnCode = XenHypercallMemoryOp (XENMEM_add_to_physmap, &Parameters);\r
if (ReturnCode != 0) {\r
return EFI_NO_MAPPING;\r
}\r
+\r
return EFI_SUCCESS;\r
}\r
\r
STATIC\r
VOID\r
UnmapXenPage (\r
- IN VOID *PagePtr\r
+ IN VOID *PagePtr\r
)\r
{\r
- xen_remove_from_physmap_t Parameters;\r
- INTN ReturnCode;\r
+ xen_remove_from_physmap_t Parameters;\r
+ INTN ReturnCode;\r
\r
Parameters.domid = DOMID_SELF;\r
- Parameters.gpfn = (UINTN)PagePtr >> EFI_PAGE_SHIFT;\r
- ReturnCode = XenHypercallMemoryOp (XENMEM_remove_from_physmap, &Parameters);\r
+ Parameters.gpfn = (UINTN)PagePtr >> EFI_PAGE_SHIFT;\r
+ ReturnCode = XenHypercallMemoryOp (XENMEM_remove_from_physmap, &Parameters);\r
ASSERT (ReturnCode == 0);\r
}\r
\r
-\r
STATIC\r
UINT64\r
GetCpuFreq (\r
- IN XEN_VCPU_TIME_INFO *VcpuTime\r
+ IN XEN_VCPU_TIME_INFO *VcpuTime\r
)\r
{\r
- UINT32 Version;\r
- UINT32 TscToSystemMultiplier;\r
- INT8 TscShift;\r
- UINT64 CpuFreq;\r
+ UINT32 Version;\r
+ UINT32 TscToSystemMultiplier;\r
+ INT8 TscShift;\r
+ UINT64 CpuFreq;\r
\r
do {\r
Version = VcpuTime->Version;\r
MemoryFence ();\r
TscToSystemMultiplier = VcpuTime->TscToSystemMultiplier;\r
- TscShift = VcpuTime->TscShift;\r
+ TscShift = VcpuTime->TscShift;\r
MemoryFence ();\r
} while (((Version & 1) != 0) && (Version != VcpuTime->Version));\r
\r
CpuFreq = DivU64x32 (LShiftU64 (1000000000ULL, 32), TscToSystemMultiplier);\r
if (TscShift >= 0) {\r
- CpuFreq = RShiftU64 (CpuFreq, TscShift);\r
+ CpuFreq = RShiftU64 (CpuFreq, TscShift);\r
} else {\r
- CpuFreq = LShiftU64 (CpuFreq, -TscShift);\r
+ CpuFreq = LShiftU64 (CpuFreq, -TscShift);\r
}\r
+\r
return CpuFreq;\r
}\r
\r
STATIC\r
VOID\r
XenDelay (\r
- IN XEN_VCPU_TIME_INFO *VcpuTimeInfo,\r
- IN UINT64 DelayNs\r
+ IN XEN_VCPU_TIME_INFO *VcpuTimeInfo,\r
+ IN UINT64 DelayNs\r
)\r
{\r
- UINT64 Tick;\r
- UINT64 CpuFreq;\r
- UINT64 Delay;\r
- UINT64 DelayTick;\r
- UINT64 NewTick;\r
- RETURN_STATUS Status;\r
+ UINT64 Tick;\r
+ UINT64 CpuFreq;\r
+ UINT64 Delay;\r
+ UINT64 DelayTick;\r
+ UINT64 NewTick;\r
+ RETURN_STATUS Status;\r
\r
Tick = AsmReadTsc ();\r
\r
CpuFreq = GetCpuFreq (VcpuTimeInfo);\r
- Status = SafeUint64Mult (DelayNs, CpuFreq, &Delay);\r
+ Status = SafeUint64Mult (DelayNs, CpuFreq, &Delay);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR,\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
"XenDelay (%lu ns): delay too big in relation to CPU freq %lu Hz\n",\r
- DelayNs, CpuFreq));\r
+ DelayNs,\r
+ CpuFreq\r
+ ));\r
ASSERT_EFI_ERROR (Status);\r
CpuDeadLoop ();\r
}\r
}\r
}\r
\r
-\r
/**\r
Calculate the frequency of the Local Apic Timer\r
**/\r
VOID\r
)\r
{\r
- XEN_SHARED_INFO *SharedInfo;\r
- XEN_VCPU_TIME_INFO *VcpuTimeInfo;\r
- UINT32 TimerTick, TimerTick2, DiffTimer;\r
- UINT64 TscTick, TscTick2;\r
- UINT64 Freq;\r
- UINT64 Dividend;\r
- EFI_STATUS Status;\r
-\r
-\r
- SharedInfo = (VOID*)((1ULL << mPhysMemAddressWidth) - EFI_PAGE_SIZE);\r
- Status = PhysicalAddressIdentityMapping ((EFI_PHYSICAL_ADDRESS)SharedInfo);\r
+ XEN_SHARED_INFO *SharedInfo;\r
+ XEN_VCPU_TIME_INFO *VcpuTimeInfo;\r
+ UINT32 TimerTick, TimerTick2, DiffTimer;\r
+ UINT64 TscTick, TscTick2;\r
+ UINT64 Freq;\r
+ UINT64 Dividend;\r
+ EFI_STATUS Status;\r
+\r
+ SharedInfo = (VOID *)((UINTN)PcdGet32 (PcdCpuLocalApicBaseAddress) + SIZE_1MB);\r
+ Status = PhysicalAddressIdentityMapping ((EFI_PHYSICAL_ADDRESS)SharedInfo);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR,\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
"Failed to add page table entry for Xen shared info page: %r\n",\r
- Status));\r
+ Status\r
+ ));\r
ASSERT_EFI_ERROR (Status);\r
return;\r
}\r
\r
Status = MapSharedInfoPage (SharedInfo);\r
if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "Failed to map Xen's shared info page: %r\n",\r
- Status));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "Failed to map Xen's shared info page: %r\n",\r
+ Status\r
+ ));\r
ASSERT_EFI_ERROR (Status);\r
return;\r
}\r
DisableApicTimerInterrupt ();\r
\r
TimerTick = GetApicTimerCurrentCount ();\r
- TscTick = AsmReadTsc ();\r
+ TscTick = AsmReadTsc ();\r
XenDelay (VcpuTimeInfo, 1000000ULL);\r
TimerTick2 = GetApicTimerCurrentCount ();\r
- TscTick2 = AsmReadTsc ();\r
-\r
+ TscTick2 = AsmReadTsc ();\r
\r
DiffTimer = TimerTick - TimerTick2;\r
- Status = SafeUint64Mult (GetCpuFreq (VcpuTimeInfo), DiffTimer, &Dividend);\r
+ Status = SafeUint64Mult (GetCpuFreq (VcpuTimeInfo), DiffTimer, &Dividend);\r
if (EFI_ERROR (Status)) {\r
DEBUG ((DEBUG_ERROR, "overflow while calculating APIC frequency\n"));\r
- DEBUG ((DEBUG_ERROR, "CPU freq: %lu Hz; APIC timer tick count for 1 ms: %u\n",\r
- GetCpuFreq (VcpuTimeInfo), DiffTimer));\r
+ DEBUG ((\r
+ DEBUG_ERROR,\r
+ "CPU freq: %lu Hz; APIC timer tick count for 1 ms: %u\n",\r
+ GetCpuFreq (VcpuTimeInfo),\r
+ DiffTimer\r
+ ));\r
ASSERT_EFI_ERROR (Status);\r
CpuDeadLoop ();\r
}\r
Freq = DivU64x64Remainder (Dividend, TscTick2 - TscTick, NULL);\r
DEBUG ((DEBUG_INFO, "APIC Freq % 8lu Hz\n", Freq));\r
\r
+ ASSERT (Freq <= MAX_UINT32);\r
+ Status = PcdSet32S (PcdFSBClock, (UINT32)Freq);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
UnmapXenPage (SharedInfo);\r
}\r