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>
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user