diff options
author | Brandon Potter <brandon.potter@amd.com> | 2016-11-09 14:27:40 -0600 |
---|---|---|
committer | Brandon Potter <brandon.potter@amd.com> | 2016-11-09 14:27:40 -0600 |
commit | 1ced08c85055d5da845ca549c0f5fcea65ee3e08 (patch) | |
tree | d0e6b2bbd69b07281a35ac561697a1b145591042 /src/sim/syscall_return.hh | |
parent | 7a8dda49a4ec33be17bbd101ebd68e02562b9c3d (diff) | |
download | gem5-1ced08c85055d5da845ca549c0f5fcea65ee3e08.tar.xz |
syscall_emul: [patch 2/22] move SyscallDesc into its own .hh and .cc
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
Diffstat (limited to 'src/sim/syscall_return.hh')
-rw-r--r-- | src/sim/syscall_return.hh | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/sim/syscall_return.hh b/src/sim/syscall_return.hh new file mode 100644 index 000000000..fdd740775 --- /dev/null +++ b/src/sim/syscall_return.hh @@ -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 |