process.hh revision 7532:3f6413fc37a2
111012Sandreas.sandberg@arm.com/*
211012Sandreas.sandberg@arm.com * Copyright (c) 2007 The Hewlett-Packard Development Company
311012Sandreas.sandberg@arm.com * All rights reserved.
411012Sandreas.sandberg@arm.com *
511012Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall
611012Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual
711012Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating
811012Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software
911012Sandreas.sandberg@arm.com * licensed hereunder.  You may use the software subject to the license
1011012Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated
1111012Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software,
1211012Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form.
1311012Sandreas.sandberg@arm.com *
1411012Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
1511012Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
1611012Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
1711012Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
1811012Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1911012Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
2011012Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
2111012Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
2211012Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
2311012Sandreas.sandberg@arm.com * this software without specific prior written permission.
2411012Sandreas.sandberg@arm.com *
2511012Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2611012Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2711012Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2811012Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2911012Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3011012Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3111012Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3211012Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3311012Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3411012Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3511012Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3611012Sandreas.sandberg@arm.com *
3711012Sandreas.sandberg@arm.com * Authors: Gabe Black
3811012Sandreas.sandberg@arm.com */
3911012Sandreas.sandberg@arm.com
4011012Sandreas.sandberg@arm.com#ifndef __ARCH_X86_PROCESS_HH__
4111012Sandreas.sandberg@arm.com#define __ARCH_X86_PROCESS_HH__
4211012Sandreas.sandberg@arm.com
4311012Sandreas.sandberg@arm.com#include <string>
4411012Sandreas.sandberg@arm.com#include <vector>
4511012Sandreas.sandberg@arm.com#include "sim/process.hh"
4611012Sandreas.sandberg@arm.com
4711012Sandreas.sandberg@arm.comclass SyscallDesc;
4811012Sandreas.sandberg@arm.com
4911012Sandreas.sandberg@arm.comnamespace X86ISA
5011012Sandreas.sandberg@arm.com{
5111012Sandreas.sandberg@arm.com    enum X86AuxiliaryVectorTypes {
5211012Sandreas.sandberg@arm.com        M5_AT_SYSINFO = 32,
5311012Sandreas.sandberg@arm.com        M5_AT_SYSINFO_EHDR = 33
5411012Sandreas.sandberg@arm.com    };
5511012Sandreas.sandberg@arm.com
5611012Sandreas.sandberg@arm.com    class X86LiveProcess : public LiveProcess
5711012Sandreas.sandberg@arm.com    {
5811012Sandreas.sandberg@arm.com      protected:
5911012Sandreas.sandberg@arm.com        Addr _gdtStart;
6011012Sandreas.sandberg@arm.com        Addr _gdtSize;
6111012Sandreas.sandberg@arm.com
6211012Sandreas.sandberg@arm.com        SyscallDesc *syscallDescs;
6311012Sandreas.sandberg@arm.com        const int numSyscallDescs;
6411012Sandreas.sandberg@arm.com
6511012Sandreas.sandberg@arm.com        X86LiveProcess(LiveProcessParams * params, ObjectFile *objFile,
6611012Sandreas.sandberg@arm.com                SyscallDesc *_syscallDescs, int _numSyscallDescs);
6711012Sandreas.sandberg@arm.com
6811012Sandreas.sandberg@arm.com        template<class IntType>
6911012Sandreas.sandberg@arm.com        void argsInit(int pageSize,
7011012Sandreas.sandberg@arm.com                std::vector<AuxVector<IntType> > extraAuxvs);
7111012Sandreas.sandberg@arm.com
7211012Sandreas.sandberg@arm.com      public:
7311012Sandreas.sandberg@arm.com        Addr gdtStart()
7411012Sandreas.sandberg@arm.com        { return _gdtStart; }
7511012Sandreas.sandberg@arm.com
7611012Sandreas.sandberg@arm.com        Addr gdtSize()
7711012Sandreas.sandberg@arm.com        { return _gdtSize; }
7811012Sandreas.sandberg@arm.com
7911012Sandreas.sandberg@arm.com        SyscallDesc* getDesc(int callnum);
8011012Sandreas.sandberg@arm.com
8111012Sandreas.sandberg@arm.com        void setSyscallReturn(ThreadContext *tc, SyscallReturn return_value);
8211012Sandreas.sandberg@arm.com    };
8311012Sandreas.sandberg@arm.com
8411012Sandreas.sandberg@arm.com    class X86_64LiveProcess : public X86LiveProcess
8511012Sandreas.sandberg@arm.com    {
8611012Sandreas.sandberg@arm.com      protected:
8711012Sandreas.sandberg@arm.com        X86_64LiveProcess(LiveProcessParams *params, ObjectFile *objFile,
8811012Sandreas.sandberg@arm.com                SyscallDesc *_syscallDescs, int _numSyscallDescs);
8911012Sandreas.sandberg@arm.com
9011012Sandreas.sandberg@arm.com        class VSyscallPage
9111012Sandreas.sandberg@arm.com        {
9211012Sandreas.sandberg@arm.com          public:
9311012Sandreas.sandberg@arm.com            Addr base;
9411012Sandreas.sandberg@arm.com            Addr size;
9511012Sandreas.sandberg@arm.com            Addr vtimeOffset;
9611012Sandreas.sandberg@arm.com            Addr vgettimeofdayOffset;
9711012Sandreas.sandberg@arm.com        };
9811012Sandreas.sandberg@arm.com        VSyscallPage vsyscallPage;
9911012Sandreas.sandberg@arm.com
10011012Sandreas.sandberg@arm.com      public:
10111012Sandreas.sandberg@arm.com        void argsInit(int intSize, int pageSize);
10211012Sandreas.sandberg@arm.com        void initState();
10311012Sandreas.sandberg@arm.com
10411012Sandreas.sandberg@arm.com        X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
10511012Sandreas.sandberg@arm.com        void setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val);
10611012Sandreas.sandberg@arm.com    };
10711012Sandreas.sandberg@arm.com
10811012Sandreas.sandberg@arm.com    class I386LiveProcess : public X86LiveProcess
10911012Sandreas.sandberg@arm.com    {
11011012Sandreas.sandberg@arm.com      protected:
11111012Sandreas.sandberg@arm.com        I386LiveProcess(LiveProcessParams *params, ObjectFile *objFile,
11211012Sandreas.sandberg@arm.com                SyscallDesc *_syscallDescs, int _numSyscallDescs);
11311012Sandreas.sandberg@arm.com
11411012Sandreas.sandberg@arm.com        class VSyscallPage
11511012Sandreas.sandberg@arm.com        {
11611012Sandreas.sandberg@arm.com          public:
11711012Sandreas.sandberg@arm.com            Addr base;
11811012Sandreas.sandberg@arm.com            Addr size;
11911012Sandreas.sandberg@arm.com            Addr vsyscallOffset;
12011012Sandreas.sandberg@arm.com            Addr vsysexitOffset;
12111012Sandreas.sandberg@arm.com        };
12211012Sandreas.sandberg@arm.com        VSyscallPage vsyscallPage;
12311012Sandreas.sandberg@arm.com
12411012Sandreas.sandberg@arm.com      public:
12511012Sandreas.sandberg@arm.com        void argsInit(int intSize, int pageSize);
12611012Sandreas.sandberg@arm.com        void initState();
12711012Sandreas.sandberg@arm.com
12811012Sandreas.sandberg@arm.com        void syscall(int64_t callnum, ThreadContext *tc);
12911012Sandreas.sandberg@arm.com        X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i);
13011012Sandreas.sandberg@arm.com        X86ISA::IntReg getSyscallArg(ThreadContext *tc, int &i, int width);
13111012Sandreas.sandberg@arm.com        void setSyscallArg(ThreadContext *tc, int i, X86ISA::IntReg val);
13211012Sandreas.sandberg@arm.com    };
13311012Sandreas.sandberg@arm.com}
13411012Sandreas.sandberg@arm.com
13511012Sandreas.sandberg@arm.com#endif // __ARCH_X86_PROCESS_HH__
13611012Sandreas.sandberg@arm.com