process.cc revision 4188
12199SN/A/* 22199SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 32199SN/A * All rights reserved. 42199SN/A * 52199SN/A * Redistribution and use in source and binary forms, with or without 62199SN/A * modification, are permitted provided that the following conditions are 72199SN/A * met: redistributions of source code must retain the above copyright 82199SN/A * notice, this list of conditions and the following disclaimer; 92199SN/A * redistributions in binary form must reproduce the above copyright 102199SN/A * notice, this list of conditions and the following disclaimer in the 112199SN/A * documentation and/or other materials provided with the distribution; 122199SN/A * neither the name of the copyright holders nor the names of its 132199SN/A * contributors may be used to endorse or promote products derived from 142199SN/A * this software without specific prior written permission. 152199SN/A * 162199SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172199SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182199SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192199SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202199SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212199SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222199SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232199SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242199SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252199SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262199SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Steve Reinhardt 292665Ssaidi@eecs.umich.edu * Gabe Black 302665Ssaidi@eecs.umich.edu * Ali Saidi 312199SN/A */ 322199SN/A 332561SN/A#include "arch/sparc/isa_traits.hh" 342226SN/A#include "arch/sparc/linux/process.hh" 352561SN/A#include "arch/sparc/regfile.hh" 362199SN/A 372199SN/A#include "base/trace.hh" 382680Sktlim@umich.edu#include "cpu/thread_context.hh" 392199SN/A#include "kern/linux/linux.hh" 402199SN/A 412199SN/A#include "sim/process.hh" 422199SN/A#include "sim/syscall_emul.hh" 432199SN/A 442199SN/Ausing namespace std; 452209SN/Ausing namespace SparcISA; 462199SN/A 472199SN/ASyscallDesc* 482458SN/ASparcLinuxProcess::getDesc(int callnum) 492199SN/A{ 502199SN/A if (callnum < 0 || callnum > Num_Syscall_Descs) 512199SN/A return NULL; 522199SN/A return &syscallDescs[callnum]; 532199SN/A} 544111Sgblack@eecs.umich.edu 554188Sgblack@eecs.umich.eduSyscallDesc* 564188Sgblack@eecs.umich.eduSparcLinuxProcess::getDesc32(int callnum) 574188Sgblack@eecs.umich.edu{ 584188Sgblack@eecs.umich.edu if (callnum < 0 || callnum > Num_Syscall32_Descs) 594188Sgblack@eecs.umich.edu return NULL; 604188Sgblack@eecs.umich.edu return &syscall32Descs[callnum]; 614188Sgblack@eecs.umich.edu} 624111Sgblack@eecs.umich.edu 634111Sgblack@eecs.umich.eduSparcLinuxProcess::SparcLinuxProcess() : 644188Sgblack@eecs.umich.edu Num_Syscall_Descs(284), //sizeof(syscallDescs) / sizeof(SyscallDesc)), 654188Sgblack@eecs.umich.edu Num_Syscall32_Descs(299) //sizeof(syscall32Descs) / sizeof(SyscallDesc)) 664111Sgblack@eecs.umich.edu{ 674111Sgblack@eecs.umich.edu // The sparc syscall table must be <= 284 entries because that is all there 684111Sgblack@eecs.umich.edu // is space for. 694111Sgblack@eecs.umich.edu assert(Num_Syscall_Descs <= 284); 704188Sgblack@eecs.umich.edu // The sparc 32 bit syscall table bust be <= 299 entries because that is 714188Sgblack@eecs.umich.edu // all there is space for. 724188Sgblack@eecs.umich.edu assert(Num_Syscall_Descs <= 299); 734111Sgblack@eecs.umich.edu} 744111Sgblack@eecs.umich.edu 754111Sgblack@eecs.umich.eduSparc32LinuxProcess::Sparc32LinuxProcess(const std::string &name, 764111Sgblack@eecs.umich.edu ObjectFile *objFile, 774111Sgblack@eecs.umich.edu System * system, 784111Sgblack@eecs.umich.edu int stdin_fd, 794111Sgblack@eecs.umich.edu int stdout_fd, 804111Sgblack@eecs.umich.edu int stderr_fd, 814111Sgblack@eecs.umich.edu std::vector<std::string> &argv, 824111Sgblack@eecs.umich.edu std::vector<std::string> &envp, 834111Sgblack@eecs.umich.edu const std::string &cwd, 844111Sgblack@eecs.umich.edu uint64_t _uid, uint64_t _euid, 854111Sgblack@eecs.umich.edu uint64_t _gid, uint64_t _egid, 864111Sgblack@eecs.umich.edu uint64_t _pid, uint64_t _ppid) 874111Sgblack@eecs.umich.edu : Sparc32LiveProcess(name, objFile, system, 884111Sgblack@eecs.umich.edu stdin_fd, stdout_fd, stderr_fd, argv, envp, cwd, 894111Sgblack@eecs.umich.edu _uid, _euid, _gid, _egid, _pid, _ppid) 904111Sgblack@eecs.umich.edu{} 914111Sgblack@eecs.umich.edu 924111Sgblack@eecs.umich.eduvoid Sparc32LinuxProcess::handleTrap(int trapNum, ThreadContext *tc) 934111Sgblack@eecs.umich.edu{ 944111Sgblack@eecs.umich.edu switch(trapNum) 954111Sgblack@eecs.umich.edu { 964111Sgblack@eecs.umich.edu case 0x10: //Linux 32 bit syscall trap 974111Sgblack@eecs.umich.edu tc->syscall(tc->readIntReg(1)); 984111Sgblack@eecs.umich.edu break; 994111Sgblack@eecs.umich.edu default: 1004111Sgblack@eecs.umich.edu SparcLiveProcess::handleTrap(trapNum, tc); 1014111Sgblack@eecs.umich.edu } 1024111Sgblack@eecs.umich.edu} 1034111Sgblack@eecs.umich.edu 1044111Sgblack@eecs.umich.eduSparc64LinuxProcess::Sparc64LinuxProcess(const std::string &name, 1054111Sgblack@eecs.umich.edu ObjectFile *objFile, 1064111Sgblack@eecs.umich.edu System * system, 1074111Sgblack@eecs.umich.edu int stdin_fd, 1084111Sgblack@eecs.umich.edu int stdout_fd, 1094111Sgblack@eecs.umich.edu int stderr_fd, 1104111Sgblack@eecs.umich.edu std::vector<std::string> &argv, 1114111Sgblack@eecs.umich.edu std::vector<std::string> &envp, 1124111Sgblack@eecs.umich.edu const std::string &cwd, 1134111Sgblack@eecs.umich.edu uint64_t _uid, uint64_t _euid, 1144111Sgblack@eecs.umich.edu uint64_t _gid, uint64_t _egid, 1154111Sgblack@eecs.umich.edu uint64_t _pid, uint64_t _ppid) 1164111Sgblack@eecs.umich.edu : Sparc64LiveProcess(name, objFile, system, 1174111Sgblack@eecs.umich.edu stdin_fd, stdout_fd, stderr_fd, argv, envp, cwd, 1184111Sgblack@eecs.umich.edu _uid, _euid, _gid, _egid, _pid, _ppid) 1194111Sgblack@eecs.umich.edu{} 1204111Sgblack@eecs.umich.edu 1214111Sgblack@eecs.umich.eduvoid Sparc64LinuxProcess::handleTrap(int trapNum, ThreadContext *tc) 1224111Sgblack@eecs.umich.edu{ 1234111Sgblack@eecs.umich.edu switch(trapNum) 1244111Sgblack@eecs.umich.edu { 1254188Sgblack@eecs.umich.edu //case 0x10: //Linux 32 bit syscall trap 1264111Sgblack@eecs.umich.edu case 0x6d: //Linux 64 bit syscall trap 1274111Sgblack@eecs.umich.edu tc->syscall(tc->readIntReg(1)); 1284111Sgblack@eecs.umich.edu break; 1294111Sgblack@eecs.umich.edu default: 1304111Sgblack@eecs.umich.edu SparcLiveProcess::handleTrap(trapNum, tc); 1314111Sgblack@eecs.umich.edu } 1324111Sgblack@eecs.umich.edu} 133