smp_call wait / backend work
[akaros.git] / ivylib / deputy_kern.c
1 #include <inc/stdio.h>
2 #include <inc/assert.h>
3 #include <inc/string.h>
4
5 #define IN_DEPUTY_LIBRARY
6
7 // Use inline even when not optimizing for speed, since it prevents
8 // warnings that would occur due to unused static functions.
9 #ifdef DEPUTY_ALWAYS_STOP_ON_ERROR
10   #define INLINE inline __attribute__((always_inline))
11 #else
12   #define INLINE inline
13 #endif
14
15 #define __LOCATION__        __FILE__, __LINE__, __FUNCTION__
16 #define __LOCATION__FORMALS const char* file, int line, const char* func
17 #define __LOCATION__ACTUALS file, line, func
18
19 #ifndef asmlinkage
20 #define asmlinkage __attribute__((regparm(0)))
21 #endif
22
23 #ifndef noreturn
24 #define noreturn __attribute__((noreturn))
25 #endif
26
27 asmlinkage
28 void deputy_fail_mayreturn(const char *check, const char *text,
29                            __LOCATION__FORMALS) {
30     cprintf("%s:%d: %s: Assertion failed in %s: %s\n",
31             __LOCATION__ACTUALS, check, text);
32 /*
33     dump_stack();
34 */
35 }
36
37 asmlinkage noreturn
38 void deputy_fail_noreturn_fast(void) {
39     panic("Deputy assertion failure\n");
40 }
41
42 int deputy_strlen(const char *str) {
43     return strlen(str);
44 }
45
46 char *deputy_strcpy(char *dest, const char *src) {
47     char *tmp = dest;
48     while ((*dest++ = *src++) != '\0') {
49         // do nothing
50     }
51     return tmp;
52 }
53
54 char *deputy_strncpy(char *dest, const char *src, size_t count) {
55     char *tmp = dest;
56     int c = count;
57     while (c >= 0) {
58         if ((*tmp = *src) != 0) src++;
59         tmp++;
60         c--;
61     }
62     return dest;
63 }
64
65 /* Search for a NULL starting at e and return its index */
66 int deputy_findnull(const void *e, unsigned int bytes) {
67 #define NULLCHECK(type) \
68     do { \
69         type *p = (type*) e; \
70         while (*p != 0) { \
71             p++; \
72         } \
73         length = (p - (type*) e); \
74     } while (0)
75
76     int length = 0;
77
78     switch (bytes) {
79         case 1:
80             NULLCHECK(char);
81             break;
82         case 2:
83             NULLCHECK(short);
84             break;
85         case 4:
86             NULLCHECK(long);
87             break;
88         default:
89             cprintf("Invalid byte size for nullcheck.\n");
90             break;
91     }
92
93     return length;
94 #undef NULLCHECK
95 }
96
97 void *__deputy_memset(void *s, int c, unsigned int n) {
98   return memset(s, c, n);
99 }
100
101 void __ivy_handler_atomic_entry() __attribute__((weak));
102 void __ivy_handler_atomic_entry() {return;}
103
104 void __ivy_handler_atomic_exit() __attribute__((weak));
105 void __ivy_handler_atomic_exit() {return;}
106
107 void __ivy_handler_atomic_locks_entry(unsigned int n, ...) __attribute__((weak));
108 void __ivy_handler_atomic_locks_entry(unsigned int n, ...) {return;}
109
110 void __ivy_handler_atomic_locks_exit(unsigned int n, ...) __attribute__((weak));
111 void __ivy_handler_atomic_locks_exit(unsigned int n, ...) {return;}