syscall_desc.cc (13557:fc33e6048b25) | syscall_desc.cc (13995:5d459168a680) |
---|---|
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 --- 32 unchanged lines hidden (view full) --- 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 | 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 --- 32 unchanged lines hidden (view full) --- 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) | 49SyscallDesc::doSyscall(int callnum, ThreadContext *tc, Fault *fault) |
51{ 52 RegVal arg[6] M5_VAR_USED; | 50{ 51 RegVal arg[6] M5_VAR_USED; |
52 auto process = tc->getProcessPtr(); |
|
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. 58 */ 59 int index = 0; 60 for (int i = 0; i < 6; i++) 61 arg[i] = 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 */ | 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. 58 */ 59 int index = 0; 60 for (int i = 0; i < 6; i++) 61 arg[i] = 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); | 72 SyscallReturn retval = (*executor)(this, callnum, 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>(); --- 15 unchanged lines hidden --- | 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>(); --- 15 unchanged lines hidden --- |