singrdk/base/Libraries/Singularity.V1/Services/DiagnosisService.cs

238 lines
10 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity - Singularity ABI
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: DiagnosisService.cs
//
// Note:
//
using System;
using System.Runtime.CompilerServices;
namespace Microsoft.Singularity.V1.Services
{
public struct DiagnosisService
{
int Reserved2;
//
// System call boundary must be unsafe to pass pointers
// to basic types across the GC domains. But this should not be
// directly accessable to application programs, but behind a
// trusted safe wrapper that validates parameters and
// enforces type safety.
//
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern unsafe int GCProfileSettings(
ulong *defaultMemorySize,
ulong *Options
);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool RegisterEventingController(
UIntPtr controllerHandle,
UIntPtr executionContextHandle
);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool DebugPrintLogEntry(UIntPtr controllerHandle,
UIntPtr entryHandle);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool TestKernelStorage();
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern UIntPtr OpenGlobalStorage(UIntPtr storageId);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern void CloseGlobalStorage(UIntPtr storageHandle);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe UIntPtr LogSourceEntry(UIntPtr sourceHandle,
uint flags,
UIntPtr eventType,
byte * buffer,
int size);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe UIntPtr LogSourceEntry(UIntPtr sourceHandle,
uint flags,
UIntPtr eventType,
byte * buffer,
int size,
int stringsCount,
void ** strings);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern UIntPtr CreateQueryView(UIntPtr storageHandle, bool forward);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern void DeleteQueryView(UIntPtr storageHandle);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe UIntPtr GetNextEntry(UIntPtr queryHandle,
UIntPtr * type,
UInt32 * userOffset,
byte * buffer,
UInt16 bufferSize );
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe bool RegisterEvent(char * eventName,
char * eventDescription,
UIntPtr * eventHandle);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe bool RegisterEventField(UIntPtr eventHandle,
char * fieldName,
UInt16 offset,
UInt16 type);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe bool RegisterEventGenericField(UIntPtr eventHandle,
char * fieldName,
UInt16 offset,
UInt16 size,
UIntPtr fieldTypeHandle);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe bool RegisterEnum(char * enumName, UInt16 type, UIntPtr * eventHandle);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe bool RegisterEnumValue(UIntPtr eventHandle,
char * valueName,
UInt64 value,
byte flagChar);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe UIntPtr WalkEventDescriptor(UIntPtr eventHandle,
UIntPtr currentField,
UInt16 * offset,
UInt16 * type,
char * bufferName,
UInt16 bufferSize );
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe bool GetSourceInformation(UIntPtr sourceHandle,
UIntPtr * storageHandle,
UIntPtr * eventType,
UInt16 * count,
char * bufferName,
UInt16 bufferSize );
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe int QuerySourcesList(UIntPtr * buffer, int size);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe int QueryEventTypeList(UIntPtr * buffer, int size);
[OutsideGCDomain]
[NoHeapAllocation]
[StackBound(128)] // How do we get these values?
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern unsafe bool ReadActiveSourceItem(UIntPtr sourceHandle,
int item,
UIntPtr * type,
byte * buffer,
UInt16 bufferSize );
//
// The signature offered to our caller is safe
//
public static int GCProfileSettingsImpl(
out ulong defaultMemorySize,
out ulong Options
)
{
int retval;
// This keeps unsafe blocks well contained
unsafe {
//
// Note: Would it be more efficient to declare local stack
// variables and reference these under fixed rather
// than locking the caller supplied references which
// may point to class fields and involve more complicated
// GC interactions?
//
fixed (ulong*
pdefaultMemorySize = &defaultMemorySize,
pOptions = &Options
) {
retval = DiagnosisService.GCProfileSettings(
pdefaultMemorySize,
pOptions
);
}
}
return retval;
}
}
}