syscall_emul: [patch 2/22] move SyscallDesc into its own .hh and .cc
authorBrandon Potter <brandon.potter@amd.com>
Wed, 9 Nov 2016 20:27:40 +0000 (14:27 -0600)
committerBrandon Potter <brandon.potter@amd.com>
Wed, 9 Nov 2016 20:27:40 +0000 (14:27 -0600)
The class was crammed into syscall_emul.hh which has tons of forward
declarations and template definitions. To clean it up a bit, moved the
class into separate files and commented the class with doxygen style
comments. Also, provided some encapsulation by adding some accessors and
a mutator.

The syscallreturn.hh file was renamed syscall_return.hh to make it consistent
with other similarly named files in the src/sim directory.

The DPRINTF_SYSCALL macro was moved into its own header file with the
include the Base and Verbose flags as well.

--HG--
rename : src/sim/syscallreturn.hh => src/sim/syscall_return.hh

21 files changed:
src/arch/alpha/linux/process.cc
src/arch/arm/freebsd/process.cc
src/arch/arm/linux/process.cc
src/arch/mips/linux/process.cc
src/arch/power/linux/process.cc
src/arch/riscv/linux/process.cc
src/arch/sparc/linux/process.cc
src/arch/sparc/linux/syscalls.cc
src/arch/sparc/solaris/process.cc
src/arch/x86/linux/process.cc
src/arch/x86/process.cc
src/sim/SConscript
src/sim/process.cc
src/sim/process.hh
src/sim/syscall_debug_macros.hh [new file with mode: 0644]
src/sim/syscall_desc.cc [new file with mode: 0644]
src/sim/syscall_desc.hh [new file with mode: 0644]
src/sim/syscall_emul.cc
src/sim/syscall_emul.hh
src/sim/syscall_return.hh [new file with mode: 0644]
src/sim/syscallreturn.hh [deleted file]

index 9a26bb9b819a122bbdf97fdd5182abe7c0ed693b..c5e25c4d1cd4d2c341b6de71a819053f0e58cdf8 100644 (file)
@@ -38,6 +38,7 @@
 #include "debug/SyscallVerbose.hh"
 #include "kern/linux/linux.hh"
 #include "sim/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 
 using namespace std;
index c2a6b38b007d6a994e361b47f470aaf3c9ab3f0e..266bab8bf5acb8c8ca833c06974cd193733a10e5 100644 (file)
@@ -45,6 +45,7 @@
 #include "cpu/thread_context.hh"
 #include "kern/freebsd/freebsd.hh"
 #include "sim/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 #include "sim/system.hh"
 
index 67f25893bf5258d61f07938abf38b674db154fa7..36a628d52da4765e6c342ded8bef78f7755be2bb 100644 (file)
@@ -52,6 +52,7 @@
 #include "cpu/thread_context.hh"
 #include "kern/linux/linux.hh"
 #include "sim/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 #include "sim/system.hh"
 
index deb6e8b8037d5dabc4e782284b971244f701e564..170a3edccd37bc8bf532b7d036dd110c5f354458 100644 (file)
@@ -40,6 +40,7 @@
 #include "kern/linux/linux.hh"
 #include "sim/eventq.hh"
 #include "sim/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 #include "sim/system.hh"
 
index f9c424cea56a02cb1a4f8406fb90db8481d76e3a..b39027dee9016b63ec16e0bf15381bbe4a9ccc7f 100644 (file)
@@ -40,6 +40,7 @@
 #include "cpu/thread_context.hh"
 #include "kern/linux/linux.hh"
 #include "sim/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 #include "sim/system.hh"
 
index 7884b83b2a009fa3214262a2b1a0d926054178c9..c6c61c75164388e3fe65b0eebfba84d4356849c1 100644 (file)
@@ -44,6 +44,7 @@
 #include "kern/linux/linux.hh"
 #include "sim/eventq.hh"
 #include "sim/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 #include "sim/system.hh"
 
index fd4dd981890803c1d0827d248a089a7cd4d7359b..a95498ea01466a5a67e15bfd2c3dc583237b170a 100644 (file)
@@ -38,6 +38,7 @@
 #include "cpu/thread_context.hh"
 #include "kern/linux/linux.hh"
 #include "sim/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 
 using namespace std;
