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