fd_entry.hh revision 13030
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
8313030Sbrandon.potter@amd.com    int getFlags() const { return _flags; }
8413030Sbrandon.potter@amd.com    int getSimFD() const { return _simFD; }
8511856Sbrandon.potter@amd.com
8613030Sbrandon.potter@amd.com    void setFlags(int flags) { _flags = flags; }
8713030Sbrandon.potter@amd.com    void setSimFD(int sim_fd) { _simFD = sim_fd; }
8811856Sbrandon.potter@amd.com
8911856Sbrandon.potter@amd.com  protected:
9011856Sbrandon.potter@amd.com    int _flags;
9111856Sbrandon.potter@amd.com    int _simFD;
9211856Sbrandon.potter@amd.com};
9311856Sbrandon.potter@amd.com
9411856Sbrandon.potter@amd.com/**
9511856Sbrandon.potter@amd.com * Holds file descriptors for host-backed files; host-backed files are
9611856Sbrandon.potter@amd.com * files which were opened on the physical machine where the simulation
9711856Sbrandon.potter@amd.com * is running (probably the thing on/under your desk). All regular files
9811856Sbrandon.potter@amd.com * are redirected to make it appear that the file descriptor assignment
9911856Sbrandon.potter@amd.com * starts at file descriptor '3' (not including stdin, stdout, stderr) and
10011856Sbrandon.potter@amd.com * then grows upward.
10111856Sbrandon.potter@amd.com */
10211856Sbrandon.potter@amd.comclass FileFDEntry: public HBFDEntry
10311856Sbrandon.potter@amd.com{
10411856Sbrandon.potter@amd.com  public:
10511856Sbrandon.potter@amd.com    FileFDEntry(int sim_fd, int flags, std::string const& file_name,
10611856Sbrandon.potter@amd.com                uint64_t file_offset, bool close_on_exec = false)
10711856Sbrandon.potter@amd.com        : HBFDEntry(flags, sim_fd, close_on_exec),
10811856Sbrandon.potter@amd.com          _fileName(file_name), _fileOffset(file_offset)
10911856Sbrandon.potter@amd.com    { }
11011856Sbrandon.potter@amd.com
11111856Sbrandon.potter@amd.com    FileFDEntry(FileFDEntry const& reg, bool close_on_exec = false)
11211856Sbrandon.potter@amd.com        : HBFDEntry(reg._flags, reg._simFD, close_on_exec),
11311856Sbrandon.potter@amd.com          _fileName(reg._fileName), _fileOffset(reg._fileOffset)
11411856Sbrandon.potter@amd.com    { }
11511856Sbrandon.potter@amd.com
11613030Sbrandon.potter@amd.com    std::shared_ptr<FDEntry>
11711856Sbrandon.potter@amd.com    clone() const override
11811856Sbrandon.potter@amd.com    {
11911856Sbrandon.potter@amd.com        return std::make_shared<FileFDEntry>(*this);
12011856Sbrandon.potter@amd.com    }
12111856Sbrandon.potter@amd.com
12213030Sbrandon.potter@amd.com    std::string const& getFileName() const { return _fileName; }
12313030Sbrandon.potter@amd.com    uint64_t getFileOffset() const { return _fileOffset; }
12411856Sbrandon.potter@amd.com
12513030Sbrandon.potter@amd.com    void setFileName(std::string const& file_name) { _fileName = file_name; }
12613030Sbrandon.potter@amd.com    void setFileOffset(uint64_t f_off) { _fileOffset = f_off; }
12711856Sbrandon.potter@amd.com
12811168Sandreas.hansson@arm.com    void serialize(CheckpointOut &cp) const override;
12911168Sandreas.hansson@arm.com    void unserialize(CheckpointIn &cp) override;
13010930Sbrandon.potter@amd.com
13111856Sbrandon.potter@amd.com  private:
13211856Sbrandon.potter@amd.com    std::string _fileName;
13311856Sbrandon.potter@amd.com    uint64_t _fileOffset;
13411856Sbrandon.potter@amd.com};
13510930Sbrandon.potter@amd.com
13611856Sbrandon.potter@amd.com/**
13711856Sbrandon.potter@amd.com * Holds the metadata needed to maintain the mappings for file descriptors
13811856Sbrandon.potter@amd.com * allocated with the pipe() system calls and its variants.
13911856Sbrandon.potter@amd.com */
14011856Sbrandon.potter@amd.comclass PipeFDEntry: public HBFDEntry
14111856Sbrandon.potter@amd.com{
14211856Sbrandon.potter@amd.com  public:
14311856Sbrandon.potter@amd.com    enum EndType {
14411856Sbrandon.potter@amd.com        read = 0,
14511856Sbrandon.potter@amd.com        write = 1
14611856Sbrandon.potter@amd.com    };
14710930Sbrandon.potter@amd.com
14811856Sbrandon.potter@amd.com    PipeFDEntry(int sim_fd, int flags, EndType pipe_end_type,
14911856Sbrandon.potter@amd.com                bool close_on_exec = false)
15011856Sbrandon.potter@amd.com        : HBFDEntry(flags, sim_fd, close_on_exec), _pipeReadSource(-1),
15111856Sbrandon.potter@amd.com          _pipeEndType(pipe_end_type)
15211856Sbrandon.potter@amd.com    { }
15310930Sbrandon.potter@amd.com
15411856Sbrandon.potter@amd.com    PipeFDEntry(PipeFDEntry const& pipe, bool close_on_exec = false)
15511856Sbrandon.potter@amd.com        : HBFDEntry(pipe._flags, pipe._simFD, close_on_exec),
15611856Sbrandon.potter@amd.com          _pipeReadSource(pipe._pipeReadSource),
15711856Sbrandon.potter@amd.com          _pipeEndType(pipe._pipeEndType)
15811856Sbrandon.potter@amd.com    { }
15911856Sbrandon.potter@amd.com
16013030Sbrandon.potter@amd.com    std::shared_ptr<FDEntry>
16111856Sbrandon.potter@amd.com    clone() const override
16211856Sbrandon.potter@amd.com    {
16311856Sbrandon.potter@amd.com        return std::make_shared<PipeFDEntry>(*this);
16411856Sbrandon.potter@amd.com    }
16511856Sbrandon.potter@amd.com
16613030Sbrandon.potter@amd.com    EndType getEndType() const { return _pipeEndType; }
16713030Sbrandon.potter@amd.com    int getPipeReadSource() const { return _pipeReadSource; }
16811856Sbrandon.potter@amd.com
16913030Sbrandon.potter@amd.com    void setPipeReadSource(int tgt_fd) { _pipeReadSource = tgt_fd; }
17013030Sbrandon.potter@amd.com    void setEndType(EndType type) { _pipeEndType = type; }
17111856Sbrandon.potter@amd.com
17211856Sbrandon.potter@amd.com    void serialize(CheckpointOut &cp) const override;
17311856Sbrandon.potter@amd.com    void unserialize(CheckpointIn &cp) override;
17411856Sbrandon.potter@amd.com
17511856Sbrandon.potter@amd.com  private:
17611856Sbrandon.potter@amd.com    int _pipeReadSource;
17711856Sbrandon.potter@amd.com    EndType _pipeEndType;
17811856Sbrandon.potter@amd.com};
17911856Sbrandon.potter@amd.com
18011856Sbrandon.potter@amd.com/**
18111856Sbrandon.potter@amd.com * Holds file descriptors needed to simulate devices opened with pseudo
18211856Sbrandon.potter@amd.com * files (commonly with calls to ioctls).
18311856Sbrandon.potter@amd.com */
18411856Sbrandon.potter@amd.comclass DeviceFDEntry : public FDEntry
18511856Sbrandon.potter@amd.com{
18611856Sbrandon.potter@amd.com  public:
18711856Sbrandon.potter@amd.com    DeviceFDEntry(EmulatedDriver *driver, std::string const& file_name,
18811856Sbrandon.potter@amd.com                  bool close_on_exec = false)
18911856Sbrandon.potter@amd.com        : FDEntry(close_on_exec), _driver(driver), _fileName(file_name)
19011856Sbrandon.potter@amd.com    { }
19111856Sbrandon.potter@amd.com
19211856Sbrandon.potter@amd.com    DeviceFDEntry(DeviceFDEntry const& dev, bool close_on_exec = false)
19311856Sbrandon.potter@amd.com        : FDEntry(close_on_exec), _driver(dev._driver),
19411856Sbrandon.potter@amd.com          _fileName(dev._fileName)
19511856Sbrandon.potter@amd.com    { }
19611856Sbrandon.potter@amd.com
19711856Sbrandon.potter@amd.com    std::shared_ptr<FDEntry>
19811856Sbrandon.potter@amd.com    clone() const override
19911856Sbrandon.potter@amd.com    {
20011856Sbrandon.potter@amd.com        return std::make_shared<DeviceFDEntry>(*this);
20111856Sbrandon.potter@amd.com    }
20211856Sbrandon.potter@amd.com
20313030Sbrandon.potter@amd.com    EmulatedDriver *getDriver() const { return _driver; }
20413030Sbrandon.potter@amd.com    std::string const& getFileName() const { return _fileName; }
20511856Sbrandon.potter@amd.com
20611856Sbrandon.potter@amd.com    void serialize(CheckpointOut &cp) const override;
20711856Sbrandon.potter@amd.com    void unserialize(CheckpointIn &cp) override;
20811856Sbrandon.potter@amd.com
20911856Sbrandon.potter@amd.com  private:
21011856Sbrandon.potter@amd.com    EmulatedDriver *_driver;
21111856Sbrandon.potter@amd.com    std::string _fileName;
21210930Sbrandon.potter@amd.com};
21310930Sbrandon.potter@amd.com
21410930Sbrandon.potter@amd.com#endif // __FD_ENTRY_HH__
215