1a331c6d7SAlex Bennée /* 2a331c6d7SAlex Bennée * Semihosting Console 3a331c6d7SAlex Bennée * 4a331c6d7SAlex Bennée * Copyright (c) 2019 Linaro Ltd 5a331c6d7SAlex Bennée * 6a331c6d7SAlex Bennée * SPDX-License-Identifier: GPL-2.0-or-later 7a331c6d7SAlex Bennée */ 8a331c6d7SAlex Bennée 937677d7dSMarkus Armbruster #ifndef SEMIHOST_CONSOLE_H 1037677d7dSMarkus Armbruster #define SEMIHOST_CONSOLE_H 11a331c6d7SAlex Bennée 12a331c6d7SAlex Bennée /** 13e7fb6f32SRichard Henderson * qemu_semihosting_console_read: 143367d452SRichard Henderson * @cs: CPUState 15e7fb6f32SRichard Henderson * @buf: host buffer 16e7fb6f32SRichard Henderson * @len: buffer size 178de702cbSKeith Packard * 18e7fb6f32SRichard Henderson * Receive at least one character from debug console. As this call may 19e7fb6f32SRichard Henderson * block if no data is available we suspend the CPU and will re-execute the 20675f702fSRichard Henderson * instruction when data is there. Therefore two conditions must be met: 21675f702fSRichard Henderson * 228de702cbSKeith Packard * - CPUState is synchronized before calling this function 238de702cbSKeith Packard * - pc is only updated once the character is successfully returned 248de702cbSKeith Packard * 25e7fb6f32SRichard Henderson * Returns: number of characters read, OR cpu_loop_exit! 268de702cbSKeith Packard */ 27e7fb6f32SRichard Henderson int qemu_semihosting_console_read(CPUState *cs, void *buf, int len); 288de702cbSKeith Packard 298de702cbSKeith Packard /** 30cd66f20fSRichard Henderson * qemu_semihosting_console_write: 31cd66f20fSRichard Henderson * @buf: host buffer 32cd66f20fSRichard Henderson * @len: buffer size 33cd66f20fSRichard Henderson * 34cd66f20fSRichard Henderson * Write len bytes from buf to the debug console. 35cd66f20fSRichard Henderson * 36cd66f20fSRichard Henderson * Returns: number of bytes written -- this should only ever be short 37cd66f20fSRichard Henderson * on some sort of i/o error. 38cd66f20fSRichard Henderson */ 39cd66f20fSRichard Henderson int qemu_semihosting_console_write(void *buf, int len); 40cd66f20fSRichard Henderson 41*1b9177f7SRichard Henderson /* 42*1b9177f7SRichard Henderson * qemu_semihosting_console_block_until_ready: 43*1b9177f7SRichard Henderson * @cs: CPUState 44*1b9177f7SRichard Henderson * 45*1b9177f7SRichard Henderson * If no data is available we suspend the CPU and will re-execute the 46*1b9177f7SRichard Henderson * instruction when data is available. 47*1b9177f7SRichard Henderson */ 48*1b9177f7SRichard Henderson void qemu_semihosting_console_block_until_ready(CPUState *cs); 49*1b9177f7SRichard Henderson 50*1b9177f7SRichard Henderson /** 51*1b9177f7SRichard Henderson * qemu_semihosting_console_ready: 52*1b9177f7SRichard Henderson * 53*1b9177f7SRichard Henderson * Return true if characters are available for read; does not block. 54*1b9177f7SRichard Henderson */ 55*1b9177f7SRichard Henderson bool qemu_semihosting_console_ready(void); 56*1b9177f7SRichard Henderson 5737677d7dSMarkus Armbruster #endif /* SEMIHOST_CONSOLE_H */ 58