process.hh revision 11320
17322Sgblack@eecs.umich.edu/*
27322Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company
37322Sgblack@eecs.umich.edu * All rights reserved.
47322Sgblack@eecs.umich.edu *
57322Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67322Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77322Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87322Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97322Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107322Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117322Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127322Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137322Sgblack@eecs.umich.edu *
147322Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
157322Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
167322Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
177322Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
187322Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
197322Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
207322Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
217322Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
227322Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
237322Sgblack@eecs.umich.edu * this software without specific prior written permission.
247322Sgblack@eecs.umich.edu *
257322Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
267322Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
277322Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
287322Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
297322Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
307322Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
317322Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
327322Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
337322Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
347322Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
357322Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
367322Sgblack@eecs.umich.edu *
377322Sgblack@eecs.umich.edu * Authors: Gabe Black
387322Sgblack@eecs.umich.edu */
397322Sgblack@eecs.umich.edu
407322Sgblack@eecs.umich.edu#ifndef __ARCH_X86_PROCESS_HH__
417322Sgblack@eecs.umich.edu#define __ARCH_X86_PROCESS_HH__
427322Sgblack@eecs.umich.edu
437322Sgblack@eecs.umich.edu#include <string>
447322Sgblack@eecs.umich.edu#include <vector>
457322Sgblack@eecs.umich.edu
467322Sgblack@eecs.umich.edu#include "sim/process.hh"
477322Sgblack@eecs.umich.edu#include "mem/multi_level_page_table.hh"
487322Sgblack@eecs.umich.edu
497322Sgblack@eecs.umich.educlass SyscallDesc;
507322Sgblack@eecs.umich.edu
517322Sgblack@eecs.umich.edunamespace X86ISA
527324Sgblack@eecs.umich.edu{
537324Sgblack@eecs.umich.edu    enum X86AuxiliaryVectorTypes {
547324Sgblack@eecs.umich.edu        M5_AT_SYSINFO = 32,
557324Sgblack@eecs.umich.edu        M5_AT_SYSINFO_EHDR = 33
567324Sgblack@eecs.umich.edu    };
577324Sgblack@eecs.umich.edu
587324Sgblack@eecs.umich.edu    class X86LiveProcess : public LiveProcess
597333Sgblack@eecs.umich.edu    {
607333Sgblack@eecs.umich.edu      protected:
617333Sgblack@eecs.umich.edu        Addr _gdtStart;
627333Sgblack@eecs.umich.edu        Addr _gdtSize;
637333Sgblack@eecs.umich.edu
647333Sgblack@eecs.umich.edu        SyscallDesc *syscallDescs;
657333Sgblack@eecs.umich.edu        const int numSyscallDescs;
667333Sgblack@eecs.umich.edu
677333Sgblack@eecs.umich.edu        X86LiveProcess(LiveProcessParams * params, ObjectFile *objFile,
687333Sgblack@eecs.umich.edu                SyscallDesc *_syscallDescs, int _numSyscallDescs);
697333Sgblack@eecs.umich.edu
707333Sgblack@eecs.umich.edu        template<class IntType>
717333Sgblack@eecs.umich.edu        void argsInit(int pageSize,
727333Sgblack@eecs.umich.edu                std::vector<AuxVector<IntType> > extraAuxvs);
737333Sgblack@eecs.umich.edu
747333Sgblack@eecs.umich.edu      public:
757333Sgblack@eecs.umich.edu        Addr gdtStart()
767333Sgblack@eecs.umich.edu        { return _gdtStart; }
777333Sgblack@eecs.umich.edu
787333Sgblack@eecs.umich.edu        Addr gdtSize()
797333Sgblack@eecs.umich.edu        { return _gdtSize; }
807333Sgblack@eecs.umich.edu
817333Sgblack@eecs.umich.edu        SyscallDesc* getDesc(int callnum);
827333Sgblack@eecs.umich.edu
837333Sgblack@eecs.umich.edu        void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
847333Sgblack@eecs.umich.edu    };
857333Sgblack@eecs.umich.edu
867333Sgblack@eecs.umich.edu    class X86_64LiveProcess : public X86LiveProcess
877333Sgblack@eecs.umich.edu    {
887333Sgblack@eecs.umich.edu      protected:
897333Sgblack@eecs.umich.edu        X86_64LiveProcess(LiveProcessParams *params, ObjectFile *objFile,
907333Sgblack@eecs.umich.edu                SyscallDesc *_syscallDescs, int _numSyscallDescs);
917333Sgblack@eecs.umich.edu
927333Sgblack@eecs.umich.edu        class VSyscallPage
937333Sgblack@eecs.umich.edu        {
947333Sgblack@eecs.umich.edu          public:
957333Sgblack@eecs.umich.edu            Addr base;
967333Sgblack@eecs.umich.edu            Addr size;
977333Sgblack@eecs.umich.edu            Addr vtimeOffset;
987333Sgblack@eecs.umich.edu            Addr vgettimeofdayOffset;
997333Sgblack@eecs.umich.edu        };
1007333Sgblack@eecs.umich.edu        VSyscallPage vsyscallPage;
1017333Sgblack@eecs.umich.edu
1027333Sgblack@eecs.umich.edu      public:
1037333Sgblack@eecs.umich.edu        void argsInit(int intSize, int pageSize);
1047333Sgblack@eecs.umich.edu        void initState();
1057333Sgblack@eecs.umich.edu
1067333Sgblack@eecs.umich.edu        X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
1077333Sgblack@eecs.umich.edu        /// Explicitly import the otherwise hidden getSyscallArg
1087333Sgblack@eecs.umich.edu        using LiveProcess::getSyscallArg;
1097333Sgblack@eecs.umich.edu        void setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val);
1107333Sgblack@eecs.umich.edu    };
1117333Sgblack@eecs.umich.edu
1127333Sgblack@eecs.umich.edu    class I386LiveProcess : public X86LiveProcess
1137333Sgblack@eecs.umich.edu    {
1147333Sgblack@eecs.umich.edu      protected:
1157333Sgblack@eecs.umich.edu        I386LiveProcess(LiveProcessParams *params, ObjectFile *objFile,
1167333Sgblack@eecs.umich.edu                SyscallDesc *_syscallDescs, int _numSyscallDescs);
1177333Sgblack@eecs.umich.edu
1187333Sgblack@eecs.umich.edu        class VSyscallPage
1197333Sgblack@eecs.umich.edu        {
1207333Sgblack@eecs.umich.edu          public:
1217333Sgblack@eecs.umich.edu            Addr base;
1227333Sgblack@eecs.umich.edu            Addr size;
1237333Sgblack@eecs.umich.edu            Addr vsyscallOffset;
1247333Sgblack@eecs.umich.edu            Addr vsysexitOffset;
1257333Sgblack@eecs.umich.edu        };
1267333Sgblack@eecs.umich.edu        VSyscallPage vsyscallPage;
1277333Sgblack@eecs.umich.edu
1287333Sgblack@eecs.umich.edu      public:
1297333Sgblack@eecs.umich.edu        void argsInit(int intSize, int pageSize);
1307333Sgblack@eecs.umich.edu        void initState();
1317333Sgblack@eecs.umich.edu
1327333Sgblack@eecs.umich.edu        void syscall(int64_t callnum, ThreadContext *tc);
1337333Sgblack@eecs.umich.edu        X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
1347333Sgblack@eecs.umich.edu        X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width);
1357333Sgblack@eecs.umich.edu        void setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val);
1367333Sgblack@eecs.umich.edu    };
1377333Sgblack@eecs.umich.edu
1387333Sgblack@eecs.umich.edu    /**
1397333Sgblack@eecs.umich.edu     * Declaration of architectural page table for x86.
1407333Sgblack@eecs.umich.edu     *
1417333Sgblack@eecs.umich.edu     * These page tables are stored in system memory and respect x86 specification.
1427333Sgblack@eecs.umich.edu     */
1437333Sgblack@eecs.umich.edu    typedef MultiLevelPageTable<PageTableOps> ArchPageTable;
1447333Sgblack@eecs.umich.edu
1457333Sgblack@eecs.umich.edu}
1467333Sgblack@eecs.umich.edu
1477333Sgblack@eecs.umich.edu#endif // __ARCH_X86_PROCESS_HH__
1487333Sgblack@eecs.umich.edu