singrdk/base/Applications/Runtime/Full/Singularity/Processor.cs

130 lines
3.9 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// Note:
//
namespace Microsoft.Singularity
{
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using System.Threading;
using Microsoft.Singularity.V1.Services;
using Microsoft.Singularity.V1.Threads;
using Microsoft.Singularity.Isal;
[CLSCompliant(false)]
[NoCCtor]
[AccessedByRuntime("referenced in Processor.cpp")]
public class Processor
{
public static long CyclesPerSecond
{
[NoHeapAllocation]
get { return ProcessService.GetCyclesPerSecond(); }
}
public static ulong CycleCount
{
get { return GetCycleCount(); }
}
public static ulong GetCycleCount()
{
return Isa.GetCycleCount();
}
public static void WriteMsr(uint offset,ulong value)
{
Isa.WriteMsr(offset, value);
}
public static ulong ReadMsr(uint offset)
{
return Isa.ReadMsr(offset);
}
public static bool AtKernelPrivilege()
{
return !Isa.IsInUserMode();
}
public static void ReadCpuid(uint feature,
out uint v0, out uint v1, out uint v2, out uint v3)
{
Isa.ReadCpuid(feature, out v0, out v1, out v2, out v3);
}
public static ulong ReadPmc(uint offset)
{
return Isa.ReadPmc(offset);
}
[NoHeapAllocation]
[AccessedByRuntime("output to header : called by c code")]
internal static unsafe ThreadContext * GetCurrentThreadContext()
{
unsafe {
return (ThreadContext *) Isa.GetCurrentThread();
}
}
[NoHeapAllocation]
[AccessedByRuntime("output to header : called by c code")]
internal static unsafe ProcessorContext * GetCurrentProcessorContext()
{
unsafe {
return (ProcessorContext *) Isa.GetCurrentCpu();
}
}
[NoHeapAllocation]
internal static Thread GetCurrentThread()
{
unsafe {
return GetCurrentThreadContext()->thread;
}
}
//////////////////////////////////////////////////////////////////////
//
// These methods are currently marked external because they are used
// by device drivers. We need a tool to verify that device drivers
// are in fact using them correctly!
//
[NoHeapAllocation]
[AccessedByRuntime("referenced from c++")]
public static bool DisableLocalPreemption()
{
// BUGBUG: this is a placeholder until the new scheduler work
// gets implemented, and we'll be able to control the local scheduling
// The current usage in SIPs seem only to rely on disabling preemption for
// performance reasons, not for corectness.
// return PlatformService.DisableInterrupts();
return false;
}
[NoHeapAllocation]
[AccessedByRuntime("referenced from c++")]
public static void RestoreLocalPreemption(bool enabled)
{
// Same as above, use the interrupts disabled temporary, until the scheduller
// changes with a SIP hierarcy get integrated.
// The current usage in SIPs seem only to rely on disabling preemption for
// performance reasons, not for corectness.
// PlatformService.RestoreInterrupts(enabled);
}
}
}