https://git.reactos.org/?p=reactos.git;a=commitdiff;h=e806d16b065c5db27206d…
commit e806d16b065c5db27206d69f76a724ce593659bc
Author: Pierre Schweitzer <pierre(a)reactos.org>
AuthorDate: Fri Aug 31 19:43:04 2018 +0200
Commit: Pierre Schweitzer <pierre(a)reactos.org>
CommitDate: Fri Aug 31 19:48:32 2018 +0200
[NTOSKRNL] Warn about unimplemented feature in CcMapData() (in all callers)
Currently, our CcMapData() behavior (same goes for CcPinRead()) is broken
and is the total opposite of what Windows kernel does. By default, the later
will let you map a view in memory without even attempting to bring its
data in memory. On first access, there will be a fault and memory will
be read from the hardware and brought to memory. If you want to force read
on mapping/pinning, you have to set the MAP_NO_READ (or PIN_NO_READ) flag
where kernel will fault on your behalf (hence the need for MAP_WAIT/PIN_WAIT).
On ReactOS, by default, on mapping (and thus pinning), we will force a view
read so that data is in memory. The way our cache memory is managed at the
moment seems not to allow to fault on invalid access and if we don't force
read, the memory content will just be zeroed.
So trying to match Windows behavior, by default, now CcMapData() will enforce
the MAP_NO_READ flag and warn once about this behavior change.
---
ntoskrnl/cc/pin.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/ntoskrnl/cc/pin.c b/ntoskrnl/cc/pin.c
index 65525eed83..7373981119 100644
--- a/ntoskrnl/cc/pin.c
+++ b/ntoskrnl/cc/pin.c
@@ -86,6 +86,18 @@ CcMapData (
return FALSE;
}
+ if (!BooleanFlagOn(Flags, MAP_NO_READ))
+ {
+ static int Warned = 0;
+
+ SetFlag(Flags, MAP_NO_READ);
+ if (!Warned)
+ {
+ DPRINT1("Mapping/pinning with no read not implemented. Forcing read, might fail if wait not allowed\n");
+ Warned++;
+ }
+ }
+
ROffset = ROUND_DOWN(ReadOffset, VACB_MAPPING_GRANULARITY);
Status = CcRosRequestVacb(SharedCacheMap,
ROffset,
@@ -100,9 +112,9 @@ CcMapData (
return FALSE;
}
- if (!Valid)
+ if (!Valid && BooleanFlagOn(Flags, MAP_NO_READ))
{
- if (!(Flags & MAP_WAIT))
+ if (!BooleanFlagOn(Flags, MAP_WAIT))
{
CcRosReleaseVacb(SharedCacheMap, Vacb, FALSE, FALSE, FALSE);
CCTRACE(CC_API_DEBUG, "FileObject=%p FileOffset=%p Length=%lu Flags=0x%lx -> FALSE\n",
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=cb979bb29316ebe476022…
commit cb979bb29316ebe476022efe9cc7b2f40535982b
Author: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
AuthorDate: Sun Nov 5 21:15:08 2017 +0100
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Thu Aug 30 22:42:50 2018 +0200
[REACTOS] Introduce a "DEBUGFORMAT" environment variable that allows to select different debug trace formats.
CORE-12671
- The default format is used when no format name is specified: this is
the one we use so far in ReactOS:
<debug_class>:(<file>:<line>) <message>
with "debug_class" being "trace", "warn", "err".
- The "wine" format is the one used by Wine. It can be used when trying
to diff-compare traces for a module with the corresponding one
obtained from a Wine run. It can also be useful because the logging of
Wine-synced code assumes that the function names are automatically
added by the helper macros "FIXME()", "TRACE()", "WARN()" or "ERR()",
and not manually inside the logging string given to these macros:
for example:
FIXME("(%params) message\n", params);
displays:
fixme:<module>:SomeFunc(params) message
- The "extended" (or "ext") format is very noisy and tries to output a
lot of information; it is a hybrid of the previous two formats:
<debug_class>:(<file>:<line>):<channel>:SomeFunc <message>
Support for displaying the current process ID is added in
addition to the already existing support for thread ID.
---
sdk/include/reactos/wine/debug.h | 2 +-
sdk/lib/3rdparty/libwine/debug.c | 112 +++++++++++++++++++++++++++++++++++++--
2 files changed, 108 insertions(+), 6 deletions(-)
diff --git a/sdk/include/reactos/wine/debug.h b/sdk/include/reactos/wine/debug.h
index cd366ab375..35aefc9852 100644
--- a/sdk/include/reactos/wine/debug.h
+++ b/sdk/include/reactos/wine/debug.h
@@ -141,7 +141,7 @@ struct __wine_debug_channel
#define __WINE_DPRINTF(dbcl,dbch) \
(!__WINE_GET_DEBUGGING(dbcl,(dbch)) || \
- (ros_dbg_log(__WINE_DBCL##dbcl,(dbch),__FILE__,"",__LINE__,"") == -1)) ? \
+ (ros_dbg_log(__WINE_DBCL##dbcl,(dbch),__RELFILE__,__FUNCTION__,__LINE__,"") == -1)) ? \
(void)0 : (void)wine_dbg_printf
#define __WINE_PRINTF_ATTR(fmt, args)
diff --git a/sdk/lib/3rdparty/libwine/debug.c b/sdk/lib/3rdparty/libwine/debug.c
index dbcce115d2..9c6eba2c77 100644
--- a/sdk/lib/3rdparty/libwine/debug.c
+++ b/sdk/lib/3rdparty/libwine/debug.c
@@ -35,6 +35,7 @@
#include <rtlfuncs.h>
#include <cmfuncs.h>
+WINE_DECLARE_DEBUG_CHANNEL(pid);
WINE_DECLARE_DEBUG_CHANNEL(tid);
ULONG
@@ -59,6 +60,18 @@ static struct __wine_debug_functions funcs;
static void debug_init(void);
+
+/* Wine format */
+static int winefmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
+ const char *file, const char *func, const int line, const char *format, va_list args );
+/* ReactOS format (default) */
+static int rosfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
+ const char *file, const char *func, const int line, const char *format, va_list args );
+/* Extended format */
+static int extfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
+ const char *file, const char *func, const int line, const char *format, va_list args );
+
+
static int __cdecl cmp_name( const void *p1, const void *p2 )
{
const char *name = p1;
@@ -184,6 +197,25 @@ static void parse_options( const char *str )
free( options );
}
+/*
+ * The syntax of the DEBUGCHANNEL environment variable is:
+ * DEBUGCHANNEL=[class]+xxx,[class]-yyy,...
+ *
+ * For example: DEBUGCHANNEL=+all,warn-heap
+ * turns on all messages except warning heap messages.
+ *
+ * The available message classes are: err, warn, fixme, trace.
+ *
+ * In order to select a different debug trace format, the
+ * DEBUGFORMAT environment variable should be used:
+ *
+ * DEBUGFORMAT=fmt
+ *
+ * where fmt is the format name: 'wine', or 'extended' (abbreviation: 'ext').
+ * If no format or an invalid one is specified, the fall-back default format
+ * is used instead.
+ */
+
/* initialize all options at startup */
static void debug_init(void)
{
@@ -206,6 +238,34 @@ static void debug_init(void)
free(wine_debug);
}
}
+
+ dwLength = GetEnvironmentVariableA("DEBUGFORMAT", NULL, 0);
+ if (dwLength)
+ {
+ wine_debug = malloc(dwLength);
+ if (wine_debug)
+ {
+ if (GetEnvironmentVariableA("DEBUGFORMAT", wine_debug, dwLength) < dwLength)
+ {
+ if (strcmp(wine_debug, "wine") == 0)
+ {
+ funcs.dbg_vlog = winefmt_default_dbg_vlog;
+ }
+ else
+ if (strcmp(wine_debug, "extended") == 0 ||
+ strcmp(wine_debug, "ext") == 0)
+ {
+ funcs.dbg_vlog = extfmt_default_dbg_vlog;
+ }
+ else
+ {
+ funcs.dbg_vlog = rosfmt_default_dbg_vlog;
+ }
+ }
+ free(wine_debug);
+ }
+ }
+
SetLastError(LastError);
}
@@ -413,19 +473,36 @@ static int default_dbg_vprintf( const char *format, va_list args )
/* default implementation of wine_dbg_vlog */
-static int default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
- const char *file, const char *func, const int line, const char *format, va_list args )
+/* Wine format */
+static int winefmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
+ const char *file, const char *func, const int line, const char *format, va_list args )
+{
+ int ret = 0;
+
+ if (TRACE_ON(pid))
+ ret += wine_dbg_printf( "%04x:", HandleToULong(NtCurrentTeb()->ClientId.UniqueProcess) );
+ ret += wine_dbg_printf( "%04x:", HandleToULong(NtCurrentTeb()->ClientId.UniqueThread) );
+
+ if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
+ ret += wine_dbg_printf( "%s:%s:%s ", debug_classes[cls], channel->name, func );
+ if (format)
+ ret += funcs.dbg_vprintf( format, args );
+ return ret;
+}
+/* ReactOS format (default) */
+static int rosfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
+ const char *file, const char *func, const int line, const char *format, va_list args )
{
int ret = 0;
if (TRACE_ON(tid))
- ret += wine_dbg_printf("%04x:", HandleToULong(NtCurrentTeb()->ClientId.UniqueThread));
+ ret += wine_dbg_printf( "%04x:", HandleToULong(NtCurrentTeb()->ClientId.UniqueThread) );
if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
ret += wine_dbg_printf( "%s:", debug_classes[cls] );
if (file && line)
- ret += wine_dbg_printf ( "(%s:%d) ", file, line );
+ ret += wine_dbg_printf( "(%s:%d) ", file, line );
else
ret += wine_dbg_printf( "%s:%s: ", channel->name, func );
@@ -433,6 +510,31 @@ static int default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_ch
ret += funcs.dbg_vprintf( format, args );
return ret;
}
+/* Extended format */
+static int extfmt_default_dbg_vlog( enum __wine_debug_class cls, struct __wine_debug_channel *channel,
+ const char *file, const char *func, const int line, const char *format, va_list args )
+{
+ int ret = 0;
+
+ if (TRACE_ON(pid) || TRACE_ON(tid))
+ {
+ ret += wine_dbg_printf( "[%04x:%04x]:",
+ (TRACE_ON(pid) ? HandleToULong(NtCurrentTeb()->ClientId.UniqueProcess) : 0),
+ (TRACE_ON(tid) ? HandleToULong(NtCurrentTeb()->ClientId.UniqueThread) : 0) );
+ }
+
+ if (cls < sizeof(debug_classes)/sizeof(debug_classes[0]))
+ ret += wine_dbg_printf( "%s:", debug_classes[cls] );
+
+ if (file && line)
+ ret += wine_dbg_printf( "(%s:%d):", file, line );
+
+ ret += wine_dbg_printf( "%s:%s ", channel->name, func );
+
+ if (format)
+ ret += funcs.dbg_vprintf( format, args );
+ return ret;
+}
/* wrappers to use the function pointers */
@@ -460,5 +562,5 @@ static struct __wine_debug_functions funcs =
default_dbgstr_an,
default_dbgstr_wn,
default_dbg_vprintf,
- default_dbg_vlog
+ rosfmt_default_dbg_vlog
};