process.cc revision 5981
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{ 505981Sstever@gmail.com 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{ 585981Sstever@gmail.com 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 755154Sgblack@eecs.umich.eduSparc32LinuxProcess::Sparc32LinuxProcess(LiveProcessParams * params, 765154Sgblack@eecs.umich.edu ObjectFile *objFile) 775154Sgblack@eecs.umich.edu : Sparc32LiveProcess(params, objFile) 784111Sgblack@eecs.umich.edu{} 794111Sgblack@eecs.umich.edu 804111Sgblack@eecs.umich.eduvoid Sparc32LinuxProcess::handleTrap(int trapNum, ThreadContext *tc) 814111Sgblack@eecs.umich.edu{ 824111Sgblack@eecs.umich.edu switch(trapNum) 834111Sgblack@eecs.umich.edu { 844111Sgblack@eecs.umich.edu case 0x10: //Linux 32 bit syscall trap 854111Sgblack@eecs.umich.edu tc->syscall(tc->readIntReg(1)); 864111Sgblack@eecs.umich.edu break; 874111Sgblack@eecs.umich.edu default: 884111Sgblack@eecs.umich.edu SparcLiveProcess::handleTrap(trapNum, tc); 894111Sgblack@eecs.umich.edu } 904111Sgblack@eecs.umich.edu} 914111Sgblack@eecs.umich.edu 925154Sgblack@eecs.umich.eduSparc64LinuxProcess::Sparc64LinuxProcess(LiveProcessParams * params, 935154Sgblack@eecs.umich.edu ObjectFile *objFile) 945154Sgblack@eecs.umich.edu : Sparc64LiveProcess(params, objFile) 954111Sgblack@eecs.umich.edu{} 964111Sgblack@eecs.umich.edu 974111Sgblack@eecs.umich.eduvoid Sparc64LinuxProcess::handleTrap(int trapNum, ThreadContext *tc) 984111Sgblack@eecs.umich.edu{ 994111Sgblack@eecs.umich.edu switch(trapNum) 1004111Sgblack@eecs.umich.edu { 1014188Sgblack@eecs.umich.edu //case 0x10: //Linux 32 bit syscall trap 1024111Sgblack@eecs.umich.edu case 0x6d: //Linux 64 bit syscall trap 1034111Sgblack@eecs.umich.edu tc->syscall(tc->readIntReg(1)); 1044111Sgblack@eecs.umich.edu break; 1054111Sgblack@eecs.umich.edu default: 1064111Sgblack@eecs.umich.edu SparcLiveProcess::handleTrap(trapNum, tc); 1074111Sgblack@eecs.umich.edu } 1084111Sgblack@eecs.umich.edu} 109