110930Sbrandon.potter@amd.com/*
211856Sbrandon.potter@amd.com * Copyright (c) 2016 Advanced Micro Devices, Inc.
311856Sbrandon.potter@amd.com * All rights reserved.
411856Sbrandon.potter@amd.com *
511856Sbrandon.potter@amd.com * For use for simulation and test purposes only
610930Sbrandon.potter@amd.com *
710930Sbrandon.potter@amd.com * Redistribution and use in source and binary forms, with or without
811856Sbrandon.potter@amd.com * modification, are permitted provided that the following conditions are met:
910930Sbrandon.potter@amd.com *
1011856Sbrandon.potter@amd.com * 1. Redistributions of source code must retain the above copyright notice,
1111856Sbrandon.potter@amd.com * this list of conditions and the following disclaimer.
1210930Sbrandon.potter@amd.com *
1311856Sbrandon.potter@amd.com * 2. Redistributions in binary form must reproduce the above copyright notice,
1411856Sbrandon.potter@amd.com * this list of conditions and the following disclaimer in the documentation
1511856Sbrandon.potter@amd.com * and/or other materials provided with the distribution.
1611856Sbrandon.potter@amd.com *
1711856Sbrandon.potter@amd.com * 3. Neither the name of the copyright holder nor the names of its
1811856Sbrandon.potter@amd.com * contributors may be used to endorse or promote products derived from this
1911856Sbrandon.potter@amd.com * software without specific prior written permission.
2011856Sbrandon.potter@amd.com *
2111856Sbrandon.potter@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2211856Sbrandon.potter@amd.com * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2311856Sbrandon.potter@amd.com * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2411856Sbrandon.potter@amd.com * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
2511856Sbrandon.potter@amd.com * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2611856Sbrandon.potter@amd.com * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2711856Sbrandon.potter@amd.com * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2811856Sbrandon.potter@amd.com * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2911856Sbrandon.potter@amd.com * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3011856Sbrandon.potter@amd.com * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3111856Sbrandon.potter@amd.com * POSSIBILITY OF SUCH DAMAGE.
3211856Sbrandon.potter@amd.com *
3312697Santhony.gutierrez@amd.com * Authors: Brandon Potter
3410930Sbrandon.potter@amd.com */
3510930Sbrandon.potter@amd.com
3610930Sbrandon.potter@amd.com#ifndef __FD_ENTRY_HH__
3710930Sbrandon.potter@amd.com#define __FD_ENTRY_HH__
3810930Sbrandon.potter@amd.com
3911856Sbrandon.potter@amd.com#include <memory>
4010930Sbrandon.potter@amd.com#include <ostream>
4110930Sbrandon.potter@amd.com#include <string>
4210930Sbrandon.potter@amd.com
4311800Sbrandon.potter@amd.com#include "sim/serialize.hh"
4411800Sbrandon.potter@amd.com
4511800Sbrandon.potter@amd.comclass EmulatedDriver;
4610930Sbrandon.potter@amd.com
4710930Sbrandon.potter@amd.com/**
4811856Sbrandon.potter@amd.com * Holds a single file descriptor mapping and that mapping's data for
4911856Sbrandon.potter@amd.com * processes running in syscall emulation mode.
5010930Sbrandon.potter@amd.com */
5110930Sbrandon.potter@amd.comclass FDEntry : public Serializable
5210930Sbrandon.potter@amd.com{
5310930Sbrandon.potter@amd.com  public:
5411856Sbrandon.potter@amd.com    FDEntry(bool close_on_exec = false)
5511856Sbrandon.potter@amd.com        : _closeOnExec(close_on_exec)
5610930Sbrandon.potter@amd.com    { }
5710930Sbrandon.potter@amd.com
5811856Sbrandon.potter@amd.com    virtual std::shared_ptr<FDEntry> clone() const = 0;
5911856Sbrandon.potter@amd.com
6013030Sbrandon.potter@amd.com    bool getCOE() const { return _closeOnExec; }
6111856Sbrandon.potter@amd.com
6213030Sbrandon.potter@amd.com    void setCOE(bool close_on_exec) { _closeOnExec = close_on_exec; }
6311856Sbrandon.potter@amd.com
6411856Sbrandon.potter@amd.com    virtual void serialize(CheckpointOut &cp) const;
6511856Sbrandon.potter@amd.com    virtual void unserialize(CheckpointIn &cp);
6611856Sbrandon.potter@amd.com
6711856Sbrandon.potter@amd.com  protected:
6811856Sbrandon.potter@amd.com    bool _closeOnExec;
6911856Sbrandon.potter@amd.com};
7011856Sbrandon.potter@amd.com
7111856Sbrandon.potter@amd.com/**
7211856Sbrandon.potter@amd.com * Extends the base class to include a host-backed file descriptor field
7311856Sbrandon.potter@amd.com * that records the integer used to represent the file descriptor on the host
7411856Sbrandon.potter@amd.com * and the file's flags.
7511856Sbrandon.potter@amd.com */
7611856Sbrandon.potter@amd.comclass HBFDEntry: public FDEntry
7711856Sbrandon.potter@amd.com{
7811856Sbrandon.potter@amd.com  public:
7911856Sbrandon.potter@amd.com    HBFDEntry(int flags, int sim_fd, bool close_on_exec = false)
8011856Sbrandon.potter@amd.com        : FDEntry(close_on_exec), _flags(flags), _simFD(sim_fd)
8111856Sbrandon.potter@amd.com    { }
8211856Sbrandon.potter@amd.com
8313933Sbrandon.potter@amd.com    HBFDEntry(HBFDEntry const& reg, bool close_on_exec = false)
8413933Sbrandon.potter@amd.com        : FDEntry(close_on_exec), _flags(reg._flags), _simFD(reg._simFD)
8513933Sbrandon.potter@amd.com    { }
8613933Sbrandon.potter@amd.com
8713933Sbrandon.potter@amd.com    std::shared_ptr<FDEntry>
8813933Sbrandon.potter@amd.com    clone() const override
8913933Sbrandon.potter@amd.com    {
9013933Sbrandon.potter@amd.com        return std::make_shared<HBFDEntry>(*this);
9113933Sbrandon.potter@amd.com    }
9213933Sbrandon.potter@amd.com
9313030Sbrandon.potter@amd.com    int getFlags() const { return _flags; }
9413030Sbrandon.potter@amd.com    int getSimFD() const { return _simFD; }
9511856Sbrandon.potter@amd.com
9613030Sbrandon.potter@amd.com    void setFlags(int flags) { _flags = flags; }
9713030Sbrandon.potter@amd.com    void setSimFD(int sim_fd) { _simFD = sim_fd; }
9811856Sbrandon.potter@amd.com
9911856Sbrandon.potter@amd.com  protected:
10011856Sbrandon.potter@amd.com    int _flags;
10111856Sbrandon.potter@amd.com    int _simFD;
10211856Sbrandon.potter@amd.com};
10311856Sbrandon.potter@amd.com
10411856Sbrandon.potter@amd.com/**
10511856Sbrandon.potter@amd.com * Holds file descriptors for host-backed files; host-backed files are
10611856Sbrandon.potter@amd.com * files which were opened on the physical machine where the simulation
10711856Sbrandon.potter@amd.com * is running (probably the thing on/under your desk). All regular files
10811856Sbrandon.potter@amd.com * are redirected to make it appear that the file descriptor assignment
10911856Sbrandon.potter@amd.com * starts at file descriptor '3' (not including stdin, stdout, stderr) and
11011856Sbrandon.potter@amd.com * then grows upward.
11111856Sbrandon.potter@amd.com */
11211856Sbrandon.potter@amd.comclass FileFDEntry: public HBFDEntry
11311856Sbrandon.potter@amd.com{
11411856Sbrandon.potter@amd.com  public:
11511856Sbrandon.potter@amd.com    FileFDEntry(int sim_fd, int flags, std::string const& file_name,
11611856Sbrandon.potter@amd.com                uint64_t file_offset, bool close_on_exec = false)
11711856Sbrandon.potter@amd.com        : HBFDEntry(flags, sim_fd, close_on_exec),
11811856Sbrandon.potter@amd.com          _fileName(file_name), _fileOffset(file_offset)
11911856Sbrandon.potter@amd.com    { }
12011856Sbrandon.potter@amd.com
12111856Sbrandon.potter@amd.com    FileFDEntry(FileFDEntry const& reg, bool close_on_exec = false)
12211856Sbrandon.potter@amd.com        : HBFDEntry(reg._flags, reg._simFD, close_on_exec),
12311856Sbrandon.potter@amd.com          _fileName(reg._fileName), _fileOffset(reg._fileOffset)
12411856Sbrandon.potter@amd.com    { }
12511856Sbrandon.potter@amd.com
12613030Sbrandon.potter@amd.com    std::shared_ptr<FDEntry>
12711856Sbrandon.potter@amd.com    clone() const override
12811856Sbrandon.potter@amd.com    {
12911856Sbrandon.potter@amd.com        return std::make_shared<FileFDEntry>(*this);
13011856Sbrandon.potter@amd.com    }
13111856Sbrandon.potter@amd.com
13213030Sbrandon.potter@amd.com    std::string const& getFileName() const { return _fileName; }
13313030Sbrandon.potter@amd.com    uint64_t getFileOffset() const { return _fileOffset; }
13411856Sbrandon.potter@amd.com
13513030Sbrandon.potter@amd.com    void setFileName(std::string const& file_name) { _fileName = file_name; }
13613030Sbrandon.potter@amd.com    void setFileOffset(uint64_t f_off) { _fileOffset = f_off; }
13711856Sbrandon.potter@amd.com
13811168Sandreas.hansson@arm.com    void serialize(CheckpointOut &cp) const override;
13911168Sandreas.hansson@arm.com    void unserialize(CheckpointIn &cp) override;
14010930Sbrandon.potter@amd.com
14111856Sbrandon.potter@amd.com  private:
14211856Sbrandon.potter@amd.com    std::string _fileName;
14311856Sbrandon.potter@amd.com    uint64_t _fileOffset;
14411856Sbrandon.potter@amd.com};
14510930Sbrandon.potter@amd.com
14611856Sbrandon.potter@amd.com/**
14711856Sbrandon.potter@amd.com * Holds the metadata needed to maintain the mappings for file descriptors
14811856Sbrandon.potter@amd.com * allocated with the pipe() system calls and its variants.
14911856Sbrandon.potter@amd.com */
15011856Sbrandon.potter@amd.comclass PipeFDEntry: public HBFDEntry
15111856Sbrandon.potter@amd.com{
15211856Sbrandon.potter@amd.com  public:
15311856Sbrandon.potter@amd.com    enum EndType {
15411856Sbrandon.potter@amd.com        read = 0,
15511856Sbrandon.potter@amd.com        write = 1
15611856Sbrandon.potter@amd.com    };
15710930Sbrandon.potter@amd.com
15811856Sbrandon.potter@amd.com    PipeFDEntry(int sim_fd, int flags, EndType pipe_end_type,
15911856Sbrandon.potter@amd.com                bool close_on_exec = false)
16011856Sbrandon.potter@amd.com        : HBFDEntry(flags, sim_fd, close_on_exec), _pipeReadSource(-1),
16111856Sbrandon.potter@amd.com          _pipeEndType(pipe_end_type)
16211856Sbrandon.potter@amd.com    { }
16310930Sbrandon.potter@amd.com
16411856Sbrandon.potter@amd.com    PipeFDEntry(PipeFDEntry const& pipe, bool close_on_exec = false)
16511856Sbrandon.potter@amd.com        : HBFDEntry(pipe._flags, pipe._simFD, close_on_exec),
16611856Sbrandon.potter@amd.com          _pipeReadSource(pipe._pipeReadSource),
16711856Sbrandon.potter@amd.com          _pipeEndType(pipe._pipeEndType)
16811856Sbrandon.potter@amd.com    { }
16911856Sbrandon.potter@amd.com
17013030Sbrandon.potter@amd.com    std::shared_ptr<FDEntry>
17111856Sbrandon.potter@amd.com    clone() const override
17211856Sbrandon.potter@amd.com    {
17311856Sbrandon.potter@amd.com        return std::make_shared<PipeFDEntry>(*this);
17411856Sbrandon.potter@amd.com    }
17511856Sbrandon.potter@amd.com
17613030Sbrandon.potter@amd.com    EndType getEndType() const { return _pipeEndType; }
17713030Sbrandon.potter@amd.com    int getPipeReadSource() const { return _pipeReadSource; }
17811856Sbrandon.potter@amd.com
17913030Sbrandon.potter@amd.com    void setPipeReadSource(int tgt_fd) { _pipeReadSource = tgt_fd; }
18013030Sbrandon.potter@amd.com    void setEndType(EndType type) { _pipeEndType = type; }
18111856Sbrandon.potter@amd.com
18211856Sbrandon.potter@amd.com    void serialize(CheckpointOut &cp) const override;
18311856Sbrandon.potter@amd.com    void unserialize(CheckpointIn &cp) override;
18411856Sbrandon.potter@amd.com
18511856Sbrandon.potter@amd.com  private:
18611856Sbrandon.potter@amd.com    int _pipeReadSource;
18711856Sbrandon.potter@amd.com    EndType _pipeEndType;
18811856Sbrandon.potter@amd.com};
18911856Sbrandon.potter@amd.com
19011856Sbrandon.potter@amd.com/**
19111856Sbrandon.potter@amd.com * Holds file descriptors needed to simulate devices opened with pseudo
19211856Sbrandon.potter@amd.com * files (commonly with calls to ioctls).
19311856Sbrandon.potter@amd.com */
19411856Sbrandon.potter@amd.comclass DeviceFDEntry : public FDEntry
19511856Sbrandon.potter@amd.com{
19611856Sbrandon.potter@amd.com  public:
19711856Sbrandon.potter@amd.com    DeviceFDEntry(EmulatedDriver *driver, std::string const& file_name,
19811856Sbrandon.potter@amd.com                  bool close_on_exec = false)
19911856Sbrandon.potter@amd.com        : FDEntry(close_on_exec), _driver(driver), _fileName(file_name)
20011856Sbrandon.potter@amd.com    { }
20111856Sbrandon.potter@amd.com
20211856Sbrandon.potter@amd.com    DeviceFDEntry(DeviceFDEntry const& dev, bool close_on_exec = false)
20311856Sbrandon.potter@amd.com        : FDEntry(close_on_exec), _driver(dev._driver),
20411856Sbrandon.potter@amd.com          _fileName(dev._fileName)
20511856Sbrandon.potter@amd.com    { }
20611856Sbrandon.potter@amd.com
20711856Sbrandon.potter@amd.com    std::shared_ptr<FDEntry>
20811856Sbrandon.potter@amd.com    clone() const override
20911856Sbrandon.potter@amd.com    {
21011856Sbrandon.potter@amd.com        return std::make_shared<DeviceFDEntry>(*this);
21111856Sbrandon.potter@amd.com    }
21211856Sbrandon.potter@amd.com
21313030Sbrandon.potter@amd.com    EmulatedDriver *getDriver() const { return _driver; }
21413030Sbrandon.potter@amd.com    std::string const& getFileName() const { return _fileName; }
21511856Sbrandon.potter@amd.com
21611856Sbrandon.potter@amd.com    void serialize(CheckpointOut &cp) const override;
21711856Sbrandon.potter@amd.com    void unserialize(CheckpointIn &cp) override;
21811856Sbrandon.potter@amd.com
21911856Sbrandon.potter@amd.com  private:
22011856Sbrandon.potter@amd.com    EmulatedDriver *_driver;
22111856Sbrandon.potter@amd.com    std::string _fileName;
22210930Sbrandon.potter@amd.com};
22310930Sbrandon.potter@amd.com
22413568Sbrandon.potter@amd.comclass SocketFDEntry: public HBFDEntry
22513568Sbrandon.potter@amd.com{
22613568Sbrandon.potter@amd.com  public:
22713568Sbrandon.potter@amd.com    SocketFDEntry(int sim_fd, int domain, int type, int protocol,
22813568Sbrandon.potter@amd.com                  bool close_on_exec = false)
22913568Sbrandon.potter@amd.com        : HBFDEntry(0, sim_fd, close_on_exec),
23013568Sbrandon.potter@amd.com          _domain(domain), _type(type), _protocol(protocol)
23113568Sbrandon.potter@amd.com    { }
23213568Sbrandon.potter@amd.com
23313568Sbrandon.potter@amd.com    SocketFDEntry(SocketFDEntry const& reg, bool close_on_exec = false)
23413568Sbrandon.potter@amd.com        : HBFDEntry(reg._flags, reg._simFD, close_on_exec),
23513568Sbrandon.potter@amd.com          _domain(reg._domain), _type(reg._type), _protocol(reg._protocol)
23613568Sbrandon.potter@amd.com    { }
23713568Sbrandon.potter@amd.com
23813568Sbrandon.potter@amd.com    std::shared_ptr<FDEntry>
23913568Sbrandon.potter@amd.com    clone() const override
24013568Sbrandon.potter@amd.com    {
24113568Sbrandon.potter@amd.com        return std::make_shared<SocketFDEntry>(*this);
24213568Sbrandon.potter@amd.com    }
24313568Sbrandon.potter@amd.com
24413568Sbrandon.potter@amd.com    int _domain;
24513568Sbrandon.potter@amd.com    int _type;
24613568Sbrandon.potter@amd.com    int _protocol;
24713568Sbrandon.potter@amd.com};
24813568Sbrandon.potter@amd.com
24910930Sbrandon.potter@amd.com#endif // __FD_ENTRY_HH__
250