xref: /openbmc/qemu/tests/tcg/aarch64_be/hello.c (revision 2e1cacfb)
1*2e1cacfbSAlex Bennée /*
2*2e1cacfbSAlex Bennée  * Non-libc syscall hello world for Aarch64 BE
3*2e1cacfbSAlex Bennée  *
4*2e1cacfbSAlex Bennée  * SPDX-License-Identifier: GPL-2.0-or-later
5*2e1cacfbSAlex Bennée  */
6*2e1cacfbSAlex Bennée 
7*2e1cacfbSAlex Bennée #define __NR_write 64
8*2e1cacfbSAlex Bennée #define __NR_exit 93
9*2e1cacfbSAlex Bennée 
write(int fd,char * buf,int len)10*2e1cacfbSAlex Bennée int write(int fd, char *buf, int len)
11*2e1cacfbSAlex Bennée {
12*2e1cacfbSAlex Bennée     register int x0 __asm__("x0") = fd;
13*2e1cacfbSAlex Bennée     register char *x1 __asm__("x1") = buf;
14*2e1cacfbSAlex Bennée     register int x2 __asm__("x2") = len;
15*2e1cacfbSAlex Bennée     register int x8 __asm__("x8") = __NR_write;
16*2e1cacfbSAlex Bennée 
17*2e1cacfbSAlex Bennée     asm volatile("svc #0" : : "r"(x0), "r"(x1), "r"(x2), "r"(x8));
18*2e1cacfbSAlex Bennée 
19*2e1cacfbSAlex Bennée     return len;
20*2e1cacfbSAlex Bennée }
21*2e1cacfbSAlex Bennée 
exit(int ret)22*2e1cacfbSAlex Bennée void exit(int ret)
23*2e1cacfbSAlex Bennée {
24*2e1cacfbSAlex Bennée     register int x0 __asm__("x0") = ret;
25*2e1cacfbSAlex Bennée     register int x8 __asm__("x8") = __NR_exit;
26*2e1cacfbSAlex Bennée 
27*2e1cacfbSAlex Bennée     asm volatile("svc #0" : : "r"(x0), "r"(x8));
28*2e1cacfbSAlex Bennée     __builtin_unreachable();
29*2e1cacfbSAlex Bennée }
30*2e1cacfbSAlex Bennée 
_start(void)31*2e1cacfbSAlex Bennée void _start(void)
32*2e1cacfbSAlex Bennée {
33*2e1cacfbSAlex Bennée     write(1, "Hello World\n", 12);
34*2e1cacfbSAlex Bennée     exit(0);
35*2e1cacfbSAlex Bennée }
36