185 lines
5.7 KiB
C++
185 lines
5.7 KiB
C++
////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft Research Singularity
|
|
//
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//
|
|
// File: Monitoring.cpp
|
|
//
|
|
// Note: Kernel & Process
|
|
//
|
|
|
|
#include "hal.h"
|
|
#include "eventing.h"
|
|
|
|
#define MONITORING_BUFFER_SIZE (6 * 1024 * 1024)
|
|
#define MONITORING_TEXT_SIZE (2 * 1024 * 1024)
|
|
|
|
UIntPtr MonitoringStorageHandle = 0;
|
|
PSOURCE_DESCRIPTOR MonitoringSource = NULL;
|
|
UIntPtr MonitoringTypeHandle = 0;
|
|
|
|
const UINT32 Monitoring_ControlFlag_Active = 0x00010000;
|
|
|
|
void
|
|
Class_Microsoft_Singularity_Monitoring::
|
|
g_Initialize()
|
|
{
|
|
|
|
#if SINGULARITY_KERNEL
|
|
|
|
g_InitPages((UIntPtr)(MONITORING_BUFFER_SIZE));
|
|
|
|
if (c_buffer != NULL) {
|
|
|
|
MonitoringStorageHandle = Class_Microsoft_Singularity_Eventing_MemoryStorage::
|
|
g_MemoryStorageCreateImpl(MEMORY_STORAGE_FLAGS_RECYCLE_MEMORY,
|
|
(uint8 *)c_buffer,
|
|
(uint32)MONITORING_BUFFER_SIZE,
|
|
0);
|
|
|
|
if (MonitoringStorageHandle) {
|
|
|
|
UIntPtr sourceHandle = RegisterNativeSource("Monitoring",
|
|
MonitoringStorageHandle,
|
|
Monitoring_ControlFlag_Active);
|
|
|
|
MonitoringSource = GetSourceFromHandle(sourceHandle);
|
|
}
|
|
}
|
|
|
|
#elif SINGULARITY_PROCESS
|
|
|
|
Struct_Microsoft_Singularity_V1_Services_ProcessService::
|
|
g_GetSharedSourceHandles(Class_Microsoft_Singularity_Eventing_Controller_MonitoringInfo,
|
|
&MonitoringStorageHandle,
|
|
(UIntPtr *)&MonitoringSource,
|
|
&MonitoringTypeHandle);
|
|
|
|
#else
|
|
#error "File should be compiled with SINGULARITY_KERNEL or SINGULARITY_PROCESS"
|
|
#endif
|
|
}
|
|
|
|
bool GetMonitoringHandles(UIntPtr * storageHandle,
|
|
UIntPtr * sourceHandle,
|
|
UIntPtr * eventTypeHandle)
|
|
{
|
|
*storageHandle = MonitoringStorageHandle;
|
|
*sourceHandle = (UIntPtr)MonitoringSource;
|
|
*eventTypeHandle = MonitoringTypeHandle;
|
|
return true;
|
|
}
|
|
|
|
|
|
bool __inline IsMonitoringEnabled()
|
|
{
|
|
return ((MonitoringSource != NULL) &&
|
|
(MonitoringSource->ControlFlags & Monitoring_ControlFlag_Active));
|
|
}
|
|
|
|
|
|
void Class_Microsoft_Singularity_Monitoring::
|
|
g_Log(uint16 provider, uint16 type)
|
|
{
|
|
if (IsMonitoringEnabled()) {
|
|
|
|
Struct_Microsoft_Singularity_ThreadContext *threadContext =
|
|
Class_Microsoft_Singularity_Processor::g_GetCurrentThreadContext();
|
|
|
|
MONITORING_ENTRY entry = {threadContext->processId, provider,type,0,0,0,0,0,0};
|
|
InternalLogFixedRecord(MonitoringStorageHandle,
|
|
MonitoringSource->ControlFlags,
|
|
MonitoringTypeHandle,
|
|
&entry,
|
|
sizeof(entry));
|
|
}
|
|
}
|
|
|
|
void Class_Microsoft_Singularity_Monitoring::
|
|
g_Log(uint16 provider, uint16 type, uint16 version,
|
|
uint32 a0, uint32 a1, uint32 a2, uint32 a3, uint32 a4)
|
|
{
|
|
if (IsMonitoringEnabled()) {
|
|
|
|
Struct_Microsoft_Singularity_ThreadContext *threadContext =
|
|
Class_Microsoft_Singularity_Processor::g_GetCurrentThreadContext();
|
|
|
|
MONITORING_ENTRY entry = {threadContext->processId, provider,type,version,a0,a1,a2,a3,a4};
|
|
InternalLogFixedRecord(MonitoringStorageHandle,
|
|
MonitoringSource->ControlFlags,
|
|
MonitoringTypeHandle,
|
|
&entry,
|
|
sizeof(entry));
|
|
}
|
|
}
|
|
|
|
void Class_Microsoft_Singularity_Monitoring::
|
|
g_Log(uint16 provider, uint16 type, Class_System_String *s)
|
|
{
|
|
if (IsMonitoringEnabled()) {
|
|
|
|
Struct_Microsoft_Singularity_ThreadContext *threadContext =
|
|
Class_Microsoft_Singularity_Processor::g_GetCurrentThreadContext();
|
|
|
|
MONITORING_ENTRY entry = {threadContext->processId, provider,type,0,0,0,0,0,0,1};
|
|
|
|
Struct_Microsoft_Singularity_Eventing_ArrayType array[] = {
|
|
{s->m_stringLength,
|
|
sizeof(char),
|
|
Class_Microsoft_Singularity_Eventing_DataType___string,
|
|
&s->m_firstChar}};
|
|
|
|
InternalLogVariableRecord(true,
|
|
MonitoringStorageHandle,
|
|
MonitoringSource->ControlFlags,
|
|
MonitoringTypeHandle,
|
|
&entry,
|
|
sizeof(entry),
|
|
sizeof(array)/sizeof(array[0]),
|
|
array);
|
|
}
|
|
}
|
|
|
|
|
|
bool Class_Microsoft_Singularity_Monitoring::
|
|
g_isActive()
|
|
{
|
|
return IsMonitoringEnabled();
|
|
}
|
|
|
|
void Class_Microsoft_Singularity_Monitoring::
|
|
g_setActive(bool active)
|
|
{
|
|
if (MonitoringSource != NULL) {
|
|
if (active) {
|
|
MonitoringSource->ControlFlags |= Monitoring_ControlFlag_Active;
|
|
} else {
|
|
MonitoringSource->ControlFlags &= ~Monitoring_ControlFlag_Active;
|
|
}
|
|
}
|
|
}
|
|
|
|
int Class_Microsoft_Singularity_Monitoring::
|
|
g_FillLogEntry(Struct_Microsoft_Singularity_Monitoring_LogEntry * log,
|
|
UINT64 * min_counter)
|
|
{
|
|
//
|
|
// TODO: impplement it to fix monnet
|
|
//
|
|
return 0;
|
|
}
|
|
|
|
int Class_Microsoft_Singularity_Monitoring::
|
|
g_FillTextEntry(uint8 * src, UINT64 counter, uint8 * dst, int max_size)
|
|
{
|
|
//
|
|
// TODO: impplement it to fix monnet
|
|
//
|
|
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
///////////////////////////////////////////////////////////////// End of File.
|