xref: /qemu/tests/tcg/cris/bare/sys.c (revision d4f6e58f)
1*d4f6e58fSAlex Bennée /*
2*d4f6e58fSAlex Bennée  * Helper functions for CRIS system tests
3*d4f6e58fSAlex Bennée  *
4*d4f6e58fSAlex Bennée  * There is no libc and only a limited set of headers.
5*d4f6e58fSAlex Bennée  */
6*d4f6e58fSAlex Bennée 
7*d4f6e58fSAlex Bennée #include <stddef.h>
8*d4f6e58fSAlex Bennée 
exit(int status)9*d4f6e58fSAlex Bennée void exit(int status)
10*d4f6e58fSAlex Bennée {
11*d4f6e58fSAlex Bennée     register unsigned int callno asm ("r9") = 1; /* NR_exit */
12*d4f6e58fSAlex Bennée 
13*d4f6e58fSAlex Bennée     asm volatile ("break 13\n"
14*d4f6e58fSAlex Bennée                   : /* no outputs */
15*d4f6e58fSAlex Bennée                   : "r" (callno)
16*d4f6e58fSAlex Bennée                   : "memory");
17*d4f6e58fSAlex Bennée     while (1) {
18*d4f6e58fSAlex Bennée         /* do nothing */
19*d4f6e58fSAlex Bennée     };
20*d4f6e58fSAlex Bennée }
21*d4f6e58fSAlex Bennée 
write(int fd,const void * buf,size_t count)22*d4f6e58fSAlex Bennée size_t write(int fd, const void *buf, size_t count)
23*d4f6e58fSAlex Bennée {
24*d4f6e58fSAlex Bennée     register unsigned int callno asm ("r9") = 4; /* NR_write */
25*d4f6e58fSAlex Bennée     register unsigned int r10 asm ("r10") = fd;
26*d4f6e58fSAlex Bennée     register const void *r11 asm ("r11") = buf;
27*d4f6e58fSAlex Bennée     register size_t r12 asm ("r12") = count;
28*d4f6e58fSAlex Bennée     register unsigned int r asm ("r10");
29*d4f6e58fSAlex Bennée 
30*d4f6e58fSAlex Bennée     asm volatile ("break 13\n"
31*d4f6e58fSAlex Bennée                   : "=r" (r)
32*d4f6e58fSAlex Bennée                   : "r" (callno), "0" (r10), "r" (r11), "r" (r12)
33*d4f6e58fSAlex Bennée                   : "memory");
34*d4f6e58fSAlex Bennée 
35*d4f6e58fSAlex Bennée     return r;
36*d4f6e58fSAlex Bennée }
37*d4f6e58fSAlex Bennée 
mystrlen(char * s)38*d4f6e58fSAlex Bennée static inline int mystrlen(char *s)
39*d4f6e58fSAlex Bennée {
40*d4f6e58fSAlex Bennée     int i = 0;
41*d4f6e58fSAlex Bennée     while (s[i]) {
42*d4f6e58fSAlex Bennée         i++;
43*d4f6e58fSAlex Bennée     }
44*d4f6e58fSAlex Bennée     return i;
45*d4f6e58fSAlex Bennée }
46*d4f6e58fSAlex Bennée 
47*d4f6e58fSAlex Bennée 
pass(void)48*d4f6e58fSAlex Bennée void pass(void)
49*d4f6e58fSAlex Bennée {
50*d4f6e58fSAlex Bennée     char s[] = "passed.\n";
51*d4f6e58fSAlex Bennée     write(1, s, sizeof(s) - 1);
52*d4f6e58fSAlex Bennée     exit(0);
53*d4f6e58fSAlex Bennée }
54*d4f6e58fSAlex Bennée 
_fail(char * reason)55*d4f6e58fSAlex Bennée void _fail(char *reason)
56*d4f6e58fSAlex Bennée {
57*d4f6e58fSAlex Bennée     char s[] = "\nfailed: ";
58*d4f6e58fSAlex Bennée     int len = mystrlen(reason);
59*d4f6e58fSAlex Bennée     write(1, s, sizeof(s) - 1);
60*d4f6e58fSAlex Bennée     write(1, reason, len);
61*d4f6e58fSAlex Bennée     write(1, "\n", 1);
62*d4f6e58fSAlex Bennée     exit(1);
63*d4f6e58fSAlex Bennée }
64