// LOG
typedef enum _LOG_LEVEL {
- LOG_LEVEL_INVALID = 0,
+ LOG_LEVEL_NONE = 0,
LOG_LEVEL_TRACE = 1 << DPFLTR_TRACE_LEVEL,
LOG_LEVEL_INFO = 1 << DPFLTR_INFO_LEVEL,
LOG_LEVEL_WARNING = 1 << DPFLTR_WARNING_LEVEL,
VOID
);
+XEN_API
+NTSTATUS
+LogReadLogLevel(
+ IN HANDLE Key,
+ IN PCHAR Name,
+ OUT PLOG_LEVEL LogLevel
+ );
+
typedef struct _LOG_DISPOSITION LOG_DISPOSITION, *PLOG_DISPOSITION;
XEN_API
#include "assert.h"
#include "version.h"
+#define DEFAULT_XEN_LOG_LEVEL (LOG_LEVEL_TRACE | \
+ LOG_LEVEL_CRITICAL)
+#define DEFAULT_QEMU_LOG_LEVEL (LOG_LEVEL_INFO | \
+ LOG_LEVEL_WARNING | \
+ LOG_LEVEL_ERROR | \
+ LOG_LEVEL_CRITICAL)
+
typedef struct _XEN_DRIVER {
- PLOG_DISPOSITION TraceDisposition;
- PLOG_DISPOSITION InfoDisposition;
+ PLOG_DISPOSITION XenDisposition;
+ PLOG_DISPOSITION QemuDisposition;
HANDLE UnplugKey;
} XEN_DRIVER, *PXEN_DRIVER;
{
HANDLE ServiceKey;
HANDLE UnplugKey;
+ HANDLE ParametersKey;
+ LOG_LEVEL LogLevel;
NTSTATUS status;
ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
if (!NT_SUCCESS(status))
goto fail1;
- status = LogAddDisposition(LOG_LEVEL_TRACE |
- LOG_LEVEL_CRITICAL,
+ status = RegistryInitialize(RegistryPath);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ status = RegistryCreateServiceKey(&ServiceKey);
+ if (!NT_SUCCESS(status))
+ goto fail3;
+
+ status = RegistryCreateSubKey(ServiceKey,
+ "Parameters",
+ REG_OPTION_NON_VOLATILE,
+ &ParametersKey);
+ if (!NT_SUCCESS(status))
+ goto fail4;
+
+ status = LogReadLogLevel(ParametersKey,
+ "XenLogLevel",
+ &LogLevel);
+ if (!NT_SUCCESS(status))
+ LogLevel = DEFAULT_XEN_LOG_LEVEL;
+
+ status = LogAddDisposition(LogLevel,
DriverOutputBuffer,
(PVOID)XEN_PORT,
- &Driver.TraceDisposition);
+ &Driver.XenDisposition);
ASSERT(NT_SUCCESS(status));
- status = LogAddDisposition(LOG_LEVEL_INFO |
- LOG_LEVEL_WARNING |
- LOG_LEVEL_ERROR |
- LOG_LEVEL_CRITICAL,
+ status = LogReadLogLevel(ParametersKey,
+ "QemuLogLevel",
+ &LogLevel);
+ if (!NT_SUCCESS(status))
+ LogLevel = DEFAULT_QEMU_LOG_LEVEL;
+
+ status = LogAddDisposition(LogLevel,
DriverOutputBuffer,
(PVOID)QEMU_PORT,
- &Driver.InfoDisposition);
+ &Driver.QemuDisposition);
ASSERT(NT_SUCCESS(status));
Info("%d.%d.%d (%d) (%02d.%02d.%04d)\n",
if (__DriverSafeMode())
Info("SAFE MODE\n");
- status = RegistryInitialize(RegistryPath);
- if (!NT_SUCCESS(status))
- goto fail2;
-
- status = RegistryCreateServiceKey(&ServiceKey);
- if (!NT_SUCCESS(status))
- goto fail3;
-
status = RegistryCreateSubKey(ServiceKey,
"Unplug",
REG_OPTION_NON_VOLATILE,
&UnplugKey);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail5;
__DriverSetUnplugKey(UnplugKey);
status = AcpiInitialize();
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail6;
status = SystemInitialize();
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail7;
status = HypercallInitialize();
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
status = BugCheckInitialize();
if (!NT_SUCCESS(status))
- goto fail8;
+ goto fail9;
status = ModuleInitialize();
if (!NT_SUCCESS(status))
- goto fail9;
+ goto fail10;
status = ProcessInitialize();
if (!NT_SUCCESS(status))
- goto fail10;
+ goto fail11;
status = UnplugInitialize();
if (!NT_SUCCESS(status))
- goto fail11;
+ goto fail12;
+
+ RegistryCloseKey(ParametersKey);
RegistryCloseKey(ServiceKey);
return STATUS_SUCCESS;
+fail12:
+ Error("fail12\n");
+
+ ProcessTeardown();
+
fail11:
Error("fail11\n");
- ProcessTeardown();
+ ModuleTeardown();
fail10:
Error("fail10\n");
- ModuleTeardown();
+ BugCheckTeardown();
fail9:
Error("fail9\n");
- BugCheckTeardown();
+ HypercallTeardown();
fail8:
Error("fail8\n");
- HypercallTeardown();
+ SystemTeardown();
fail7:
Error("fail7\n");
- SystemTeardown();
+ AcpiTeardown();
fail6:
Error("fail6\n");
- AcpiTeardown();
+ RegistryCloseKey(UnplugKey);
+ __DriverSetUnplugKey(NULL);
fail5:
Error("fail5\n");
- RegistryCloseKey(UnplugKey);
- __DriverSetUnplugKey(NULL);
+ LogRemoveDisposition(Driver.QemuDisposition);
+ Driver.QemuDisposition = NULL;
+
+ LogRemoveDisposition(Driver.XenDisposition);
+ Driver.XenDisposition = NULL;
+
+ RegistryCloseKey(ParametersKey);
fail4:
Error("fail4\n");
fail2:
Error("fail2\n");
- LogRemoveDisposition(Driver.InfoDisposition);
- Driver.InfoDisposition = NULL;
-
- LogRemoveDisposition(Driver.TraceDisposition);
- Driver.TraceDisposition = NULL;
-
LogTeardown();
fail1:
MONTH,
YEAR);
- LogRemoveDisposition(Driver.InfoDisposition);
- Driver.InfoDisposition = NULL;
+ LogRemoveDisposition(Driver.QemuDisposition);
+ Driver.QemuDisposition = NULL;
- LogRemoveDisposition(Driver.TraceDisposition);
- Driver.TraceDisposition = NULL;
+ LogRemoveDisposition(Driver.XenDisposition);
+ Driver.XenDisposition = NULL;
LogTeardown();
ULONG Index;
NTSTATUS status;
- status = STATUS_INVALID_PARAMETER;
- if (Mask == 0)
- goto fail1;
+ *Disposition = NULL;
+ if (Mask == LOG_LEVEL_NONE)
+ goto ignore;
AcquireHighLock(&Context->Lock, &Irql);
}
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
ReleaseHighLock(&Context->Lock, Irql);
+ignore:
return STATUS_SUCCESS;
-fail2:
- Error("fail2\n");
-
- *Disposition = NULL;
+fail1:
+ Error("fail1 (%08x)\n", status);
ReleaseHighLock(&Context->Lock, Irql);
-fail1:
- Error("fail1 (%08x)\n", status);
+ *Disposition = NULL;
return status;
}
KIRQL Irql;
ULONG Index;
+ if (Disposition == NULL)
+ return;
+
AcquireHighLock(&Context->Lock, &Irql);
for (Index = 0; Index < LOG_MAXIMUM_DISPOSITION; Index++) {
(VOID) DbgSetDebugPrintCallback(LogDebugPrint, TRUE);
}
+typedef struct _XEN_LOG_LEVEL_NAME {
+ const CHAR *Name;
+ LOG_LEVEL LogLevel;
+} XEN_LOG_LEVEL_NAME, *PXEN_LOG_LEVEL_NAME;
+
+static const XEN_LOG_LEVEL_NAME XenLogLevelNames[] = {
+ { "TRACE", LOG_LEVEL_TRACE },
+ { "INFO", LOG_LEVEL_INFO },
+ { "WARNING", LOG_LEVEL_WARNING },
+ { "ERROR", LOG_LEVEL_ERROR, },
+ { "CRITICAL", LOG_LEVEL_CRITICAL }
+};
+
+XEN_API
+NTSTATUS
+LogReadLogLevel(
+ IN HANDLE Key,
+ IN PCHAR Name,
+ OUT PLOG_LEVEL LogLevel
+ )
+{
+ PANSI_STRING Values;
+ ULONG Type;
+ ULONG Index;
+ NTSTATUS status;
+
+ status = RegistryQuerySzValue(Key,
+ Name,
+ &Type,
+ &Values);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ status = STATUS_INVALID_PARAMETER;
+ if (Type != REG_MULTI_SZ)
+ goto fail2;
+
+ *LogLevel = LOG_LEVEL_NONE;
+ for (Index = 0; Values[Index].Buffer != NULL; ++Index) {
+ PANSI_STRING Value = &Values[Index];
+ ULONG Level;
+
+ for (Level = 0; Level < ARRAYSIZE(XenLogLevelNames); ++Level) {
+ if (_stricmp(XenLogLevelNames[Level].Name, Value->Buffer) == 0) {
+ *LogLevel |= XenLogLevelNames[Level].LogLevel;
+ break;
+ }
+ }
+ }
+
+ RegistryFreeSzValue(Values);
+
+ return STATUS_SUCCESS;
+
+fail2:
+ Error("fail2\n");
+
+ RegistryFreeSzValue(Values);
+
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ *LogLevel = LOG_LEVEL_NONE;
+
+ return status;
+}
+
NTSTATUS
LogInitialize(
VOID
typedef struct _XENBUS_DRIVER {
PDRIVER_OBJECT DriverObject;
HANDLE ParametersKey;
+ LOG_LEVEL ConsoleLogLevel;
MUTEX Mutex;
LIST_ENTRY List;
static XENBUS_DRIVER Driver;
#define XENBUS_DRIVER_TAG 'VIRD'
+#define DEFAULT_CONSOLE_LOG_LEVEL (LOG_LEVEL_INFO | \
+ LOG_LEVEL_WARNING | \
+ LOG_LEVEL_ERROR | \
+ LOG_LEVEL_CRITICAL)
static FORCEINLINE PVOID
__DriverAllocate(
return __DriverGetParametersKey();
}
+static FORCEINLINE VOID
+__DriverSetConsoleLogLevel(
+ IN LOG_LEVEL LogLevel
+ )
+{
+ Driver.ConsoleLogLevel = LogLevel;
+}
+
+static FORCEINLINE LOG_LEVEL
+__DriverGetConsoleLogLevel(
+ VOID
+ )
+{
+ return Driver.ConsoleLogLevel;
+}
+
+LOG_LEVEL
+DriverGetConsoleLogLevel(
+ VOID
+ )
+{
+ return __DriverGetConsoleLogLevel();
+}
+
#define MAXNAMELEN 128
static FORCEINLINE VOID
HANDLE ServiceKey;
HANDLE ParametersKey;
ULONG Index;
+ LOG_LEVEL LogLevel;
NTSTATUS status;
ASSERT3P(__DriverGetDriverObject(), ==, NULL);
__DriverSetParametersKey(ParametersKey);
+ status = LogReadLogLevel(ParametersKey,
+ "ConsoleLogLevel",
+ &LogLevel);
+ if (!NT_SUCCESS(status))
+ LogLevel = DEFAULT_CONSOLE_LOG_LEVEL;
+
+ __DriverSetConsoleLogLevel(LogLevel);
+
RegistryCloseKey(ServiceKey);
status = XenTouch(__MODULE__,
#ifndef _XENBUS_DRIVER_H
#define _XENBUS_DRIVER_H
+#include <xen.h>
+
extern PDRIVER_OBJECT
DriverGetDriverObject(
VOID
VOID
);
+extern LOG_LEVEL
+DriverGetConsoleLogLevel(
+ VOID
+ );
+
extern VOID
DriverRequestReboot(
VOID
Fdo->Channel,
FALSE);
- status = LogAddDisposition(LOG_LEVEL_INFO |
- LOG_LEVEL_WARNING |
- LOG_LEVEL_ERROR |
- LOG_LEVEL_CRITICAL,
+ status = LogAddDisposition(DriverGetConsoleLogLevel(),
FdoOutputBuffer,
Fdo,
&Fdo->LogDisposition);