Improve context switching and scheduler APIs.
[monolithium.git] / sdk / defs.h
1 /*
2  * defs.h
3  *
4  * Copyright (C) 2017 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Affero General Public License as
8  * published by the Free Software Foundation, either version 3 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU Affero General Public License for more details.
15  *
16  * You should have received a copy of the GNU Affero General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20 #ifndef __MONOLITHIUM_DEFS_H__
21 #define __MONOLITHIUM_DEFS_H__
22
23 #include <limits.h>
24 #include <stdarg.h>
25 #include <stddef.h>
26 #include <stdint.h>
27
28 #define FALSE 0
29 #define TRUE (!FALSE)
30 #define VARIABLE_SIZE 0
31
32 /* Monolithium-specific Type Limits */
33 #define BYTE_MIN  0
34 #define BYTE_MAX  0xFF
35 #define WORD_MIN  0
36 #define WORD_MAX  0xFFFF
37 #define DWORD_MIN 0
38 #define DWORD_MAX 0xFFFFFFFF
39 #define QWORD_MIN 0ULL
40 #define QWORD_MAX 0xFFFFFFFFFFFFFFFFULL
41
42 /* Monolithium Error Codes */
43 #define ERR_SUCCESS   0x00000000
44 #define ERR_NOTFOUND  0xE0000001
45 #define ERR_FORBIDDEN 0xE0000002
46 #define ERR_INVALID   0xE0000003
47 #define ERR_EXISTS    0xE0000004
48 #define ERR_NOMEMORY  0xE0000005
49 #define ERR_HARDWARE  0xE0000006
50 #define ERR_BUSY      0xE0000007
51 #define ERR_WRITEPROT 0xE0000008
52 #define ERR_NOSYSCALL 0xE0000009
53 #define ERR_TIMEOUT   0xE000000A
54 #define ERR_BADPTR    0xE000000B
55 #define ERR_CANCELED  0xE000000C
56 #define ERR_ISDIR     0xE000000D
57 #define ERR_ISNOTDIR  0xE000000E
58 #define ERR_DISKFULL  0xE000000F
59 #define ERR_BEYOND    0xE0000010
60 #define ERR_SMALLBUF  0xE0000011
61 #define ERR_NOMORE    0xE0000012
62 #define MAX_ERR       0xE0000013
63
64 #define MAX_PATH 16384
65
66 #define UNUSED_PARAMETER(x) (x)=(x)
67 #define OFFSET_OF(type, field) ((uintptr_t)(&((type*)NULL)->field))
68 #define CONTAINER_OF(ptr, type, field) ((type*)((uintptr_t)(ptr) - OFFSET_OF(type, field)))
69
70 /* Monolithium-specific Types */
71 typedef uint8_t bool_t;
72 typedef uint8_t byte_t;
73 typedef uint16_t word_t;
74 typedef uint32_t dword_t;
75 typedef uint64_t qword_t;
76
77 /* System call return value */
78 typedef qword_t sysret_t;
79
80 typedef dword_t timeout_t;
81
82 static inline void set_bit(dword_t *bitfield, dword_t bit)
83 {
84     bitfield[bit >> 5] |= 1 << (bit & 0x1F);
85 }
86
87 static inline void clear_bit(dword_t *bitfield, dword_t bit)
88 {
89     bitfield[bit >> 5] &= ~(1 << (bit & 0x1F));
90 }
91
92 static inline bool_t test_bit(dword_t *bitfield, dword_t bit)
93 {
94     return (bitfield[bit >> 5] & (1 << (bit & 0x1F))) ? TRUE : FALSE;
95 }
96
97 static inline void push_to_stack(uintptr_t *stack, uintptr_t value)
98 {
99     *stack -= sizeof(uintptr_t);
100     *((uintptr_t*)(*stack)) = value;
101 }
102
103 static inline uintptr_t pop_from_stack(uintptr_t *stack)
104 {
105     uintptr_t value = *((uintptr_t*)(*stack));
106     *stack += sizeof(uintptr_t);
107     return value;
108 }
109
110 static inline const char *get_error_string(dword_t err_num)
111 {
112     static const char *error_strings[] = {
113         "ERR_SUCCESS",
114         "ERR_NOTFOUND",
115         "ERR_FORBIDDEN",
116         "ERR_INVALID",
117         "ERR_EXISTS",
118         "ERR_NOMEMORY",
119         "ERR_HARDWARE",
120         "ERR_BUSY",
121         "ERR_NOMEDIA",
122         "ERR_NOTRESP",
123         "ERR_WRITEPROT",
124         "ERR_NOSYSCALL",
125         "ERR_TIMEOUT",
126         "ERR_BADPTR",
127         "ERR_CANCELED",
128         "ERR_ISDIR",
129         "ERR_ISNOTDIR",
130         "ERR_DISKFULL",
131         "ERR_MEDIACHG"
132     };
133
134     if (err_num == 0)
135     {
136         return error_strings[0];
137     }
138     else if (err_num >= 0xE0000000)
139     {
140         if (err_num < MAX_ERR) return error_strings[err_num - 0xE0000000];
141     }
142
143     return NULL;
144 }
145
146 #endif