19c354591SAlex Bennée /* 29c354591SAlex Bennée * Semihosting Console Test 39c354591SAlex Bennée * 49c354591SAlex Bennée * Copyright (c) 2019 Linaro Ltd 59c354591SAlex Bennée * 69c354591SAlex Bennée * SPDX-License-Identifier: GPL-2.0-or-later 79c354591SAlex Bennée */ 89c354591SAlex Bennée 9*bb52a8a2SPaolo Bonzini #include <stdint.h> 109c354591SAlex Bennée #include <minilib.h> 119c354591SAlex Bennée 129c354591SAlex Bennée #define SYS_READC 0x7 139c354591SAlex Bennée __semi_call(uintptr_t type,uintptr_t arg0)149c354591SAlex Bennéeuintptr_t __semi_call(uintptr_t type, uintptr_t arg0) 159c354591SAlex Bennée { 169c354591SAlex Bennée register uintptr_t t asm("x0") = type; 179c354591SAlex Bennée register uintptr_t a0 asm("x1") = arg0; 189c354591SAlex Bennée asm("hlt 0xf000" 199c354591SAlex Bennée : "=r" (t) 209c354591SAlex Bennée : "r" (t), "r" (a0)); 219c354591SAlex Bennée 229c354591SAlex Bennée return t; 239c354591SAlex Bennée } 249c354591SAlex Bennée main(void)259c354591SAlex Bennéeint main(void) 269c354591SAlex Bennée { 279c354591SAlex Bennée char c; 289c354591SAlex Bennée 299c354591SAlex Bennée ml_printf("Semihosting Console Test\n"); 309c354591SAlex Bennée ml_printf("hit X to exit:"); 319c354591SAlex Bennée 329c354591SAlex Bennée do { 339c354591SAlex Bennée c = __semi_call(SYS_READC, 0); 349c354591SAlex Bennée __sys_outc(c); 359c354591SAlex Bennée } while (c != 'X'); 369c354591SAlex Bennée 379c354591SAlex Bennée return 0; 389c354591SAlex Bennée } 39