xref: /qemu/tests/tcg/aarch64/system/semiconsole.c (revision 8e3d85d36b77f11ad7bded3a2d48c1f0cc334f82)
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ée uintptr_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ée int 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