1*8848c529SAlex Bennée /* 2*8848c529SAlex Bennée * Semihosting Console Test 3*8848c529SAlex Bennée * 4*8848c529SAlex Bennée * Copyright (c) 2019 Linaro Ltd 5*8848c529SAlex Bennée * 6*8848c529SAlex Bennée * SPDX-License-Identifier: GPL-2.0-or-later 7*8848c529SAlex Bennée */ 8*8848c529SAlex Bennée 9*8848c529SAlex Bennée #include <stdint.h> 10*8848c529SAlex Bennée #include <minilib.h> 11*8848c529SAlex Bennée 12*8848c529SAlex Bennée #define SYS_READC 0x7 13*8848c529SAlex Bennée __semi_call(uintptr_t type,uintptr_t arg0)14*8848c529SAlex Bennéeuintptr_t __semi_call(uintptr_t type, uintptr_t arg0) 15*8848c529SAlex Bennée { 16*8848c529SAlex Bennée register uintptr_t t asm("r0") = type; 17*8848c529SAlex Bennée register uintptr_t a0 asm("r1") = arg0; 18*8848c529SAlex Bennée #ifdef __thumb__ 19*8848c529SAlex Bennée # define SVC "svc 0xab" 20*8848c529SAlex Bennée #else 21*8848c529SAlex Bennée # define SVC "svc 0x123456" 22*8848c529SAlex Bennée #endif 23*8848c529SAlex Bennée asm(SVC : "=r" (t) 24*8848c529SAlex Bennée : "r" (t), "r" (a0)); 25*8848c529SAlex Bennée 26*8848c529SAlex Bennée return t; 27*8848c529SAlex Bennée } 28*8848c529SAlex Bennée main(void)29*8848c529SAlex Bennéeint main(void) 30*8848c529SAlex Bennée { 31*8848c529SAlex Bennée char c; 32*8848c529SAlex Bennée 33*8848c529SAlex Bennée ml_printf("Semihosting Console Test\n"); 34*8848c529SAlex Bennée ml_printf("hit X to exit:"); 35*8848c529SAlex Bennée 36*8848c529SAlex Bennée do { 37*8848c529SAlex Bennée c = __semi_call(SYS_READC, 0); 38*8848c529SAlex Bennée __sys_outc(c); 39*8848c529SAlex Bennée } while (c != 'X'); 40*8848c529SAlex Bennée 41*8848c529SAlex Bennée return 0; 42*8848c529SAlex Bennée } 43