130 lines
3.9 KiB
C#
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);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|