50 lines
1.8 KiB
C#
50 lines
1.8 KiB
C#
|
//////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Research Singularity
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// ThreadRecord defines the low-level per-thread state maintained by the Isal layer
|
||
|
|
||
|
using System;
|
||
|
using System.Runtime.InteropServices;
|
||
|
using System.Runtime.CompilerServices;
|
||
|
|
||
|
#if ISA_IX
|
||
|
using Microsoft.Singularity.Isal.IX;
|
||
|
#endif
|
||
|
|
||
|
namespace Microsoft.Singularity.Isal
|
||
|
{
|
||
|
[NoCCtor]
|
||
|
[AccessedByRuntime("referenced in c++")]
|
||
|
[CLSCompliant(false)]
|
||
|
[System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential, Pack=4)]
|
||
|
[StructAlign(16)]
|
||
|
public struct ThreadRecord
|
||
|
{
|
||
|
// Spill context to use with this thread's execution is preempted
|
||
|
// Note this must be 16-byte aligned
|
||
|
[AccessedByRuntime("referenced in c++")]
|
||
|
public SpillContext spill;
|
||
|
|
||
|
// The current stack limit for bounds checks - this is kept current with
|
||
|
// thread context switches.
|
||
|
//
|
||
|
// While this is really logically associated with the Cpu rather than
|
||
|
// the thread, it is kept in the ThreadRecord since accesses into the Cpu
|
||
|
// record would be non-atomic (in the case where a thread is interrupted and
|
||
|
// migrates across processors).
|
||
|
//
|
||
|
// There are several cases where the activeStackLimit will differ from the
|
||
|
// stackLimit:
|
||
|
// - when we switch to the interrupt stack
|
||
|
// - after we call SetCurrentThreadRecord, but before we do a context
|
||
|
// restore on that thread's context.
|
||
|
|
||
|
[AccessedByRuntime("referenced in c++")]
|
||
|
public UIntPtr activeStackLimit;
|
||
|
}
|
||
|
}
|
||
|
|