singrdk/base/Kernel/Singularity/V1/Services/StackService.cs

126 lines
4.1 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity - Singularity ABI
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: StackService.cs
//
// Note:
//
using System;
using System.Runtime.CompilerServices;
using Microsoft.Singularity.Memory;
using Microsoft.Singularity.Isal;
namespace Microsoft.Singularity.V1.Services
{
[AccessedByRuntime("referenced from halstack.asm")]
public struct StackService
{
[ExternalEntryPoint]
public static void WalkStack()
{
Stacks.WalkStack(Isa.GetFramePointer());
}
[ExternalEntryPoint]
[NoHeapAllocation]
[CLSCompliant(false)]
public static unsafe void GetUsageStatisticsImpl(ulong *gets, ulong *returns)
{
GetUsageStatistics(out *gets, out *returns);
}
// The ABI service MemoryUsageInfo provides more comprehensive information
[NoHeapAllocation]
[CLSCompliant(false)]
public static void GetUsageStatistics(out ulong gets, out ulong returns)
{
ulong kernelStackCount = 0;
ulong kernelStackReturnCount = 0;
ulong kernelStackBytes = 0;
ulong kernelStackReturnBytes = 0;
ulong kernelStackReservationLocal = 0;
ulong SIPStackCount = 0;
ulong SIPStackReturnCount = 0;
ulong SIPStackBytes = 0;
ulong SIPStackReturnBytes = 0;
ulong SIPStackReservation = 0;
MemoryManager.GetStackUsage(
out kernelStackCount,
out kernelStackReturnCount,
out kernelStackBytes,
out kernelStackReturnBytes,
out kernelStackReservationLocal,
out SIPStackCount,
out SIPStackReturnCount,
out SIPStackBytes,
out SIPStackReturnBytes,
out SIPStackReservation
);
// Just summary information
gets = kernelStackCount + SIPStackCount;
returns = kernelStackReturnCount + SIPStackReturnCount;
}
[ExternalEntryPoint]
[CLSCompliant(false)]
[NoStackLinkCheckTrans]
public static UIntPtr AllocateStackSegmentAbi(UIntPtr growSize)
{
return Stacks.GetSipStackSegment(growSize);
}
[ExternalEntryPoint]
[CLSCompliant(false)]
[NoStackLinkCheckTrans]
[NoStackOverflowCheck]
public static void FreeStackSegmentAbi()
{
// First, set threadRecord->activeStackLimit to the proper
// value for the previous (now current) stack segment. This
// ensures that subsequent stack checks are done using the
// correct stack segment limit.
Stacks.ActivatePreviousStackSegmentLimit();
Stacks.ReturnSipStackSegment();
}
[CLSCompliant(false)]
[AccessedByRuntime("called from halstack.asm")]
[NoStackLinkCheckTrans]
public static UIntPtr AllocateStackSegment(UIntPtr growSize)
{
return Stacks.GetKernelStackSegment(growSize);
}
[CLSCompliant(false)]
[AccessedByRuntime("called from halstack.asm")]
[NoStackLinkCheckTrans]
[NoStackOverflowCheck]
public static void FreeStackSegment()
{
// First, set threadRecord->activeStackLimit to the proper
// value for the previous (now current) stack segment. This
// ensures that subsequent stack checks are done using the
// correct stack segment limit.
Stacks.ActivatePreviousStackSegmentLimit();
Stacks.ReturnKernelStackSegment();
}
[ExternalEntryPoint]
public static void StackOverflowImpl()
{
//
// This is called when a SIP has a stack overflow so
// that it can fail fast.
//
Stacks.StackOverflowForSIP();
}
}
}