| /* | 
 |  * ARM Compatible Semihosting Console Support. | 
 |  * | 
 |  * Copyright (c) 2019 Linaro Ltd | 
 |  * | 
 |  * Currently ARM and RISC-V are unique in having support for | 
 |  * semihosting support in linux-user. So for now we implement the | 
 |  * common console API but just for arm and risc-v linux-user. | 
 |  * | 
 |  * SPDX-License-Identifier: GPL-2.0-or-later | 
 |  */ | 
 |  | 
 | #include "qemu/osdep.h" | 
 | #include "semihosting/console.h" | 
 | #include "qemu.h" | 
 | #include "user-internals.h" | 
 | #include <termios.h> | 
 |  | 
 | /* | 
 |  * For linux-user we can safely block. However as we want to return as | 
 |  * soon as a character is read we need to tweak the termio to disable | 
 |  * line buffering. We restore the old mode afterwards in case the | 
 |  * program is expecting more normal behaviour. This is slow but | 
 |  * nothing using semihosting console reading is expecting to be fast. | 
 |  */ | 
 | int qemu_semihosting_console_read(CPUState *cs, void *buf, int len) | 
 | { | 
 |     int ret; | 
 |     struct termios old_tio, new_tio; | 
 |  | 
 |     /* Disable line-buffering and echo */ | 
 |     tcgetattr(STDIN_FILENO, &old_tio); | 
 |     new_tio = old_tio; | 
 |     new_tio.c_lflag &= (~ICANON & ~ECHO); | 
 |     new_tio.c_cc[VMIN] = 1; | 
 |     new_tio.c_cc[VTIME] = 0; | 
 |     tcsetattr(STDIN_FILENO, TCSANOW, &new_tio); | 
 |  | 
 |     ret = fread(buf, 1, len, stdin); | 
 |  | 
 |     /* restore config */ | 
 |     tcsetattr(STDIN_FILENO, TCSANOW, &old_tio); | 
 |  | 
 |     return ret; | 
 | } | 
 |  | 
 | int qemu_semihosting_console_write(void *buf, int len) | 
 | { | 
 |     return fwrite(buf, 1, len, stderr); | 
 | } |