int htif_console_getchar() { __check_fromhost(); int ch = htif_console_buf; if (ch >= 0) { htif_console_buf = -1; __set_tohost(1, 0, 0); } return ch - 1; }
static void do_tohost_fromhost(uintptr_t dev, uintptr_t cmd, uintptr_t data) { __set_tohost(dev, cmd, data); while (1) { uint64_t fh = fromhost; if (fh) { if (FROMHOST_DEV(fh) == dev && FROMHOST_CMD(fh) == cmd) { fromhost = 0; break; } __check_fromhost(); } } }
void htif_console_putchar(uint8_t ch) { #if __riscv_xlen == 32 // HTIF devices are not supported on RV32, so proxy a write system call volatile uint64_t magic_mem[8]; magic_mem[0] = SYS_write; magic_mem[1] = 1; magic_mem[2] = (uintptr_t)&ch; magic_mem[3] = 1; do_tohost_fromhost(0, 0, (uintptr_t)magic_mem); #else spinlock_lock(&htif_lock); __set_tohost(1, 1, ch); spinlock_unlock(&htif_lock); #endif }
int htif_console_getchar() { #if __riscv_xlen == 32 // HTIF devices are not supported on RV32 return -1; #endif spinlock_lock(&htif_lock); __check_fromhost(); int ch = htif_console_buf; if (ch >= 0) { htif_console_buf = -1; __set_tohost(1, 0, 0); } spinlock_unlock(&htif_lock); return ch - 1; }
void htif_console_putchar(uint8_t ch) { __set_tohost(1, 1, ch); }