singrdk/base/Kernel/Singularity.Hal.Common/HalMemorySrat.cs

95 lines
3.2 KiB
C#

///////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// Note:
//
//
// Caution:
//
using Microsoft.Singularity.Hal.Acpi;
namespace Microsoft.Singularity.Hal
{
using System;
using System.Diagnostics;
using Microsoft.Singularity.Io;
[CLSCompliant(false)]
internal class HalMemorySrat : HalMemory
{
// See ProcessorAffinity and MemoryAffinity in the HalMemory.cs
private static ProcessorAffinity[] processors;
private static MemoryAffinity[] memories;
private static bool disabled;
private Srat srat;
internal HalMemorySrat(Srat srat)
{
this.srat = srat;
if (srat == null) {
processors = null;
memories = null;
disabled = true;
}
else {
processors = new
ProcessorAffinity[srat.GetNumberOfProcessors()];
memories = new
MemoryAffinity [srat.GetNumberOfMemories()];
for (int i = 0; i < processors.Length; i++) {
processors[i].domain = srat.GetProcessorDomain(i);
processors[i].apicId = srat.GetProcessorApicId(i);
processors[i].flagIgnore = srat.GetProcessorFlagIgnore(i);
}
// Some memory addresses may be outside what is addressable by a UIntPtr
// (e.g. an IX with 32-bit addressing on a machine with more than 4 GB
// of real memory). If this happens, disable the feature.
//
// TODO: Someone needs to extend this feature to cover that case.
for (int i = 0; i < memories.Length; i++) {
ulong endAddr = srat.GetMemoryEndAddress(i);
if (endAddr > (ulong) UIntPtr.MaxValue) {
DebugStub.WriteLine("Disabling per-processor memory affinity");
memories = null;
processors = null;
disabled = true;
return;
}
memories[i].domain = srat.GetMemoryDomain(i);
memories[i].baseAddress = srat.GetMemoryBaseAddress(i);
memories[i].endAddress = endAddr;
memories[i].memorySize = srat.GetMemorySize(i);
memories[i].flagIgnore = srat.GetMemoryFlagIgnore(i);
memories[i].flagHotPluggable =
srat.GetMemoryFlagHotPluggable(i);
memories[i].flagNonVolatile =
srat.GetMemoryFlagNonVolatile(i);
}
}
}
public override ProcessorAffinity[] GetProcessorAffinity()
{
return processors;
}
public override MemoryAffinity[] GetMemoryAffinity()
{
return memories;
}
public override bool PerProcessorAddressSpaceDisabled()
{
return disabled;
}
}
}