singrdk/base/Kernel/Singularity/PrivilegedGate.cs

91 lines
3.0 KiB
C#
Raw Normal View History

2008-11-17 18:29:00 -05:00
////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: Processor.cs
//
// Note:
//
using System;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
using System.Threading;
using Microsoft.Singularity.Hal;
using Microsoft.Singularity.Io;
using Microsoft.Singularity.Memory;
using Microsoft.Singularity.Scheduling;
using Microsoft.Singularity.V1.Threads;
using Microsoft.Singularity.Isal;
namespace Microsoft.Singularity
{
[CLSCompliant(false)]
[AccessedByRuntime("Method called from HAL.cpp")]
public class PrivilegedGate
{
[NoHeapAllocation]
[AccessedByRuntime("referenced from c++")]
public static bool DisableInterrupts()
{
if ((ProcessPrivileges.GetCurrentPrivileges().AllowedOperations &
ProcessPrivileges.Operations.DisableInterrupts) != 0) {
return Processor.DisableInterrupts();
}
// ISSUE: Assert here until all instances get cleaned up from SIPs
// This assertion should be removed / replaced with something that would
// flag / halt / break only the bogus SIP, not the entire system
VTable.Assert(false, "DisableInterrupts called from unprivileged SIP");
return false;
}
[NoHeapAllocation]
[AccessedByRuntime("referenced from c++")]
public static void RestoreInterrupts(bool enabled)
{
if ((ProcessPrivileges.GetCurrentPrivileges().AllowedOperations &
ProcessPrivileges.Operations.DisableInterrupts) != 0) {
Processor.RestoreInterrupts(enabled);
} else {
// ISSUE: Assert here until all instances get cleaned up from SIPs
// This assertion should be removed / replaced with something that would
// flag / halt / break only the bogus SIP, not the entire system
VTable.Assert(false, "RestoreInterrupts called from unprivileged SIP");
}
}
// Use this method for assertions only!
[NoHeapAllocation]
[AccessedByRuntime("referenced from c++")]
public static bool InterruptsDisabled()
{
if ((ProcessPrivileges.GetCurrentPrivileges().AllowedOperations &
ProcessPrivileges.Operations.DisableInterrupts) != 0) {
return Processor.InterruptsDisabled();
}
// ISSUE: Assert here until all instances get cleaned up from SIPs
// This assertion should be removed / replaced with something that would
// flag / halt / break only the bogus SIP, not the entire system
VTable.Assert(false, "InterruptsDisabled called from unprivileged SIP");
return false;
}
}
}