blob: e5ebc1976717564a985609e2c424ddfe130c8b0a [file] [log] [blame]
Travis Geiselbrecht1d0df692008-09-01 02:26:09 -07001/*
2 * Copyright (c) 2008 Travis Geiselbrecht
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining
5 * a copy of this software and associated documentation files
6 * (the "Software"), to deal in the Software without restriction,
7 * including without limitation the rights to use, copy, modify, merge,
8 * publish, distribute, sublicense, and/or sell copies of the Software,
9 * and to permit persons to whom the Software is furnished to do so,
10 * subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23#ifndef __DEBUG_H
24#define __DEBUG_H
25
26#include <assert.h>
Travis Geiselbrechteb946052008-09-07 22:32:49 -070027#include <stdarg.h>
28#include <compiler.h>
Travis Geiselbrecht1d0df692008-09-01 02:26:09 -070029#include <platform/debug.h>
30#include <printf.h>
31
32#if defined(__cplusplus)
33extern "C" {
34#endif
35
36#if defined(DEBUG)
37#define DEBUGLEVEL DEBUG
38#else
39#define DEBUGLEVEL 2
40#endif
41
Travis Geiselbrechteb946052008-09-07 22:32:49 -070042/* debug levels */
43#define CRITICAL 0
44#define ALWAYS 0
45#define INFO 1
46#define SPEW 2
47
48/* output */
49void _dputc(char c); // XXX for now, platform implements
50int _dputs(const char *str);
51int _dprintf(const char *fmt, ...) __PRINTFLIKE(1, 2);
52int _dvprintf(const char *fmt, va_list ap);
53
54#define dputc(level, str) do { if ((level) <= DEBUGLEVEL) { _dputc(str); } } while (0)
55#define dputs(level, str) do { if ((level) <= DEBUGLEVEL) { _dputs(str); } } while (0)
56#define dprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dprintf(x); } } while (0)
57#define dvprintf(level, x...) do { if ((level) <= DEBUGLEVEL) { _dvprintf(x); } } while (0)
58
59/* input */
60int dgetc(char *c);
61
Travis Geiselbrecht1d0df692008-09-01 02:26:09 -070062/* systemwide halts */
63void halt(void) __NO_RETURN;
64
65void _panic(void *caller, const char *fmt, ...) __PRINTFLIKE(2, 3) __NO_RETURN;
66#define panic(x...) _panic(__GET_CALLER(), x)
67
68#define PANIC_UNIMPLEMENTED panic("%s unimplemented\n", __PRETTY_FUNCTION__)
69
70/* spin the cpu for a period of (short) time */
71void spin(uint32_t usecs);
72
73/* dump memory */
74void hexdump(const void *ptr, size_t len);
75void hexdump8(const void *ptr, size_t len);
76
77/* trace routines */
78#define TRACE_ENTRY printf("%s: entry\n", __PRETTY_FUNCTION__)
79#define TRACE_EXIT printf("%s: exit\n", __PRETTY_FUNCTION__)
80#define TRACE_ENTRY_OBJ printf("%s: entry obj %p\n", __PRETTY_FUNCTION__, this)
81#define TRACE_EXIT_OBJ printf("%s: exit obj %p\n", __PRETTY_FUNCTION__, this)
82#define TRACE printf("%s:%d\n", __PRETTY_FUNCTION__, __LINE__)
83#define TRACEF(x...) do { printf("%s:%d: ", __PRETTY_FUNCTION__, __LINE__); printf(x); } while (0)
84
85/* trace routines that work if LOCAL_TRACE is set */
86#define LTRACE_ENTRY do { if (LOCAL_TRACE) { TRACE_ENTRY; } } while (0)
87#define LTRACE_EXIT do { if (LOCAL_TRACE) { TRACE_EXIT; } } while (0)
88#define LTRACE do { if (LOCAL_TRACE) { TRACE; } } while (0)
89#define LTRACEF(x...) do { if (LOCAL_TRACE) { TRACEF(x); } } while (0)
90
91#if defined(__cplusplus)
92}
93#endif
94
95#endif