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