Remove <nodeputy.h> from default flags
[barrelfish] / kernel / include / kernel.h
1 /**
2  * \file
3  * \brief Standard headers for kernel code.
4  *
5  * All C source in the kernel should include this file first.
6  * This file should contain only definitions and prototypes that are
7  * required for the majority of kernel code.
8  */
9
10 /*
11  * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
12  * All rights reserved.
13  *
14  * This file is distributed under the terms in the attached LICENSE file.
15  * If you do not find this file, copies can be found by writing to:
16  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
17  */
18
19 #ifndef __KERNEL_H
20 #define __KERNEL_H
21
22 #include <assert.h>
23 #include <stddef.h>
24 #include <stdio.h> // printf for debug
25 #include <stdint.h>
26 #include <inttypes.h>
27 #include <stdbool.h>
28 #include <barrelfish_kpi/types.h>
29 #include <barrelfish_kpi/cpu.h>
30 #include <barrelfish_kpi/registers_arch.h>
31 #include <errors/errno.h>
32 #include <offsets.h> /* XXX */
33 #include <schedule.h>
34
35 extern coreid_t my_core_id;
36
37 bool arch_core_is_bsp(void);
38
39 /*
40  * Utility macros.
41  * FIXME: should we move these elsewhere?
42  */
43
44 /** Macro to return the number of entries in a statically-allocated array. */
45 #define ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0]))
46
47 /// Round up n to the next multiple of size
48 #define ROUND_UP(n, size)           ((((n) + (size) - 1)) & (~((size) - 1)))
49
50 #ifndef min
51 #define min(a,b) ((a) < (b) ? (a) : (b))
52 #endif
53 #ifndef max
54 #define max(a,b) ((a) > (b) ? (a) : (b))
55 #endif
56
57 /**
58  * \brief Align block at base_addr with size n to power of two
59  * alignable at its size
60  *
61  * Compute the highest exponent x of n so that 2^x \< n _and_
62  * the base_addr is aligned at its size.
63  * For example: n = 20, base_addr = 4 => size can be 1, 2 or 4.
64  * Biggest possible block is 4 => x = 2
65  *
66  * \param n         Size of the block to split in bytes
67  * \param base_addr Base address of the block to split
68  *
69  * \return Highest exponent (bits) for the blocksize to use next
70  */
71
72 /// Computes the floor of log_2 of the given number
73 static inline uint8_t log2flr(uintptr_t num)
74 {
75     uint8_t l = 0;
76     uintptr_t n;
77     for (n = num; n > 1; n >>= 1, l++);
78     return l;
79 }
80
81 static inline int bitaddralign(size_t n, lpaddr_t base_addr)
82 {
83     int exponent = sizeof(size_t) * NBBY - 1;
84
85     if(n == 0) {
86         return 0;
87     }
88
89     while ((exponent > 0) && ((base_addr % (1UL << exponent)) != 0)){
90         exponent--;
91     }
92     return((1UL << exponent) > n ? log2flr(n) : exponent);
93 }
94
95 /**
96  * Kernel subsystems.
97  */
98 #define SUBSYS_STARTUP          (1 << 0)        ///< Startup
99 #define SUBSYS_GDB              (1 << 1)        ///< GDB stub
100 #define SUBSYS_APIC             (1 << 2)        ///< APIC driver
101 #define SUBSYS_ELF              (1 << 3)        ///< ELF64 loader
102 #define SUBSYS_PAGING           (1 << 4)        ///< Paging
103 #define SUBSYS_SYSCALL          (1 << 5)        ///< System calls
104 #define SUBSYS_CAPS             (1 << 6)        ///< Capabilities
105 #define SUBSYS_DISPATCH         (1 << 7)        ///< Scheduling and dispatch
106 #define SUBSYS_IO               (1 << 8)        ///< Low-level IO operations
107
108 /**
109  * Kernel message loglevels.
110  */
111 #define LOG_PANIC       0       ///< Panic
112 #define LOG_ERR         1       ///< Error
113 #define LOG_WARN        2       ///< Warning
114 #define LOG_NOTE        3       ///< Notice
115 #define LOG_DEBUG       4       ///< Debug
116
117 void debug_print_backtrace(void);
118 void panic(const char *, ...)
119     __attribute__((noreturn, format(printf, 1, 2)));
120 void breakpoint(void);
121 void printk(int level, const char *msg, ...)
122     __attribute__ ((format(printf, 2, 3)));
123 int printf_nolog(const char * fmt, ...)
124     __attribute__ ((format(printf, 1, 2)));
125 void wait_cycles(uint64_t duration);
126 void kernel_startup_early(void);
127 void kernel_startup(void) __attribute__ ((noreturn));
128
129 /**
130  * Command-line variable to set kernel logging level.
131  */
132 extern int kernel_loglevel;
133
134 /**
135  * Command-line variable to control which subsystems log. Bits defined
136  * SUBSYS_* definitions in this file.
137  */
138 extern int kernel_log_subsystem_mask;
139
140 /**
141  * \brief Log a kernel debug message.
142  *
143  * Logs printf()-style debug message 'fmt' from subsystem 'subs'
144  * to the default kernel console(s). Additional arguments are like
145  * printf(). Whether the message is put out depends on the current
146  * kernel log level, as well as on the current kernel subsystem log
147  * mask.  'debug' is a macro so that the cost of marshalling the
148  * arguments is avoided if the relevant debugging is disabled.
149  *
150  * \param _subs     Subsystem this message stems from.
151  * \param _fmt      The message (printf() format string)
152  */
153
154 #define debug(_subs, _fmt, ...) \
155 do { \
156     if (((_subs) & kernel_log_subsystem_mask) && (kernel_loglevel > LOG_DEBUG)) \
157         printk(LOG_DEBUG, _fmt, ## __VA_ARGS__); \
158 } while(0)
159
160 /**
161  * command-line option for kernel timeslice in milliseconds.
162  */
163 extern int kernel_timeslice;
164
165 /**
166  * variable for gating timer interrupts.
167  */
168 extern bool kernel_ticks_enabled;
169
170 /**
171  * Current kernel epoch in number of kernel_timeslice elapsed.
172  *
173  * XXX AKK: shouldn't this be systime_t?
174  * (It seems to count ms and not ticks anyway)
175  */
176 extern size_t kernel_now;
177
178 extern lvaddr_t kernel_trace_buf;
179
180 extern struct capability monitor_ep;
181
182 /*
183  * Variant based on Padraig Brady's implementation
184  * http://www.pixelbeat.org/programming/gcc/static_assert.html
185  */
186 #define ASSERT_CONCAT_(a, b) a##b
187 #define ASSERT_CONCAT(a, b) ASSERT_CONCAT_(a, b)
188
189 /* These can't be used after statements in c89. */
190 #ifdef __COUNTER__
191   /* Microsoft compiler. */
192   #define STATIC_ASSERT(e,m) \
193     enum { ASSERT_CONCAT(static_assert_, __COUNTER__) = 1/(!!(e)) }
194 #else
195   /* This can't be used twice on the same line so ensure if using in headers
196    * that the headers are not included twice (by wrapping in #ifndef...#endif)
197    * Note it doesn't cause an issue when used on same line of separate modules
198    * compiled with gcc -combine -fwhole-program.  */
199   #define STATIC_ASSERT(e,m) \
200     enum { ASSERT_CONCAT(assert_line_, __LINE__) = 1/(!!(e)) }
201 #endif
202
203 #define STATIC_ASSERT_SIZEOF(tname,n)                   \
204     STATIC_ASSERT(sizeof(tname) == n,                   \
205         ASSERT_CONCAT("Size mismatch:", tname)          \
206         )
207
208 #define sa_offsetof(x,y) ((size_t)(((void*)&(((x*)0)->y)) - (void*)(x*)0))
209
210 #define STATIC_ASSERT_OFFSETOF(tname, field, offset)    \
211     STATIC_ASSERT(sa_offsetof(tname, field) == offset,    \
212         ASSERT_CONCAT("Offset mismatch:", field)        \
213         )
214
215 #endif // __KERNEL_H