process.hh revision 11886
113540Sandrea.mondelli@ucf.edu/* 22357Sktlim@umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company 32357Sktlim@umich.edu * All rights reserved. 42357Sktlim@umich.edu * 52357Sktlim@umich.edu * The license below extends only to copyright in the software and shall 62357Sktlim@umich.edu * not be construed as granting a license to any other intellectual 72357Sktlim@umich.edu * property including but not limited to intellectual property relating 82357Sktlim@umich.edu * to a hardware implementation of the functionality of the software 92357Sktlim@umich.edu * licensed hereunder. You may use the software subject to the license 102357Sktlim@umich.edu * terms below provided that you ensure that this notice is replicated 112357Sktlim@umich.edu * unmodified and in its entirety in all distributions of the software, 122357Sktlim@umich.edu * modified or unmodified, in source code or in binary form. 132357Sktlim@umich.edu * 142357Sktlim@umich.edu * Redistribution and use in source and binary forms, with or without 152357Sktlim@umich.edu * modification, are permitted provided that the following conditions are 162357Sktlim@umich.edu * met: redistributions of source code must retain the above copyright 172357Sktlim@umich.edu * notice, this list of conditions and the following disclaimer; 182357Sktlim@umich.edu * redistributions in binary form must reproduce the above copyright 192357Sktlim@umich.edu * notice, this list of conditions and the following disclaimer in the 202357Sktlim@umich.edu * documentation and/or other materials provided with the distribution; 212357Sktlim@umich.edu * neither the name of the copyright holders nor the names of its 222357Sktlim@umich.edu * contributors may be used to endorse or promote products derived from 232357Sktlim@umich.edu * this software without specific prior written permission. 242357Sktlim@umich.edu * 252357Sktlim@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 262357Sktlim@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 272357Sktlim@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 282357Sktlim@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 292357Sktlim@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 302357Sktlim@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 312357Sktlim@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 322357Sktlim@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 332357Sktlim@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 342357Sktlim@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 352357Sktlim@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 362357Sktlim@umich.edu * 372357Sktlim@umich.edu * Authors: Gabe Black 382357Sktlim@umich.edu */ 392357Sktlim@umich.edu 402357Sktlim@umich.edu#ifndef __ARCH_X86_PROCESS_HH__ 412357Sktlim@umich.edu#define __ARCH_X86_PROCESS_HH__ 422357Sktlim@umich.edu 432357Sktlim@umich.edu#include <string> 442357Sktlim@umich.edu#include <vector> 452357Sktlim@umich.edu 462357Sktlim@umich.edu#include "sim/aux_vector.hh" 472357Sktlim@umich.edu#include "sim/process.hh" 482357Sktlim@umich.edu#include "mem/multi_level_page_table.hh" 492357Sktlim@umich.edu 502357Sktlim@umich.educlass SyscallDesc; 512357Sktlim@umich.edu 522357Sktlim@umich.edunamespace X86ISA 532357Sktlim@umich.edu{ 542357Sktlim@umich.edu enum X86AuxiliaryVectorTypes { 552357Sktlim@umich.edu M5_AT_SYSINFO = 32, 562357Sktlim@umich.edu M5_AT_SYSINFO_EHDR = 33 572357Sktlim@umich.edu }; 582357Sktlim@umich.edu 592357Sktlim@umich.edu class X86Process : public Process 602357Sktlim@umich.edu { 612357Sktlim@umich.edu protected: 622357Sktlim@umich.edu Addr _gdtStart; 632357Sktlim@umich.edu Addr _gdtSize; 642357Sktlim@umich.edu 652357Sktlim@umich.edu SyscallDesc *syscallDescs; 662357Sktlim@umich.edu const int numSyscallDescs; 672357Sktlim@umich.edu 682357Sktlim@umich.edu X86Process(ProcessParams * params, ObjectFile *objFile, 692357Sktlim@umich.edu SyscallDesc *_syscallDescs, int _numSyscallDescs); 702357Sktlim@umich.edu 712357Sktlim@umich.edu template<class IntType> 722357Sktlim@umich.edu void argsInit(int pageSize, 732357Sktlim@umich.edu std::vector<AuxVector<IntType> > extraAuxvs); 742357Sktlim@umich.edu 752357Sktlim@umich.edu public: 762357Sktlim@umich.edu Addr gdtStart() 772357Sktlim@umich.edu { return _gdtStart; } 782357Sktlim@umich.edu 792357Sktlim@umich.edu Addr gdtSize() 802357Sktlim@umich.edu { return _gdtSize; } 812357Sktlim@umich.edu 822357Sktlim@umich.edu SyscallDesc* getDesc(int callnum); 832357Sktlim@umich.edu 842357Sktlim@umich.edu void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value); 852357Sktlim@umich.edu void clone(ThreadContext *old_tc, ThreadContext *new_tc, 862357Sktlim@umich.edu Process *process, TheISA::IntReg flags); 872357Sktlim@umich.edu 882357Sktlim@umich.edu X86Process & 892357Sktlim@umich.edu operator=(const X86Process &in) 902357Sktlim@umich.edu { 912357Sktlim@umich.edu if (this == &in) 922357Sktlim@umich.edu return *this; 932357Sktlim@umich.edu 942357Sktlim@umich.edu _gdtStart = in._gdtStart; 952357Sktlim@umich.edu _gdtSize = in._gdtSize; 962357Sktlim@umich.edu syscallDescs = in.syscallDescs; 972357Sktlim@umich.edu 982357Sktlim@umich.edu return *this; 992357Sktlim@umich.edu } 1002357Sktlim@umich.edu }; 1012357Sktlim@umich.edu 1022357Sktlim@umich.edu class X86_64Process : public X86Process 1032357Sktlim@umich.edu { 1042357Sktlim@umich.edu protected: 1052357Sktlim@umich.edu X86_64Process(ProcessParams *params, ObjectFile *objFile, 1062357Sktlim@umich.edu SyscallDesc *_syscallDescs, int _numSyscallDescs); 1072357Sktlim@umich.edu 1082357Sktlim@umich.edu class VSyscallPage 1092357Sktlim@umich.edu { 1102357Sktlim@umich.edu public: 1112357Sktlim@umich.edu Addr base; 1122357Sktlim@umich.edu Addr size; 1132357Sktlim@umich.edu Addr vtimeOffset; 1142357Sktlim@umich.edu Addr vgettimeofdayOffset; 1152357Sktlim@umich.edu 1162357Sktlim@umich.edu VSyscallPage & 1172357Sktlim@umich.edu operator=(const VSyscallPage &in) 1182357Sktlim@umich.edu { 1192357Sktlim@umich.edu if (this == &in) 1202357Sktlim@umich.edu return *this; 1212357Sktlim@umich.edu 1222357Sktlim@umich.edu base = in.base; 1232357Sktlim@umich.edu size = in.size; 1242357Sktlim@umich.edu vtimeOffset = in.vtimeOffset; 1252357Sktlim@umich.edu vgettimeofdayOffset = in.vgettimeofdayOffset; 1262357Sktlim@umich.edu 1272357Sktlim@umich.edu return *this; 1282357Sktlim@umich.edu } 1292357Sktlim@umich.edu }; 1302357Sktlim@umich.edu VSyscallPage vsyscallPage; 1312357Sktlim@umich.edu 1322357Sktlim@umich.edu public: 1332357Sktlim@umich.edu void argsInit(int pageSize); 1342357Sktlim@umich.edu void initState(); 1352357Sktlim@umich.edu 1362357Sktlim@umich.edu X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i); 1372357Sktlim@umich.edu /// Explicitly import the otherwise hidden getSyscallArg 1382357Sktlim@umich.edu using Process::getSyscallArg; 1392357Sktlim@umich.edu void setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val); 1402357Sktlim@umich.edu void clone(ThreadContext *old_tc, ThreadContext *new_tc, 1412357Sktlim@umich.edu Process *process, TheISA::IntReg flags); 1422357Sktlim@umich.edu }; 1432357Sktlim@umich.edu 1442357Sktlim@umich.edu class I386Process : public X86Process 1452357Sktlim@umich.edu { 1462357Sktlim@umich.edu protected: 1472357Sktlim@umich.edu I386Process(ProcessParams *params, ObjectFile *objFile, 1482357Sktlim@umich.edu SyscallDesc *_syscallDescs, int _numSyscallDescs); 1492357Sktlim@umich.edu 1502357Sktlim@umich.edu class VSyscallPage 1512357Sktlim@umich.edu { 1522357Sktlim@umich.edu public: 1532357Sktlim@umich.edu Addr base; 1542357Sktlim@umich.edu Addr size; 1552357Sktlim@umich.edu Addr vsyscallOffset; 1562357Sktlim@umich.edu Addr vsysexitOffset; 1572357Sktlim@umich.edu 1582357Sktlim@umich.edu VSyscallPage & 1592357Sktlim@umich.edu operator=(const VSyscallPage &in) 1602357Sktlim@umich.edu { 1612357Sktlim@umich.edu if (this == &in) 1622357Sktlim@umich.edu return *this; 1632357Sktlim@umich.edu 1642357Sktlim@umich.edu base = in.base; 1652357Sktlim@umich.edu size = in.size; 1662357Sktlim@umich.edu vsyscallOffset = in.vsyscallOffset; 1672357Sktlim@umich.edu vsysexitOffset = in.vsysexitOffset; 1682357Sktlim@umich.edu 1692357Sktlim@umich.edu return *this; 1702357Sktlim@umich.edu } 1712357Sktlim@umich.edu }; 1722357Sktlim@umich.edu VSyscallPage vsyscallPage; 1732357Sktlim@umich.edu 1742357Sktlim@umich.edu public: 1752357Sktlim@umich.edu void argsInit(int pageSize); 1762357Sktlim@umich.edu void initState(); 1772357Sktlim@umich.edu 1782357Sktlim@umich.edu void syscall(int64_t callnum, ThreadContext *tc, Fault *fault); 1792357Sktlim@umich.edu X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i); 1802357Sktlim@umich.edu X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width); 1812357Sktlim@umich.edu void setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val); 1822357Sktlim@umich.edu void clone(ThreadContext *old_tc, ThreadContext *new_tc, 1832357Sktlim@umich.edu Process *process, TheISA::IntReg flags); 1842357Sktlim@umich.edu }; 1852357Sktlim@umich.edu 1862357Sktlim@umich.edu /** 1872357Sktlim@umich.edu * Declaration of architectural page table for x86. 1882357Sktlim@umich.edu * 1892357Sktlim@umich.edu * These page tables are stored in system memory and respect x86 specification. 1902357Sktlim@umich.edu */ 1912357Sktlim@umich.edu typedef MultiLevelPageTable<PageTableOps> ArchPageTable; 1922357Sktlim@umich.edu 1932357Sktlim@umich.edu} 1942357Sktlim@umich.edu 1952357Sktlim@umich.edu#endif // __ARCH_X86_PROCESS_HH__ 1962357Sktlim@umich.edu