2016-11-09 21:27:40 +01:00
|
|
|
/*
|
|
|
|
* 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>
|
|
|
|
|
2015-07-20 16:15:21 +02:00
|
|
|
#include "base/types.hh"
|
|
|
|
|
2016-11-09 21:27:40 +01:00
|
|
|
class Process;
|
2016-11-09 21:27:40 +01:00
|
|
|
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,
|
2016-11-09 21:27:40 +01:00
|
|
|
Process*, ThreadContext*);
|
2016-11-09 21:27:40 +01:00
|
|
|
|
|
|
|
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
|
|
|
|
*/
|
2015-07-20 16:15:21 +02:00
|
|
|
void doSyscall(int callnum, Process *proc, ThreadContext *tc,
|
|
|
|
Fault *fault);
|
2016-11-09 21:27:40 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* 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; }
|
|
|
|
|
2017-02-27 20:10:15 +01:00
|
|
|
int getFlags() const { return _flags; }
|
|
|
|
|
|
|
|
void setFlags(int flags) { _flags = flags; }
|
|
|
|
|
2016-11-09 21:27:40 +01:00
|
|
|
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__
|