/////////////////////////////////////////////////////////////////////////////// // // Microsoft Research Singularity // // Copyright (c) Microsoft Corporation. All rights reserved. // // File: PmTimer.cs // // Note: // Power management timer namespace Microsoft.Singularity.Hal.Acpi { using System; using System.Runtime.CompilerServices; using Microsoft.Singularity.Io; [ CLSCompliant(false) ] public sealed class PMTimer { public const uint FrequencyHz = 3579545; IoPort io; IoMemory mem; int width; private PMTimer(uint offset, int width) { if (offset < 0xffffu) { this.io = new IoPort((ushort) offset, 4, Access.Read); } else { this.mem = IoMemory.MapPhysicalMemory(new UIntPtr(offset), 4, true, false); } this.width = width; } /// Get the width of the timer in bits (24 or 32). public int Width { get { return width; } } /// Get the current timer value. public uint Value { [NoHeapAllocation] get { uint value; if (io != null) { IoResult result = io.Read32NoThrow(0, out value); DebugStub.Assert(IoResult.Success == result); } else { IoResult result = mem.Read32NoThrow(0, out value); DebugStub.Assert(IoResult.Success == result); } return value; } } public static PMTimer Create(Fadt fadt) { if ((fadt.Flags & (uint) FadtFlags.TMR_VAL_EXT) == 0) { return new PMTimer(fadt.PM_TMR_BLK, 24); } return new PMTimer(fadt.PM_TMR_BLK, 32); } } }