index 66e8e1fe182f403959fa65fe01e1b06e7b386a0a..33140f1b8357c0533d4a684f8d036ec0105f6963 100644 (file)
@@ -29,6 +29,7 @@
  */
 
 #include "arch/sparc/linux/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 
 class LiveProcess;
index 38159720ac1c95c83719ccd0e13c5fae40c6272c..b26d37fe7468b7c12b4997743bf404ffa8c11904 100644 (file)
@@ -36,6 +36,7 @@
 #include "cpu/thread_context.hh"
 #include "kern/solaris/solaris.hh"
 #include "sim/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 
 using namespace std;
index 88bb204835c19b765a29142c9370b0372d46c501..e4221511db7faf5336771f9d6611a7b1cb6f64d8 100644 (file)
@@ -46,6 +46,7 @@
 #include "cpu/thread_context.hh"
 #include "kern/linux/linux.hh"
 #include "sim/process.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/syscall_emul.hh"
 
 using namespace std;
@@ -159,7 +160,7 @@ setThreadArea32Func(SyscallDesc *desc, int callnum,
         return -EFAULT;
 
     if (!gdt.copyIn(tc->getMemProxy()))
-        panic("Failed to copy in GDT for %s.\n", desc->name);
+        panic("Failed to copy in GDT for %s.\n", desc->name());
 
     if (userDesc->entry_number == (uint32_t)(-1)) {
         // Find a free TLS entry.
@@ -213,7 +214,7 @@ setThreadArea32Func(SyscallDesc *desc, int callnum,
     if (!userDesc.copyOut(tc->getMemProxy()))
         return -EFAULT;
     if (!gdt.copyOut(tc->getMemProxy()))
-        panic("Failed to copy out GDT for %s.\n", desc->name);
+        panic("Failed to copy out GDT for %s.\n", desc->name());
 
     return 0;
 }
index 3a347e509f171fb5ffa6b16b5009881fb1332209..116304fb4a7d51a754aa495321faac08781c89f6 100644 (file)
@@ -58,7 +58,7 @@
 #include "mem/multi_level_page_table.hh"
 #include "mem/page_table.hh"
 #include "sim/process_impl.hh"
-#include "sim/syscall_emul.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/system.hh"
 
 using namespace std;
index 22b9ef5cd40fd7d83741dfb79c6177e938854d45..61e4df96668e4bf057e9bcdbbdd20f9a3fe5b9b5 100644 (file)
@@ -80,6 +80,7 @@ if env['TARGET_ISA'] != 'null':
     Source('fd_entry.cc')
     Source('pseudo_inst.cc')
     Source('syscall_emul.cc')
+    Source('syscall_desc.cc')
 
 DebugFlag('Checkpoint')
 DebugFlag('Config')
index 1272949a1c635b016601c62a286ca9a51d5bba62..bead9d36276ccf0fff0786876e5188aff232d96e 100644 (file)
@@ -66,7 +66,7 @@
 #include "sim/debug.hh"
 #include "sim/process_impl.hh"
 #include "sim/stats.hh"
-#include "sim/syscall_emul.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/system.hh"
 
 #if THE_ISA == ALPHA_ISA
index 54e6b2df257704dda45d381110efc4a8397e228c..d9762c052d1cb8a389048fd529c06faa90f6f91f 100644 (file)
@@ -44,7 +44,7 @@
 #include "mem/se_translating_port_proxy.hh"
 #include "sim/fd_entry.hh"
 #include "sim/sim_object.hh"
-#include "sim/syscallreturn.hh"
+#include "sim/syscall_return.hh"
 
 class PageTable;
 struct ProcessParams;
diff --git a/src/sim/syscall_debug_macros.hh b/src/sim/syscall_debug_macros.hh
new file mode 100644 (file)
index 0000000..35a0a05
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2012-2013, 2015 ARM Limited
+ * Copyright (c) 2015-2016 Advanced Micro Devices, Inc.
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Steve Reinhardt
+ *          Kevin Lim
+ *          Brandon Potter
+ */
+
+#ifndef __SIM_SYSCALL_DEBUG_MACROS_HH__
+#define __SIM_SYSCALL_DEBUG_MACROS_HH__
+
+#include "debug/SyscallBase.hh"
+#include "debug/SyscallVerbose.hh"
+
+/**
+ * This macro is intended to help with readability.
+ * FLAGEXT specifies to which flag to assign the message: SyscallBase,
+ * SyscallVerbose, etc..; notice that 'Syscall' is already prepended.
+ * FMT is the message to be appended to the header information. The header
+ * information contains the cpuid and thread id.
+ */
+#define DPRINTF_SYSCALL(FLAGEXT, FMT, ...)                                  \
+    DPRINTFS(Syscall##FLAGEXT, tc->getCpuPtr(), "T%d : syscall " FMT,       \
+             tc->threadId(), __VA_ARGS__)
+
+#endif // __SIM_SYSCALL_DEBUG_MACROS_HH__
diff --git a/src/sim/syscall_desc.cc b/src/sim/syscall_desc.cc
new file mode 100644 (file)
index 0000000..34fb43d
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2016 Advanced Micro Devices, Inc.
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Steve Reinhardt
+ *          Ali Saidi
+ *          Brandon Potter
+ */
+
+#include "sim/syscall_desc.hh"
+
+#include "base/trace.hh"
+#include "config/the_isa.hh"
+#include "cpu/base.hh"
+#include "cpu/thread_context.hh"
+#include "sim/process.hh"
+#include "sim/syscall_debug_macros.hh"
+#include "sim/syscall_return.hh"
+
+void
+SyscallDesc::doSyscall(int callnum, LiveProcess *process, ThreadContext *tc)
+{
+    TheISA::IntReg arg[6] M5_VAR_USED;
+
+    /**
+     * Step through the first six parameters for the system call and
+     * retrieve their values. Note that index is incremented as a
+     * side-effect of the calling method.
+     */
+    for (int index = 0; index < 6; )
+        arg[index] = process->getSyscallArg(tc, index);
+
+    /**
+     * Linux supports up to six system call arguments through registers
+     * so we want to print all six. Check to the relevant man page to
+     * verify how many are actually used by a given system call.
+     */
+    DPRINTF_SYSCALL(Base, "%s called w/arguments %d, %d, %d, %d, %d, %d\n",
+                    _name, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]);
+
+    /** Invoke the system call */
+    SyscallReturn retval = (*executor)(this, callnum, process, tc);
+
+    /**
+     * If the system call needs to be restarted, most likely due to
+     * blocking behavior, warn that the system call will retry;
+     * alternatively, print the return value.
+     */
+    if (retval.needsRetry())
+        DPRINTF_SYSCALL(Base, "%s needs retry\n", _name);
+    else
+        DPRINTF_SYSCALL(Base, "%s returns %d\n", _name, retval.encodedValue());
+
+    if (!(_flags & SyscallDesc::SuppressReturnValue) && !retval.needsRetry())
+        process->setSyscallReturn(tc, retval);
+}
+
+bool
+SyscallDesc::needWarning()
+{
+    bool suppress_warning = warnOnce() && _warned;
+    _warned = true;
+    return !suppress_warning;
+}
diff --git a/src/sim/syscall_desc.hh b/src/sim/syscall_desc.hh
new file mode 100644 (file)
index 0000000..4c3ae04
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2012-2013, 2015 ARM Limited
+ * Copyright (c) 2015-2016 Advanced Micro Devices, Inc.
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Steve Reinhardt
+ *          Kevin Lim
+ *          Brandon Potter
+ */
+
+#ifndef __SIM_SYSCALL_DESC_HH__
+#define __SIM_SYSCALL_DESC_HH__
+
+#include <string>
+
+class LiveProcess;
+class SyscallReturn;
+class ThreadContext;
+
+/**
+ * This class provides the wrapper interface for the system call
+ * implementations which are defined in the sim/syscall_emul files and
+ * bound to the ISAs in the architecture specific code
+ * (i.e. arch/X86/linux/process.cc).
+ */
+class SyscallDesc {
+  public:
+    /** Typedef the function pointer here to clean up code below */
+    typedef SyscallReturn (*SyscallExecutor)(SyscallDesc*, int num,
+                                             LiveProcess*, ThreadContext*);
+
+    SyscallDesc(const char *name, SyscallExecutor sys_exec, int flags = 0)
+        : _name(name), executor(sys_exec), _flags(flags), _warned(false)
+    {
+    }
+
+    /** Provide a mechanism to specify behavior for abnormal system calls */
+    enum Flags {
+        /**
+         * Do not set return registers according to executor return value.
+         * Used for system calls with non-standard return conventions that
+         * explicitly set the thread context regs (e.g., sigreturn, clone)
+         */
+        SuppressReturnValue = 1,
+        /** Warn only once for unimplemented system calls */
+        WarnOnce = 2
+        /* X2 = 4, // Remove these comments when the next field is added; */
+        /* X3 = 8, // point is to make it obvious that this defines vector */
+    };
+
+    /**
+     * Interface for invoking the system call funcion pointer. Note that
+     * this acts as a gateway for all system calls and serves a good point
+     * to add filters for behaviors or apply checks for all system calls.
+     * @param callnum Number associated with call (by operating system)
+     * @param proc Handle for the owning Process to pass information
+     * @param tc Handle for owning ThreadContext to pass information
+     */
+    void doSyscall(int callnum, LiveProcess *proc, ThreadContext *tc);
+
+    /**
+     * Return false if WarnOnce is set and a warning has already been issued.
+     * Otherwise, return true. Updates state as a side effect to help
+     * keep track of issued warnings.
+     */
+    bool needWarning();
+
+    bool warnOnce() const { return (_flags & WarnOnce); }
+
+    std::string name() { return _name; }
+
+  private:
+    /** System call name (e.g., open, mmap, clone, socket, etc.) */
+    std::string _name;
+
+    /** Mechanism for ISAs to connect to the emul function definitions */
+    SyscallExecutor executor;
+
+    /**
+     * Holds values set with the preceding enum; note that this has been
+     * used primarily for features that are mutually exclusive, but there's
+     * no reason that this needs to be true going forward.
+     */
+    int _flags;
+
+    /** Set if WarnOnce is specified in flags AFTER first call */
+    bool _warned;
+};
+
+#endif // __SIM_SYSCALL_DESC_HH__
index 499cd25571ab7c9a17a04975bc4302ea84b47350..da89f7a0862635bad064eb4e3cec9b0bc0fd5fdd 100644 (file)
 #include "config/the_isa.hh"
 #include "cpu/base.hh"
 #include "cpu/thread_context.hh"
-#include "debug/SyscallBase.hh"
-#include "debug/SyscallVerbose.hh"
 #include "mem/page_table.hh"
 #include "sim/process.hh"
 #include "sim/sim_exit.hh"
+#include "sim/syscall_debug_macros.hh"
+#include "sim/syscall_desc.hh"
 #include "sim/system.hh"
 
 using namespace std;
 using namespace TheISA;
 
-void
-SyscallDesc::doSyscall(int callnum, LiveProcess *process, ThreadContext *tc)
-{
-    if (DTRACE(SyscallBase)) {
-        int index = 0;
-        IntReg arg[6] M5_VAR_USED;
-
-        // we can't just put the calls to getSyscallArg() in the
-        // DPRINTF arg list, because C++ doesn't guarantee their order
-        for (int i = 0; i < 6; ++i)
-            arg[i] = process->getSyscallArg(tc, index);
-
-        // Linux supports up to six system call arguments through registers
-        // so we want to print all six. Check to the relevant man page to
-        // verify how many are actually used by a given system call.
-        DPRINTF_SYSCALL(Base,
-                        "%s called w/arguments %d, %d, %d, %d, %d, %d\n",
-                        name, arg[0], arg[1], arg[2], arg[3], arg[4],
-                        arg[5]);
-    }
-
-    SyscallReturn retval = (*funcPtr)(this, callnum, process, tc);
-
-    if (retval.needsRetry()) {
-        DPRINTF_SYSCALL(Base, "%s needs retry\n", name);
-    } else {
-        DPRINTF_SYSCALL(Base, "%s returns %d\n", name,
-                        retval.encodedValue());
-    }
-
-    if (!(flags & SyscallDesc::SuppressReturnValue) && !retval.needsRetry())
-        process->setSyscallReturn(tc, retval);
-}
-
-
 SyscallReturn
 unimplementedFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
                   ThreadContext *tc)
 {
-    fatal("syscall %s (#%d) unimplemented.", desc->name, callnum);
+    fatal("syscall %s (#%d) unimplemented.", desc->name(), callnum);
 
     return 1;
 }
