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