qemu
50 строк · 1.4 Кб
1/*
2* ARM Compatible Semihosting Console Support.
3*
4* Copyright (c) 2019 Linaro Ltd
5*
6* Currently ARM and RISC-V are unique in having support for
7* semihosting support in linux-user. So for now we implement the
8* common console API but just for arm and risc-v linux-user.
9*
10* SPDX-License-Identifier: GPL-2.0-or-later
11*/
12
13#include "qemu/osdep.h"14#include "semihosting/console.h"15#include "qemu.h"16#include "user-internals.h"17#include <termios.h>18
19/*
20* For linux-user we can safely block. However as we want to return as
21* soon as a character is read we need to tweak the termio to disable
22* line buffering. We restore the old mode afterwards in case the
23* program is expecting more normal behaviour. This is slow but
24* nothing using semihosting console reading is expecting to be fast.
25*/
26int qemu_semihosting_console_read(CPUState *cs, void *buf, int len)27{
28int ret;29struct termios old_tio, new_tio;30
31/* Disable line-buffering and echo */32tcgetattr(STDIN_FILENO, &old_tio);33new_tio = old_tio;34new_tio.c_lflag &= (~ICANON & ~ECHO);35new_tio.c_cc[VMIN] = 1;36new_tio.c_cc[VTIME] = 0;37tcsetattr(STDIN_FILENO, TCSANOW, &new_tio);38
39ret = fread(buf, 1, len, stdin);40
41/* restore config */42tcsetattr(STDIN_FILENO, TCSANOW, &old_tio);43
44return ret;45}
46
47int qemu_semihosting_console_write(void *buf, int len)48{
49return fwrite(buf, 1, len, stderr);50}
51