sim: Reintroduce the ignoreWarnOnceFunc syscall handler.
authorGabe Black <gabeblack@google.com>
Fri, 22 Nov 2019 23:59:07 +0000 (15:59 -0800)
committerGabe Black <gabeblack@google.com>
Tue, 10 Dec 2019 23:58:14 +0000 (23:58 +0000)
Instead of just using warn_once, we'll gate each warning on a bool
which is associated with the syscall desc pointer. To avoid having to
keep warn once bookkeeping in every syscall desc, we put it in a map
which is looked up at runtime.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-187

Change-Id: I1dcce48de91b8a635f9f3df3bfc0ed6ba1291c4f
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/23168
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-by: Brandon Potter <Brandon.Potter@amd.com>
src/sim/syscall_emul.cc
src/sim/syscall_emul.hh

index 8dc055c5d5355c5a7e1a9e8c3d65dc7071244a93..f064fd85808fb820ed06ffae18467c8ea616552e 100644 (file)
@@ -39,6 +39,7 @@
 #include <iostream>
 #include <mutex>
 #include <string>
+#include <unordered_map>
 
 #include "arch/utility.hh"
 #include "base/chunk_generator.hh"
@@ -75,9 +76,20 @@ unimplementedFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
 SyscallReturn
 ignoreFunc(SyscallDesc *desc, int callnum, ThreadContext *tc)
 {
-    if (desc->needWarning()) {
-        warn("ignoring syscall %s(...)%s", desc->name(), desc->warnOnce() ?
-             "\n      (further warnings will be suppressed)" : "");
+    warn("ignoring syscall %s(...)", desc->name());
+    return 0;
+}
+
+SyscallReturn
+ignoreWarnOnceFunc(SyscallDesc *desc, int num, ThreadContext *tc)
+{
+    static std::unordered_map<SyscallDesc *, bool> bool_map;
+
+    bool &warned = bool_map[desc];
+    if (!warned) {
+        warn("ignoring syscall %s(...)\n"
+             "      (further warnings will be suppressed)", desc->name());
+        warned = true;
     }
 
     return 0;
index e467b0bff459568e6824dc07a503721a217dfae3..f7d87d44502101c2f278b647e186e65fafec1ea8 100644 (file)
@@ -127,9 +127,12 @@ SyscallReturn unimplementedFunc(SyscallDesc *desc, int num, ThreadContext *tc);
 
 /// Handler for unimplemented syscalls that we never intend to
 /// implement (signal handling, etc.) and should not affect the correct
-/// behavior of the program.  Print a warning only if the appropriate
-/// trace flag is enabled.  Return success to the target program.
+/// behavior of the program.  Prints a warning.  Return success to the target
+/// program.
 SyscallReturn ignoreFunc(SyscallDesc *desc, int num, ThreadContext *tc);
+/// Like above, but only prints a warning once per syscall desc it's used with.
+SyscallReturn
+ignoreWarnOnceFunc(SyscallDesc *desc, int num, ThreadContext *tc);
 
 // Target fallocateFunc() handler.
 SyscallReturn fallocateFunc(SyscallDesc *desc, int num, ThreadContext *tc);