Change the timer syscalls so that sysret_t can be 32-bit
[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 #define NO_TIMEOUT 0xFFFFFFFF
66
67 #define UNUSED_PARAMETER(x) (x)=(x)
68 #define OFFSET_OF(type, field) ((uintptr_t)(&((type*)NULL)->field))
69 #define CONTAINER_OF(ptr, type, field) ((type*)((uintptr_t)(ptr) - OFFSET_OF(type, field)))
70
71 /* Monolithium-specific Types */
72 typedef uint8_t bool_t;
73 typedef uint8_t byte_t;
74 typedef uint16_t word_t;
75 typedef uint32_t dword_t;
76 typedef uint64_t qword_t;
77
78 /* System call return value */
79 typedef dword_t sysret_t;
80
81 typedef dword_t timeout_t;
82
83 static inline void set_bit(dword_t *bitfield, dword_t bit)
84 {
85     bitfield[bit >> 5] |= 1 << (bit & 0x1F);
86 }
87
88 static inline void clear_bit(dword_t *bitfield, dword_t bit)
89 {
90     bitfield[bit >> 5] &= ~(1 << (bit & 0x1F));
91 }
92
93 static inline bool_t test_bit(dword_t *bitfield, dword_t bit)
94 {
95     return (bitfield[bit >> 5] & (1 << (bit & 0x1F))) ? TRUE : FALSE;
96 }
97
98 static inline void push_to_stack(uintptr_t *stack, uintptr_t value)
99 {
100     *stack -= sizeof(uintptr_t);
101     *((uintptr_t*)(*stack)) = value;
102 }
103
104 static inline uintptr_t pop_from_stack(uintptr_t *stack)
105 {
106     uintptr_t value = *((uintptr_t*)(*stack));
107     *stack += sizeof(uintptr_t);
108     return value;
109 }
110
111 static inline const char *get_error_string(dword_t err_num)
112 {
113     static const char *error_strings[] = {
114         "ERR_SUCCESS",
115         "ERR_NOTFOUND",
116         "ERR_FORBIDDEN",
117         "ERR_INVALID",
118         "ERR_EXISTS",
119         "ERR_NOMEMORY",
120         "ERR_HARDWARE",
121         "ERR_BUSY",
122         "ERR_NOMEDIA",
123         "ERR_NOTRESP",
124         "ERR_WRITEPROT",
125         "ERR_NOSYSCALL",
126         "ERR_TIMEOUT",
127         "ERR_BADPTR",
128         "ERR_CANCELED",
129         "ERR_ISDIR",
130         "ERR_ISNOTDIR",
131         "ERR_DISKFULL",
132         "ERR_MEDIACHG"
133     };
134
135     if (err_num == 0)
136     {
137         return error_strings[0];
138     }
139     else if (err_num >= 0xE0000000)
140     {
141         if (err_num < MAX_ERR) return error_strings[err_num - 0xE0000000];
142     }
143
144     return NULL;
145 }
146
147 #endif