@@ -103,20 +68,11 @@ SyscallReturn
 ignoreFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
            ThreadContext *tc)
 {
-    int index = 0;
-    const char *extra_text = "";
-
-    if (desc->warnOnce()) {
-        if (desc->warned)
-            return 0;
-
-        desc->warned = true;
-        extra_text = "\n      (further warnings will be suppressed)";
+    if (desc->needWarning()) {
+        warn("ignoring syscall %s(...)%s", desc->name(), desc->warnOnce() ?
+             "\n      (further warnings will be suppressed)" : "");
     }
 
-    warn("ignoring syscall %s(%d, ...)%s", desc->name,
-         process->getSyscallArg(tc, index), extra_text);
-
     return 0;
 }
 
index a3ac9ed3f3683d3b7fad54281a2dbabe841c4130..3e7221c0b0f4a30beb531b22bc618da6b0e20132 100644 (file)
 #include "config/the_isa.hh"
 #include "cpu/base.hh"
 #include "cpu/thread_context.hh"
-#include "debug/SyscallBase.hh"
-#include "debug/SyscallVerbose.hh"
 #include "mem/page_table.hh"
 #include "sim/byteswap.hh"
 #include "sim/emul_driver.hh"
 #include "sim/process.hh"
+#include "sim/syscall_debug_macros.hh"
 #include "sim/syscall_emul_buf.hh"
-#include "sim/syscallreturn.hh"
+#include "sim/syscall_return.hh"
 #include "sim/system.hh"
 
-// This wrapper macro helps out with readability a bit. FLAGEXT specifies
-// the verbosity and FMT is the message to be appended to the syscall
-// header information. The syscall header information contains the cpuid
-// and thread id.
-#define DPRINTF_SYSCALL(FLAGEXT, FMT, ...)                                  \
-    DPRINTFS(Syscall##FLAGEXT, tc->getCpuPtr(), "T%d : syscall " FMT,       \
-             tc->threadId(), __VA_ARGS__)
-
-///
-/// System call descriptor.
-///
-class SyscallDesc {
-
-  public:
-
-    /// Typedef for target syscall handler functions.
-    typedef SyscallReturn (*FuncPtr)(SyscallDesc *, int num,
-                           LiveProcess *, ThreadContext *);
-
-    const char *name;   //!< Syscall name (e.g., "open").
-    FuncPtr funcPtr;    //!< Pointer to emulation function.
-    int flags;          //!< Flags (see Flags enum).
-    bool warned;        //!< Have we warned about unimplemented syscall?
-
-    /// Flag values for controlling syscall behavior.
-    enum Flags {
-        /// Don't set return regs according to funcPtr return value.
-        /// Used for syscalls with non-standard return conventions
-        /// that explicitly set the ThreadContext regs (e.g.,
-        /// sigreturn).
-        SuppressReturnValue = 1,
-        WarnOnce = 2
-    };
-
-    /// Constructor.
-    SyscallDesc(const char *_name, FuncPtr _funcPtr, int _flags = 0)
-        : name(_name), funcPtr(_funcPtr), flags(_flags), warned(false)
-    {
-    }
-
-    /// Emulate the syscall.  Public interface for calling through funcPtr.
-    void doSyscall(int callnum, LiveProcess *proc, ThreadContext *tc);
-
-    /// Is the WarnOnce flag set?
-    bool warnOnce() const {  return (flags & WarnOnce); }
-};
-
+class SyscallDesc;
 
 //////////////////////////////////////////////////////////////////////
 //
diff --git a/src/sim/syscall_return.hh b/src/sim/syscall_return.hh
new file mode 100644 (file)
index 0000000..fdd7407
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2003-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ */
+
+#ifndef __SIM_SYSCALLRETURN_HH__
+#define __SIM_SYSCALLRETURN_HH__
+
+#include "base/types.hh"
+
+/**
+ * This class represents the return value from an emulated system call,
+ * including any errno setting.
+ *
+ * On some platforms, the return value and errno are encoded in a
+ * single signed integer.  A value less than zero but greater than
+ * -4096 indicates an error, and the value is the negation of the
+ * errno value.  Otherwise, the call was successful and the integer is
+ * the return value.  (Large negative numbers are considered
+ * successful to allow syscalls to return pointers to high memory,
+ * e.g., stack addresses.)  See, for example, Appendix A of the AMD64
+ * ABI spec at http://www.x86-64.org/documentation/abi.pdf.
+ *
+ * Other platforms use a more complex interface, returning a value and
+ * an error code in separate registers.
+ *
+ * This class is designed to support both types of interfaces.
+ */
+class SyscallReturn
+{
+  public:
+
+    /// For simplicity, allow the object to be initialized with a
+    /// single signed integer using the same positive=success,
+    /// negative=-errno convention described above.
+    ///
+    /// Typically this constructor is used as a default type
+    /// conversion, so a bare integer is used where a SyscallReturn
+    /// value is expected, e.g., as the return value from a system
+    /// call emulation function ('return 0;' or 'return -EFAULT;').
+    SyscallReturn(int64_t v)
+        : value(v), retryFlag(false)
+    {}
+
+    /// Pseudo-constructor to create an instance with the retry flag set.
+    static SyscallReturn retry()
+    {
+        SyscallReturn s(0);
+        s.retryFlag = true;
+        return s;
+    }
+
+    ~SyscallReturn() {}
+
+    /// Was the system call successful?
+    bool successful() const
+    {
+        return (value >= 0 || value <= -4096);
+    }
+
+    /// Does the syscall need to be retried?
+    bool needsRetry() const { return retryFlag; }
+
+    /// The return value
+    int64_t returnValue() const
+    {
+        assert(successful());
+        return value;
+    }
+
+    /// The errno value
+    int errnoValue() const
+    {
+        assert(!successful());
+        return -value;
+    }
+
+    /// The encoded value (as described above)
+    int64_t encodedValue() const
+    {
+        return value;
+    }
+
+  private:
+
+    int64_t value;
+
+    bool retryFlag;
+};
+
+#endif
diff --git a/src/sim/syscallreturn.hh b/src/sim/syscallreturn.hh
deleted file mode 100644 (file)
index fdd7407..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2003-2005 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Gabe Black
- */
-
-#ifndef __SIM_SYSCALLRETURN_HH__
-#define __SIM_SYSCALLRETURN_HH__
-
-#include "base/types.hh"
-
-/**
- * This class represents the return value from an emulated system call,
- * including any errno setting.
- *
- * On some platforms, the return value and errno are encoded in a
- * single signed integer.  A value less than zero but greater than
- * -4096 indicates an error, and the value is the negation of the
- * errno value.  Otherwise, the call was successful and the integer is
- * the return value.  (Large negative numbers are considered
- * successful to allow syscalls to return pointers to high memory,
- * e.g., stack addresses.)  See, for example, Appendix A of the AMD64
- * ABI spec at http://www.x86-64.org/documentation/abi.pdf.
- *
- * Other platforms use a more complex interface, returning a value and
- * an error code in separate registers.
- *
- * This class is designed to support both types of interfaces.
- */
-class SyscallReturn
-{
-  public:
-
-    /// For simplicity, allow the object to be initialized with a
-    /// single signed integer using the same positive=success,
-    /// negative=-errno convention described above.
-    ///
-    /// Typically this constructor is used as a default type
-    /// conversion, so a bare integer is used where a SyscallReturn
-    /// value is expected, e.g., as the return value from a system
-    /// call emulation function ('return 0;' or 'return -EFAULT;').
-    SyscallReturn(int64_t v)
-        : value(v), retryFlag(false)
-    {}
-
-    /// Pseudo-constructor to create an instance with the retry flag set.
-    static SyscallReturn retry()
-    {
-        SyscallReturn s(0);
-        s.retryFlag = true;
-        return s;
-    }
-
-    ~SyscallReturn() {}
-
-    /// Was the system call successful?
-    bool successful() const
-    {
-        return (value >= 0 || value <= -4096);
-    }
-
-    /// Does the syscall need to be retried?
-    bool needsRetry() const { return retryFlag; }
-
-    /// The return value
-    int64_t returnValue() const
-    {
-        assert(successful());
-        return value;
-    }
-
-    /// The errno value
-    int errnoValue() const
-    {
-        assert(!successful());
-        return -value;
-    }
-
-    /// The encoded value (as described above)
-    int64_t encodedValue() const
-    {
-        return value;
-    }
-
-  private:
-
-    int64_t value;
-
-    bool retryFlag;
-};
-
-#endif