/* * Copyright (c) 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009 * The President and Fellows of Harvard College. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _LIB_H_ #define _LIB_H_ /* * Miscellaneous standard C functions for the kernel, and other widely used * kernel functions. * * Note: setjmp and longjmp are in . */ #include /* * Assert macros. * * KASSERT and DEBUGASSERT are the same, except that they can be * toggled independently. DEBUGASSERT is used in places where making * checks is likely to be expensive and relatively unlikely to be * helpful. * * Note that there's also a COMPILE_ASSERT for compile-time checks; * it's in . * * Regular assertions (KASSERT) are disabled by the kernel config * option "noasserts". DEBUGASSERT could be controlled by kernel * config also, but since it's likely to be wanted only rarely during * testing there doesn't seem much point; one can just edit this file * temporarily instead. */ #include "opt-noasserts.h" #if OPT_NOASSERTS #define KASSERT(expr) ((void)(expr)) #else #define KASSERT(expr) \ ((expr) ? (void)0 : badassert(#expr, __FILE__, __LINE__, __func__)) #endif #if 1 /* no debug asserts */ #define DEBUGASSERT(expr) ((void)(expr)) #else #define DEBUGASSERT(expr) \ ((expr) ? (void)0 : badassert(#expr, __FILE__, __LINE__, __func__)) #endif /* * Bit flags for DEBUG() */ #define DB_LOCORE 0x0001 #define DB_SYSCALL 0x0002 #define DB_INTERRUPT 0x0004 #define DB_DEVICE 0x0008 #define DB_THREADS 0x0010 #define DB_VM 0x0020 #define DB_EXEC 0x0040 #define DB_VFS 0x0080 #define DB_SEMFS 0x0100 #define DB_SFS 0x0200 #define DB_NET 0x0400 #define DB_NETFS 0x0800 #define DB_KMALLOC 0x1000 extern uint32_t dbflags; /* * DEBUG() is for conditionally printing debug messages to the console. * * The idea is that you put lots of lines of the form * * DEBUG(DB_VM, "VM free pages: %u\n", free_pages); * * throughout the kernel; then you can toggle whether these messages * are printed or not at runtime by setting the value of dbflags with * the debugger. * * Unfortunately, as of this writing, there are only a very few such * messages actually present in the system yet. Feel free to add more. * * DEBUG is a varargs macro. These were added to the language in C99. */ #define DEBUG(d, ...) ((dbflags & (d)) ? kprintf(__VA_ARGS__) : 0) /* * Random number generator, using the random device. * * random() returns a number between 0 and randmax() inclusive. */ #define RANDOM_MAX (randmax()) uint32_t randmax(void); uint32_t random(void); /* * Kernel heap memory allocation. Like malloc/free. * If out of memory, kmalloc returns NULL. * * kheap_nextgeneration, dump, and dumpall do nothing unless heap * labeling (for leak detection) in kmalloc.c (q.v.) is enabled. */ void *kmalloc(size_t size); void kfree(void *ptr); void kheap_printstats(void); void kheap_nextgeneration(void); void kheap_dump(void); void kheap_dumpall(void); /* * C string functions. * * kstrdup is like strdup, but calls kmalloc instead of malloc. * If out of memory, it returns NULL. */ size_t strlen(const char *str); int strcmp(const char *str1, const char *str2); char *strcpy(char *dest, const char *src); char *strcat(char *dest, const char *src); char *kstrdup(const char *str); char *strchr(const char *searched, int searchfor); char *strrchr(const char *searched, int searchfor); char *strtok_r(char *buf, const char *seps, char **context); void *memcpy(void *dest, const void *src, size_t len); void *memmove(void *dest, const void *src, size_t len); void *memset(void *block, int ch, size_t len); void bzero(void *ptr, size_t len); int atoi(const char *str); int snprintf(char *buf, size_t maxlen, const char *fmt, ...) __PF(3,4); const char *strerror(int errcode); /* * Low-level console access. */ void putch(int ch); int getch(void); void beep(void); /* * Higher-level console output. * * kprintf is like printf, only in the kernel. * panic prepends the string "panic: " to the message printed, and then * resets the system. * badassert calls panic in a way suitable for an assertion failure. * kgets is like gets, only with a buffer size argument. * * kprintf_bootstrap sets up a lock for kprintf and should be called * during boot once malloc is available and before any additional * threads are created. */ int kprintf(const char *format, ...) __PF(1,2); __DEAD void panic(const char *format, ...) __PF(1,2); __DEAD void badassert(const char *expr, const char *file, int line, const char *func); void kgets(char *buf, size_t maxbuflen); void kprintf_bootstrap(void); /* * Other miscellaneous stuff */ #define DIVROUNDUP(a,b) (((a)+(b)-1)/(b)) #define ROUNDUP(a,b) (DIVROUNDUP(a,b)*b) #endif /* _LIB_H_ */