syscall_desc.cc revision 11851:824055fe6b30
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, Process *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 getSyscallArg method which is why the LHS 53 * needs the "-1". 54 */ 55 for (int index = 0; index < 6; ) 56 arg[index - 1] = process->getSyscallArg(tc, index); 57 58 /** 59 * Linux supports up to six system call arguments through registers 60 * so we want to print all six. Check to the relevant man page to 61 * verify how many are actually used by a given system call. 62 */ 63 DPRINTF_SYSCALL(Base, "%s called w/arguments %d, %d, %d, %d, %d, %d\n", 64 _name, arg[0], arg[1], arg[2], arg[3], arg[4], arg[5]); 65 66 /** Invoke the system call */ 67 SyscallReturn retval = (*executor)(this, callnum, process, tc); 68 69 /** 70 * If the system call needs to be restarted, most likely due to 71 * blocking behavior, warn that the system call will retry; 72 * alternatively, print the return value. 73 */ 74 if (retval.needsRetry()) 75 DPRINTF_SYSCALL(Base, "%s needs retry\n", _name); 76 else 77 DPRINTF_SYSCALL(Base, "%s returns %d\n", _name, retval.encodedValue()); 78 79 if (!(_flags & SyscallDesc::SuppressReturnValue) && !retval.needsRetry()) 80 process->setSyscallReturn(tc, retval); 81} 82 83bool 84SyscallDesc::needWarning() 85{ 86 bool suppress_warning = warnOnce() && _warned; 87 _warned = true; 88 return !suppress_warning; 89} 90