diff options
author | Gabe Black <gabeblack@google.com> | 2019-11-22 15:59:07 -0800 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2019-12-10 23:58:14 +0000 |
commit | 771af751a2f96269dd66f6ec1792364705cf8329 (patch) | |
tree | 31dbafd4b0cbcc28dc3794f78b23c9acc87a083b | |
parent | a33d20ccafdca5338dbdad0659c754ea065e2bfc (diff) | |
download | gem5-771af751a2f96269dd66f6ec1792364705cf8329.tar.xz |
sim: Reintroduce the ignoreWarnOnceFunc syscall handler.
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>
-rw-r--r-- | src/sim/syscall_emul.cc | 18 | ||||
-rw-r--r-- | src/sim/syscall_emul.hh | 7 |
2 files changed, 20 insertions, 5 deletions
diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc index 8dc055c5d..f064fd858 100644 --- a/src/sim/syscall_emul.cc +++ b/src/sim/syscall_emul.cc @@ -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; diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh index e467b0bff..f7d87d445 100644 --- a/src/sim/syscall_emul.hh +++ b/src/sim/syscall_emul.hh @@ -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); |