syscall_desc.cc revision 11794
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 "base/trace.hh" 37#include "config/the_isa.hh" 38#include "cpu/base.hh" 39#include "cpu/thread_context.hh" 40#include "sim/process.hh" 41#include "sim/syscall_debug_macros.hh" 42#include "sim/syscall_return.hh" 43 44void 45SyscallDesc::doSyscall(int callnum, LiveProcess *process, ThreadContext *tc) 46{ 47 TheISA::IntReg arg[6] M5_VAR_USED; 48 49 /** 50 * Step through the first six parameters for the system call and 51 * retrieve their values. Note that index is incremented as a 52 * side-effect of the calling method. 53 */ 54 for (int index = 0; index < 6; ) 55 arg[index] = process->getSyscallArg(tc, index); 56 57 /** 58 * Linux supports up to six system call arguments through registers 59 * so we want to print all six. Check to the relevant man page to 60 * verify how many are actually used by a given system call. 61 */ 62 DPRINTF_SYSCALL(Base, "%s called w/arguments %d, %d, %d, %d, %d, %d\n", 63 _name, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]); 64 65 /** Invoke the system call */ 66 SyscallReturn retval = (*executor)(this, callnum, process, tc); 67 68 /** 69 * If the system call needs to be restarted, most likely due to 70 * blocking behavior, warn that the system call will retry; 71 * alternatively, print the return value. 72 */ 73 if (retval.needsRetry()) 74 DPRINTF_SYSCALL(Base, "%s needs retry\n", _name); 75 else 76 DPRINTF_SYSCALL(Base, "%s returns %d\n", _name, retval.encodedValue()); 77 78 if (!(_flags & SyscallDesc::SuppressReturnValue) && !retval.needsRetry()) 79 process->setSyscallReturn(tc, retval); 80} 81 82bool 83SyscallDesc::needWarning() 84{ 85 bool suppress_warning = warnOnce() && _warned; 86 _warned = true; 87 return !suppress_warning; 88} 89