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