process.cc revision 4188
17405SAli.Saidi@ARM.com/*
27405SAli.Saidi@ARM.com * Copyright (c) 2003-2005 The Regents of The University of Michigan
37405SAli.Saidi@ARM.com * All rights reserved.
47405SAli.Saidi@ARM.com *
57405SAli.Saidi@ARM.com * Redistribution and use in source and binary forms, with or without
67405SAli.Saidi@ARM.com * modification, are permitted provided that the following conditions are
77405SAli.Saidi@ARM.com * met: redistributions of source code must retain the above copyright
87405SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer;
97405SAli.Saidi@ARM.com * redistributions in binary form must reproduce the above copyright
107405SAli.Saidi@ARM.com * notice, this list of conditions and the following disclaimer in the
117405SAli.Saidi@ARM.com * documentation and/or other materials provided with the distribution;
127405SAli.Saidi@ARM.com * neither the name of the copyright holders nor the names of its
137405SAli.Saidi@ARM.com * contributors may be used to endorse or promote products derived from
147405SAli.Saidi@ARM.com * this software without specific prior written permission.
157405SAli.Saidi@ARM.com *
167405SAli.Saidi@ARM.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
177405SAli.Saidi@ARM.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
187405SAli.Saidi@ARM.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
197405SAli.Saidi@ARM.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
207405SAli.Saidi@ARM.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
217405SAli.Saidi@ARM.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
227405SAli.Saidi@ARM.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
237405SAli.Saidi@ARM.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
247405SAli.Saidi@ARM.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
257405SAli.Saidi@ARM.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
267405SAli.Saidi@ARM.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
277405SAli.Saidi@ARM.com *
287405SAli.Saidi@ARM.com * Authors: Steve Reinhardt
297405SAli.Saidi@ARM.com *          Gabe Black
307405SAli.Saidi@ARM.com *          Ali Saidi
317405SAli.Saidi@ARM.com */
327405SAli.Saidi@ARM.com
337405SAli.Saidi@ARM.com#include "arch/sparc/isa_traits.hh"
347405SAli.Saidi@ARM.com#include "arch/sparc/linux/process.hh"
357405SAli.Saidi@ARM.com#include "arch/sparc/regfile.hh"
367405SAli.Saidi@ARM.com
377405SAli.Saidi@ARM.com#include "base/trace.hh"
387405SAli.Saidi@ARM.com#include "cpu/thread_context.hh"
397405SAli.Saidi@ARM.com#include "kern/linux/linux.hh"
407405SAli.Saidi@ARM.com
417405SAli.Saidi@ARM.com#include "sim/process.hh"
427678Sgblack@eecs.umich.edu#include "sim/syscall_emul.hh"
438059SAli.Saidi@ARM.com
447405SAli.Saidi@ARM.comusing namespace std;
457405SAli.Saidi@ARM.comusing namespace SparcISA;
467405SAli.Saidi@ARM.com
477405SAli.Saidi@ARM.comSyscallDesc*
487427Sgblack@eecs.umich.eduSparcLinuxProcess::getDesc(int callnum)
497427Sgblack@eecs.umich.edu{
507427Sgblack@eecs.umich.edu    if (callnum < 0 || callnum > Num_Syscall_Descs)
517427Sgblack@eecs.umich.edu        return NULL;
527427Sgblack@eecs.umich.edu    return &syscallDescs[callnum];
537427Sgblack@eecs.umich.edu}
547427Sgblack@eecs.umich.edu
557427Sgblack@eecs.umich.eduSyscallDesc*
567427Sgblack@eecs.umich.eduSparcLinuxProcess::getDesc32(int callnum)
577427Sgblack@eecs.umich.edu{
587427Sgblack@eecs.umich.edu    if (callnum < 0 || callnum > Num_Syscall32_Descs)
597427Sgblack@eecs.umich.edu        return NULL;
607604SGene.Wu@arm.com    return &syscall32Descs[callnum];
617427Sgblack@eecs.umich.edu}
627427Sgblack@eecs.umich.edu
637427Sgblack@eecs.umich.eduSparcLinuxProcess::SparcLinuxProcess() :
647427Sgblack@eecs.umich.edu    Num_Syscall_Descs(284), //sizeof(syscallDescs) / sizeof(SyscallDesc)),
657427Sgblack@eecs.umich.edu    Num_Syscall32_Descs(299) //sizeof(syscall32Descs) / sizeof(SyscallDesc))
667427Sgblack@eecs.umich.edu{
677427Sgblack@eecs.umich.edu    // The sparc syscall table must be <= 284 entries because that is all there
687427Sgblack@eecs.umich.edu    // is space for.
697427Sgblack@eecs.umich.edu    assert(Num_Syscall_Descs <= 284);
707427Sgblack@eecs.umich.edu    // The sparc 32 bit syscall table bust be <= 299 entries because that is
717427Sgblack@eecs.umich.edu    // all there is space for.
727427Sgblack@eecs.umich.edu    assert(Num_Syscall_Descs <= 299);
737427Sgblack@eecs.umich.edu}
747427Sgblack@eecs.umich.edu
757427Sgblack@eecs.umich.eduSparc32LinuxProcess::Sparc32LinuxProcess(const std::string &name,
767427Sgblack@eecs.umich.edu                                         ObjectFile *objFile,
777427Sgblack@eecs.umich.edu                                         System * system,
787427Sgblack@eecs.umich.edu                                         int stdin_fd,
797645Sali.saidi@arm.com                                         int stdout_fd,
807645Sali.saidi@arm.com                                         int stderr_fd,
817645Sali.saidi@arm.com                                         std::vector<std::string> &argv,
827645Sali.saidi@arm.com                                         std::vector<std::string> &envp,
837645Sali.saidi@arm.com                                         const std::string &cwd,
847427Sgblack@eecs.umich.edu                                         uint64_t _uid, uint64_t _euid,
857427Sgblack@eecs.umich.edu                                         uint64_t _gid, uint64_t _egid,
867427Sgblack@eecs.umich.edu                                         uint64_t _pid, uint64_t _ppid)
877427Sgblack@eecs.umich.edu    : Sparc32LiveProcess(name, objFile, system,
887427Sgblack@eecs.umich.edu            stdin_fd, stdout_fd, stderr_fd, argv, envp, cwd,
897427Sgblack@eecs.umich.edu            _uid, _euid, _gid, _egid, _pid, _ppid)
907427Sgblack@eecs.umich.edu{}
917427Sgblack@eecs.umich.edu
927427Sgblack@eecs.umich.eduvoid Sparc32LinuxProcess::handleTrap(int trapNum, ThreadContext *tc)
937427Sgblack@eecs.umich.edu{
947427Sgblack@eecs.umich.edu    switch(trapNum)
957427Sgblack@eecs.umich.edu    {
967427Sgblack@eecs.umich.edu      case 0x10: //Linux 32 bit syscall trap
977427Sgblack@eecs.umich.edu        tc->syscall(tc->readIntReg(1));
987427Sgblack@eecs.umich.edu        break;
997427Sgblack@eecs.umich.edu      default:
1007427Sgblack@eecs.umich.edu        SparcLiveProcess::handleTrap(trapNum, tc);
1017427Sgblack@eecs.umich.edu    }
1027427Sgblack@eecs.umich.edu}
1037427Sgblack@eecs.umich.edu
1047427Sgblack@eecs.umich.eduSparc64LinuxProcess::Sparc64LinuxProcess(const std::string &name,
1057427Sgblack@eecs.umich.edu                                         ObjectFile *objFile,
1067427Sgblack@eecs.umich.edu                                         System * system,
1077427Sgblack@eecs.umich.edu                                         int stdin_fd,
1087427Sgblack@eecs.umich.edu                                         int stdout_fd,
1097427Sgblack@eecs.umich.edu                                         int stderr_fd,
1107427Sgblack@eecs.umich.edu                                         std::vector<std::string> &argv,
1117427Sgblack@eecs.umich.edu                                         std::vector<std::string> &envp,
1127436Sdam.sunwoo@arm.com                                         const std::string &cwd,
1137436Sdam.sunwoo@arm.com                                         uint64_t _uid, uint64_t _euid,
1147436Sdam.sunwoo@arm.com                                         uint64_t _gid, uint64_t _egid,
1157436Sdam.sunwoo@arm.com                                         uint64_t _pid, uint64_t _ppid)
1167436Sdam.sunwoo@arm.com    : Sparc64LiveProcess(name, objFile, system,
1177436Sdam.sunwoo@arm.com            stdin_fd, stdout_fd, stderr_fd, argv, envp, cwd,
1187436Sdam.sunwoo@arm.com            _uid, _euid, _gid, _egid, _pid, _ppid)
1197436Sdam.sunwoo@arm.com{}
1207436Sdam.sunwoo@arm.com
1217436Sdam.sunwoo@arm.comvoid Sparc64LinuxProcess::handleTrap(int trapNum, ThreadContext *tc)
1227436Sdam.sunwoo@arm.com{
1237436Sdam.sunwoo@arm.com    switch(trapNum)
1247436Sdam.sunwoo@arm.com    {
1257436Sdam.sunwoo@arm.com      //case 0x10: //Linux 32 bit syscall trap
1267436Sdam.sunwoo@arm.com      case 0x6d: //Linux 64 bit syscall trap
1277436Sdam.sunwoo@arm.com        tc->syscall(tc->readIntReg(1));
1287436Sdam.sunwoo@arm.com        break;
1297436Sdam.sunwoo@arm.com      default:
1307436Sdam.sunwoo@arm.com        SparcLiveProcess::handleTrap(trapNum, tc);
1317436Sdam.sunwoo@arm.com    }
1327436Sdam.sunwoo@arm.com}
1337436Sdam.sunwoo@arm.com