1/*
2 * Copyright 2002-2009, Haiku Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		Ingo Weinhold, bonefish@cs.tu-berlin.de.
7 *		Axel D��rfler, axeld@pinc-software.de.
8 */
9
10#include <signal.h>
11#define _KERNEL_MODE
12#include <stdio.h>
13#include <stdlib.h>
14#include <string.h>
15
16#include <KernelExport.h>
17
18
19bool gDebugOutputEnabled = true;
20
21
22extern "C" uint64
23parse_expression(const char* arg)
24{
25	return strtoull(arg, NULL, 0);
26}
27
28
29extern "C" bool
30set_debug_variable(const char* variableName, uint64 value)
31{
32	return true;
33}
34
35
36extern "C" bool
37print_debugger_command_usage(const char* command)
38{
39	return true;
40}
41
42
43extern "C" status_t
44add_debugger_command_etc(const char* name, debugger_command_hook func,
45	const char* description, const char* usage, uint32 flags)
46{
47	return B_OK;
48}
49
50
51extern "C" int
52add_debugger_command(const char *name, int (*func)(int, char **),
53	const char *desc)
54{
55	return B_OK;
56}
57
58
59extern "C" int
60remove_debugger_command(const char * name, int (*func)(int, char **))
61{
62	return B_OK;
63}
64
65
66extern "C" void
67panic(const char *format, ...)
68{
69	char buffer[1024];
70
71	strcpy(buffer, "PANIC: ");
72	int32 prefixLen = strlen(buffer);
73	int bufferSize = sizeof(buffer) - prefixLen;
74
75	va_list args;
76	va_start(args, format);
77	vsnprintf(buffer + prefixLen, bufferSize - 1, format, args);
78	va_end(args);
79
80	buffer[sizeof(buffer) - 1] = '\0';
81
82	debugger(buffer);
83}
84
85
86void
87kernel_debugger(const char *message)
88{
89	debugger(message);
90}
91
92
93extern "C" void
94dprintf(const char *format,...)
95{
96	if (!gDebugOutputEnabled)
97		return;
98
99	va_list args;
100	va_start(args, format);
101	printf("\33[34m");
102	vprintf(format, args);
103	printf("\33[0m");
104	fflush(stdout);
105	va_end(args);
106}
107
108
109extern "C" void
110dprintf_no_syslog(const char *format,...)
111{
112	if (!gDebugOutputEnabled)
113		return;
114
115	va_list args;
116	va_start(args, format);
117	printf("\33[34m");
118	vprintf(format, args);
119	printf("\33[0m");
120	fflush(stdout);
121	va_end(args);
122}
123
124
125extern "C" void
126kprintf(const char *format,...)
127{
128	va_list args;
129	va_start(args, format);
130	printf("\33[35m");
131	vprintf(format, args);
132	printf("\33[0m");
133	fflush(stdout);
134	va_end(args);
135}
136
137
138extern "C" void
139dump_block(const char *buffer, int size, const char *prefix)
140{
141	const int DUMPED_BLOCK_SIZE = 16;
142	int i;
143
144	for (i = 0; i < size;) {
145		int start = i;
146
147		dprintf("%s", prefix);
148		for (; i < start + DUMPED_BLOCK_SIZE; i++) {
149			if (!(i % 4))
150				dprintf(" ");
151
152			if (i >= size)
153				dprintf("  ");
154			else
155				dprintf("%02x", *(unsigned char *)(buffer + i));
156		}
157		dprintf("  ");
158
159		for (i = start; i < start + DUMPED_BLOCK_SIZE; i++) {
160			if (i < size) {
161				char c = buffer[i];
162
163				if (c < 30)
164					dprintf(".");
165				else
166					dprintf("%c", c);
167			} else
168				break;
169		}
170		dprintf("\n");
171	}
172}
173