singrdk/base/Kernel/Singularity/Isal/ix/ProcessorContext.cs

71 lines
2.5 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: ProcessorContext.cs
//
// Note:
//
namespace Microsoft.Singularity
{
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Threading;
using Microsoft.Singularity.Isal;
#if SINGULARITY_KERNEL
using Microsoft.Singularity.Hal;
#endif
[NoCCtor]
[CLSCompliant(false)]
[StructLayout(LayoutKind.Sequential)]
[AccessedByRuntime("referenced from c++")]
internal struct ProcessorContext
{
// All fields are private to the kernel.
//
// It's important that the embedded ThreadContexts in this struct are paragraph-aligned.
// That's because those ThreadContexts contain 'mmx' fields, which are the target of
// FXSAVE and FXRSTOR instructions. Intel specifies that those fields must be paragraph-
// aligned, or the instructions will fault.
[AccessedByRuntime("referenced from c++")]
internal CpuRecord cpuRecord;
[AccessedByRuntime("referenced from c++")] private unsafe void *halCpu;
[AccessedByRuntime("referenced from c++")] private unsafe void *_processor; // Only changed by garbage collector.
[AccessedByRuntime("referenced from c++")] internal UIntPtr exception;
[AccessedByRuntime("referenced from c++")] internal volatile int ipiFreeze;
[AccessedByRuntime("referenced from c++")] internal unsafe ProcessorContext* nextProcessorContext; // singly-linked circular list node for MpExecution use
[AccessedByRuntime("referenced from c++")] internal volatile int gcIpiGate; //
//////////////////////////////////////////////////// External Methods.
//
internal Processor processor {
[NoHeapAllocation]
get { return GetProcessor(); }
}
[AccessedByRuntime("output to header: defined in c++")]
[MethodImpl(MethodImplOptions.InternalCall)]
[StackBound(32)]
[NoHeapAllocation]
internal extern void UpdateAfterGC(Processor processor);
[AccessedByRuntime("output to header: defined in c++")]
[MethodImpl(MethodImplOptions.InternalCall)]
[StackBound(32)]
[NoHeapAllocation]
private extern Processor GetProcessor();
}
}