syscall_desc.cc revision 11877
1/* 2 * Copyright (c) 2016 Advanced Micro Devices, Inc. 3 * Copyright (c) 2003-2005 The Regents of The University of Michigan 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer; 10 * redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution; 13 * neither the name of the copyright holders nor the names of its 14 * contributors may be used to endorse or promote products derived from 15 * this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Authors: Steve Reinhardt 30 * Ali Saidi 31 * Brandon Potter 32 */ 33 34#include "sim/syscall_desc.hh" 35 36#include <memory> 37 38#include "base/trace.hh" 39#include "base/types.hh" 40#include "config/the_isa.hh" 41#include "cpu/base.hh" 42#include "cpu/thread_context.hh" 43#include "sim/faults.hh" 44#include "sim/process.hh" 45#include "sim/syscall_debug_macros.hh" 46#include "sim/syscall_return.hh" 47 48void 49SyscallDesc::doSyscall(int callnum, Process *process, ThreadContext *tc, 50 Fault *fault) 51{ 52 TheISA::IntReg arg[6] M5_VAR_USED; 53 54 /** 55 * Step through the first six parameters for the system call and 56 * retrieve their values. Note that index is incremented as a 57 * side-effect of the getSyscallArg method which is why the LHS 58 * needs the "-1". 59 */ 60 for (int index = 0; index < 6; ) 61 arg[index - 1] = process->getSyscallArg(tc, index); 62 63 /** 64 * Linux supports up to six system call arguments through registers 65 * so we want to print all six. Check to the relevant man page to 66 * verify how many are actually used by a given system call. 67 */ 68 DPRINTF_SYSCALL(Base, "%s called w/arguments %d, %d, %d, %d, %d, %d\n", 69 _name, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]); 70 71 /** Invoke the system call */ 72 SyscallReturn retval = (*executor)(this, callnum, process, tc); 73 74 /** 75 * If the system call needs to be restarted, most likely due to 76 * blocking behavior, warn that the system call will retry; 77 * alternatively, print the return value. 78 */ 79 if (retval.needsRetry()) { 80 *fault = std::make_shared<SyscallRetryFault>(); 81 DPRINTF_SYSCALL(Base, "%s needs retry\n", _name); 82 } else 83 DPRINTF_SYSCALL(Base, "%s returns %d\n", _name, retval.encodedValue()); 84 85 if (!(_flags & SyscallDesc::SuppressReturnValue) && !retval.needsRetry()) 86 process->setSyscallReturn(tc, retval); 87} 88 89bool 90SyscallDesc::needWarning() 91{ 92 bool suppress_warning = warnOnce() && _warned; 93 _warned = true; 94 return !suppress_warning; 95} 96