91 lines
3.0 KiB
C#
91 lines
3.0 KiB
C#
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// 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;
|
||
|
}
|
||
|
}
|
||
|
}
|