|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH v2] Add optional log level settings
From: Owen Smith <owen.smith@xxxxxxxxxx>
Adds XenLogLevel and QemuLogLevel to xen.sys and ConsoleLogLevel
to xenbus.sys, which can be used to override the default log levels.
Each value is a REG_MULTI_SZ that contains an enumerated list of
log levels; TRACE, INFO, WARNING, ERROR, CRITICAL are defined.
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx>
---
include/xen.h | 10 ++++-
src/xen/driver.c | 103 ++++++++++++++++++++++++++++++++++------------------
src/xen/log.c | 88 +++++++++++++++++++++++++++++++++++++++-----
src/xenbus/driver.c | 37 +++++++++++++++++++
src/xenbus/driver.h | 6 +++
src/xenbus/fdo.c | 5 +--
6 files changed, 198 insertions(+), 51 deletions(-)
diff --git a/include/xen.h b/include/xen.h
index 470ccd4..05cf8ec 100644
--- a/include/xen.h
+++ b/include/xen.h
@@ -365,7 +365,7 @@ UnplugDecrementValue(
// 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,
@@ -413,6 +413,14 @@ LogResume(
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
diff --git a/src/xen/driver.c b/src/xen/driver.c
index f83cb13..fa141f3 100644
--- a/src/xen/driver.c
+++ b/src/xen/driver.c
@@ -49,6 +49,13 @@
#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;
@@ -160,6 +167,8 @@ DllInitialize(
{
HANDLE ServiceKey;
HANDLE UnplugKey;
+ HANDLE ParametersKey;
+ LOG_LEVEL LogLevel;
NTSTATUS status;
ExInitializeDriverRuntime(DrvRtPoolNxOptIn);
@@ -173,17 +182,40 @@ DllInitialize(
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);
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);
@@ -201,50 +233,44 @@ DllInitialize(
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);
@@ -252,41 +278,52 @@ DllInitialize(
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.InfoDisposition);
+ Driver.InfoDisposition = NULL;
+
+ LogRemoveDisposition(Driver.TraceDisposition);
+ Driver.TraceDisposition = NULL;
+
+ RegistryCloseKey(ParametersKey);
fail4:
Error("fail4\n");
@@ -301,12 +338,6 @@ fail3:
fail2:
Error("fail2\n");
- LogRemoveDisposition(Driver.InfoDisposition);
- Driver.InfoDisposition = NULL;
-
- LogRemoveDisposition(Driver.TraceDisposition);
- Driver.TraceDisposition = NULL;
-
LogTeardown();
fail1:
diff --git a/src/xen/log.c b/src/xen/log.c
index ff8b091..c10315e 100644
--- a/src/xen/log.c
+++ b/src/xen/log.c
@@ -560,9 +560,9 @@ LogAddDisposition(
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);
@@ -581,21 +581,19 @@ LogAddDisposition(
}
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;
}
@@ -609,6 +607,9 @@ LogRemoveDisposition(
KIRQL Irql;
ULONG Index;
+ if (Disposition == NULL)
+ return;
+
AcquireHighLock(&Context->Lock, &Irql);
for (Index = 0; Index < LOG_MAXIMUM_DISPOSITION; Index++) {
@@ -664,6 +665,73 @@ LogResume(
(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
diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index bbbda6c..5550d88 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -48,6 +48,7 @@
typedef struct _XENBUS_DRIVER {
PDRIVER_OBJECT DriverObject;
HANDLE ParametersKey;
+ LOG_LEVEL ConsoleLogLevel;
MUTEX Mutex;
LIST_ENTRY List;
@@ -57,6 +58,10 @@ typedef struct _XENBUS_DRIVER {
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(
@@ -122,6 +127,30 @@ DriverGetParametersKey(
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
@@ -680,6 +709,7 @@ DriverEntry(
HANDLE ServiceKey;
HANDLE ParametersKey;
ULONG Index;
+ LOG_LEVEL LogLevel;
NTSTATUS status;
ASSERT3P(__DriverGetDriverObject(), ==, NULL);
@@ -721,6 +751,13 @@ DriverEntry(
__DriverSetParametersKey(ParametersKey);
+ status = LogReadLogLevel(ParametersKey,
+ "ConsoleLogLevel",
+ &LogLevel);
+ if (!NT_SUCCESS(status))
+ LogLevel = DEFAULT_CONSOLE_LOG_LEVEL;
+ __DriverSetConsoleLogLevel(LogLevel);
+
RegistryCloseKey(ServiceKey);
status = XenTouch(__MODULE__,
diff --git a/src/xenbus/driver.h b/src/xenbus/driver.h
index dd81e4c..21fb1f7 100644
--- a/src/xenbus/driver.h
+++ b/src/xenbus/driver.h
@@ -42,6 +42,12 @@ DriverGetParametersKey(
VOID
);
+#include <xen.h>
+extern LOG_LEVEL
+DriverGetConsoleLogLevel(
+ VOID
+ );
+
extern VOID
DriverRequestReboot(
VOID
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 0aeea3d..c5b5da1 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -2680,10 +2680,7 @@ __FdoD3ToD0(
Fdo->Channel,
FALSE);
- status = LogAddDisposition(LOG_LEVEL_INFO |
- LOG_LEVEL_WARNING |
- LOG_LEVEL_ERROR |
- LOG_LEVEL_CRITICAL,
+ status = LogAddDisposition(DriverGetConsoleLogLevel(),
FdoOutputBuffer,
Fdo,
&Fdo->LogDisposition);
--
2.8.3
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |