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