71 lines
2.5 KiB
C#
71 lines
2.5 KiB
C#
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// 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();
|
|
}
|
|
}
|
|
|
|
|