112239Sandreas.sandberg@arm.com/*
214249Sgiacomo.travaglini@arm.com * Copyright (c) 2019 ARM Limited
314249Sgiacomo.travaglini@arm.com * All rights reserved
414249Sgiacomo.travaglini@arm.com *
514249Sgiacomo.travaglini@arm.com * The license below extends only to copyright in the software and shall
614249Sgiacomo.travaglini@arm.com * not be construed as granting a license to any other intellectual
714249Sgiacomo.travaglini@arm.com * property including but not limited to intellectual property relating
814249Sgiacomo.travaglini@arm.com * to a hardware implementation of the functionality of the software
914249Sgiacomo.travaglini@arm.com * licensed hereunder.  You may use the software subject to the license
1014249Sgiacomo.travaglini@arm.com * terms below provided that you ensure that this notice is replicated
1114249Sgiacomo.travaglini@arm.com * unmodified and in its entirety in all distributions of the software,
1214249Sgiacomo.travaglini@arm.com * modified or unmodified, in source code or in binary form.
1314249Sgiacomo.travaglini@arm.com *
1412239Sandreas.sandberg@arm.com * Copyright (c) 2001-2005 The Regents of The University of Michigan
1512239Sandreas.sandberg@arm.com * All rights reserved.
1612239Sandreas.sandberg@arm.com *
1712239Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
1812239Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
1912239Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
2012239Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
2112239Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
2212239Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
2312239Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
2412239Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
2512239Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
2612239Sandreas.sandberg@arm.com * this software without specific prior written permission.
2712239Sandreas.sandberg@arm.com *
2812239Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2912239Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3012239Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3112239Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3212239Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3312239Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3412239Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3512239Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3612239Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3712239Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3812239Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3912239Sandreas.sandberg@arm.com *
4012239Sandreas.sandberg@arm.com * Authors: Nathan Binkert
4112239Sandreas.sandberg@arm.com *          Ali Saidi
4212239Sandreas.sandberg@arm.com */
4312239Sandreas.sandberg@arm.com
4412239Sandreas.sandberg@arm.com/* @file
4512239Sandreas.sandberg@arm.com * User Terminal Interface
4612239Sandreas.sandberg@arm.com */
4712239Sandreas.sandberg@arm.com
4812239Sandreas.sandberg@arm.com#ifndef __DEV_TERMINAL_HH__
4912239Sandreas.sandberg@arm.com#define __DEV_TERMINAL_HH__
5012239Sandreas.sandberg@arm.com
5112239Sandreas.sandberg@arm.com#include <iostream>
5212239Sandreas.sandberg@arm.com
5312239Sandreas.sandberg@arm.com#include "base/callback.hh"
5412239Sandreas.sandberg@arm.com#include "base/circlebuf.hh"
5512239Sandreas.sandberg@arm.com#include "base/pollevent.hh"
5612239Sandreas.sandberg@arm.com#include "base/socket.hh"
5712239Sandreas.sandberg@arm.com#include "dev/serial/serial.hh"
5812239Sandreas.sandberg@arm.com#include "params/Terminal.hh"
5912239Sandreas.sandberg@arm.com#include "sim/sim_object.hh"
6012239Sandreas.sandberg@arm.com
6112239Sandreas.sandberg@arm.comclass OutputStream;
6212239Sandreas.sandberg@arm.comclass TerminalListener;
6312239Sandreas.sandberg@arm.com
6412239Sandreas.sandberg@arm.comclass Terminal : public SerialDevice
6512239Sandreas.sandberg@arm.com{
6612239Sandreas.sandberg@arm.com  protected:
6712239Sandreas.sandberg@arm.com    class ListenEvent : public PollEvent
6812239Sandreas.sandberg@arm.com    {
6912239Sandreas.sandberg@arm.com      protected:
7012239Sandreas.sandberg@arm.com        Terminal *term;
7112239Sandreas.sandberg@arm.com
7212239Sandreas.sandberg@arm.com      public:
7312239Sandreas.sandberg@arm.com        ListenEvent(Terminal *t, int fd, int e);
7412239Sandreas.sandberg@arm.com        void process(int revent);
7512239Sandreas.sandberg@arm.com    };
7612239Sandreas.sandberg@arm.com
7712239Sandreas.sandberg@arm.com    friend class ListenEvent;
7812239Sandreas.sandberg@arm.com    ListenEvent *listenEvent;
7912239Sandreas.sandberg@arm.com
8012239Sandreas.sandberg@arm.com    class DataEvent : public PollEvent
8112239Sandreas.sandberg@arm.com    {
8212239Sandreas.sandberg@arm.com      protected:
8312239Sandreas.sandberg@arm.com        Terminal *term;
8412239Sandreas.sandberg@arm.com
8512239Sandreas.sandberg@arm.com      public:
8612239Sandreas.sandberg@arm.com        DataEvent(Terminal *t, int fd, int e);
8712239Sandreas.sandberg@arm.com        void process(int revent);
8812239Sandreas.sandberg@arm.com    };
8912239Sandreas.sandberg@arm.com
9012239Sandreas.sandberg@arm.com    friend class DataEvent;
9112239Sandreas.sandberg@arm.com    DataEvent *dataEvent;
9212239Sandreas.sandberg@arm.com
9312239Sandreas.sandberg@arm.com  protected:
9412239Sandreas.sandberg@arm.com    int number;
9512239Sandreas.sandberg@arm.com    int data_fd;
9612239Sandreas.sandberg@arm.com
9712239Sandreas.sandberg@arm.com  public:
9812239Sandreas.sandberg@arm.com    typedef TerminalParams Params;
9912239Sandreas.sandberg@arm.com    Terminal(const Params *p);
10012239Sandreas.sandberg@arm.com    ~Terminal();
10114249Sgiacomo.travaglini@arm.com    OutputStream * terminalDump(const TerminalParams* p);
10212239Sandreas.sandberg@arm.com
10312239Sandreas.sandberg@arm.com  protected:
10412239Sandreas.sandberg@arm.com    ListenSocket listener;
10512239Sandreas.sandberg@arm.com
10612239Sandreas.sandberg@arm.com    void listen(int port);
10712239Sandreas.sandberg@arm.com    void accept();
10812239Sandreas.sandberg@arm.com
10912239Sandreas.sandberg@arm.com  protected:
11012239Sandreas.sandberg@arm.com    CircleBuf<char> txbuf;
11112239Sandreas.sandberg@arm.com    CircleBuf<char> rxbuf;
11212239Sandreas.sandberg@arm.com    OutputStream *outfile;
11312239Sandreas.sandberg@arm.com#if TRACING_ON == 1
11412239Sandreas.sandberg@arm.com    CircleBuf<char> linebuf;
11512239Sandreas.sandberg@arm.com#endif
11612239Sandreas.sandberg@arm.com
11712239Sandreas.sandberg@arm.com  public:
11812239Sandreas.sandberg@arm.com    ///////////////////////
11912239Sandreas.sandberg@arm.com    // Terminal Interface
12012239Sandreas.sandberg@arm.com
12112239Sandreas.sandberg@arm.com    void data();
12212239Sandreas.sandberg@arm.com
12312239Sandreas.sandberg@arm.com    void read(uint8_t &c) { read(&c, 1); }
12412239Sandreas.sandberg@arm.com    size_t read(uint8_t *buf, size_t len);
12512239Sandreas.sandberg@arm.com    void write(uint8_t c) { write(&c, 1); }
12612239Sandreas.sandberg@arm.com    size_t write(const uint8_t *buf, size_t len);
12712239Sandreas.sandberg@arm.com    void detach();
12812239Sandreas.sandberg@arm.com
12912239Sandreas.sandberg@arm.com  public: // SerialDevice interface
13012239Sandreas.sandberg@arm.com    uint8_t readData() override;
13112239Sandreas.sandberg@arm.com    void writeData(uint8_t c) override;
13212239Sandreas.sandberg@arm.com    bool dataAvailable() const override { return !rxbuf.empty(); }
13312239Sandreas.sandberg@arm.com
13412239Sandreas.sandberg@arm.com  public:
13512239Sandreas.sandberg@arm.com    /////////////////
13612239Sandreas.sandberg@arm.com    // OS interface
13712239Sandreas.sandberg@arm.com
13812239Sandreas.sandberg@arm.com    // get a character from the terminal in the console specific format
13912239Sandreas.sandberg@arm.com    // corresponds to GETC:
14012239Sandreas.sandberg@arm.com    // retval<63:61>
14112239Sandreas.sandberg@arm.com    //     000: success: character received
14212239Sandreas.sandberg@arm.com    //     001: success: character received, more pending
14312239Sandreas.sandberg@arm.com    //     100: failure: no character ready
14412239Sandreas.sandberg@arm.com    //     110: failure: character received with error
14512239Sandreas.sandberg@arm.com    //     111: failure: character received with error, more pending
14612239Sandreas.sandberg@arm.com    // retval<31:0>
14712239Sandreas.sandberg@arm.com    //     character read from console
14812239Sandreas.sandberg@arm.com    //
14912239Sandreas.sandberg@arm.com    // Interrupts are cleared when the buffer is empty.
15012239Sandreas.sandberg@arm.com    uint64_t console_in();
15112239Sandreas.sandberg@arm.com};
15212239Sandreas.sandberg@arm.com
15312239Sandreas.sandberg@arm.com#endif // __DEV_TERMINAL_HH__
154