3 * \brief Kernel debugger macros
7 * (c) 2008-2009 Adam Lackorzynski <adam@os.inf.tu-dresden.de>,
8 * Alexander Warg <warg@os.inf.tu-dresden.de>
9 * economic rights: Technische Universität Dresden (Germany)
11 * This file is part of TUD:OS and distributed under the terms of the
12 * GNU General Public License 2.
13 * Please see the COPYING-GPL-2 file for details.
15 * As a special exception, you may use this file as part of a free software
16 * library without restriction. Specifically, if other files instantiate
17 * templates or use macros or inline functions from this file, or you compile
18 * this file and link it with other files to produce an executable, this
19 * file does not by itself cause the resulting executable to be covered by
20 * the GNU General Public License. This exception does not however
21 * invalidate any other reasons why the executable file might be covered by
22 * the GNU General Public License.
26 #include <l4/sys/compiler.h>
30 #ifndef L4_SYSCALL_MAGIC_OFFSET
31 # define L4_SYSCALL_MAGIC_OFFSET 8
33 #define L4_SYSCALL_ENTER_KDEBUG (-0x00000020-L4_SYSCALL_MAGIC_OFFSET)
35 #define enter_kdebug(text...) \
36 __asm__ __volatile__ ( \
40 " .ascii \"" text "\" \n" \
45 : "i" (L4_SYSCALL_ENTER_KDEBUG) \
49 outnstring(const char* x, unsigned len) L4_NOTHROW;
52 outstring(const char *text) L4_NOTHROW;
55 outchar(char c) L4_NOTHROW;
58 outdec(int number) L4_NOTHROW;
61 outhex32(int number) L4_NOTHROW;
64 outhex20(int number) L4_NOTHROW;
67 outhex16(int number) L4_NOTHROW;
70 outhex12(int number) L4_NOTHROW;
73 outhex8(int number) L4_NOTHROW;
76 kd_display(char *text) L4_NOTHROW;
79 l4kd_inchar(void) L4_NOTHROW;
82 * -------------------------------------------------------------------
86 #define __KDEBUG_ARM_PARAM_0(nr) \
88 register unsigned long r0 __asm__("r0"); \
89 __asm__ __volatile__ \
91 "stmdb sp!, {r1-r12,lr} \n\t" \
94 "cmp lr, #" #nr " \n\t" \
95 "ldmia sp!, {r1-r12,lr} \n\t" \
99 "i" (L4_SYSCALL_ENTER_KDEBUG) \
104 #define __KDEBUG_ARM_PARAM_1(nr, p1) \
106 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
107 __asm__ __volatile__ \
109 "stmdb sp!, {r1-r12,lr} \n\t" \
112 "cmp lr, #" #nr " \n\t" \
113 "ldmia sp!, {r1-r12,lr} \n\t" \
117 "i" (L4_SYSCALL_ENTER_KDEBUG), \
123 #define __KDEBUG_ARM_PARAM_2(nr, p1, p2) \
125 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
126 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
127 __asm__ __volatile__ \
129 "stmdb sp!, {r2-r12,lr} \n\t" \
132 "cmp lr, #" #nr " \n\t" \
133 "ldmia sp!, {r2-r12,lr} \n\t" \
138 "i" (L4_SYSCALL_ENTER_KDEBUG), \
145 #define __KDEBUG_ARM_PARAM_3(nr, p1, p2, p3) \
147 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
148 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
149 register unsigned long r2 __asm__("r2") = (unsigned long)(p3);\
150 __asm__ __volatile__ \
152 "stmdb sp!, {r3-r12,lr} \n\t" \
155 "cmp lr, #" #nr " \n\t" \
156 "ldmia sp!, {r3-r12,lr} \n\t" \
162 "i" (L4_SYSCALL_ENTER_KDEBUG), \
170 #define __KDEBUG_ARM_PARAM_5(nr, p1, p2, p3, p4, p5) \
172 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
173 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
174 register unsigned long r2 __asm__("r2") = (unsigned long)(p3);\
175 register unsigned long r3 __asm__("r3") = (unsigned long)(p4);\
176 register unsigned long r4 __asm__("r4") = (unsigned long)(p5);\
177 __asm__ __volatile__ \
179 "stmdb sp!, {r5-r12,lr} \n\t" \
182 "cmp lr, #" #nr " \n\t" \
183 "ldmia sp!, {r5-r12,lr} \n\t" \
191 "i" (L4_SYSCALL_ENTER_KDEBUG), \
203 outnstring(const char* x, unsigned len) L4_NOTHROW
205 __asm__ volatile ("" : : : "memory");
206 __KDEBUG_ARM_PARAM_2(3, x, len);
210 outstring(const char *text) L4_NOTHROW
212 __asm__ volatile("" : : : "memory");
213 __KDEBUG_ARM_PARAM_1(2, text);
217 outchar(char c) L4_NOTHROW
219 __KDEBUG_ARM_PARAM_1(1, c);
223 outdec(int number) L4_NOTHROW
225 __KDEBUG_ARM_PARAM_1(4, number);
229 outhex32(int number) L4_NOTHROW
231 __KDEBUG_ARM_PARAM_1(5, number);
235 outhex20(int number) L4_NOTHROW
237 __KDEBUG_ARM_PARAM_1(6, number);
241 outhex16(int number) L4_NOTHROW
243 __KDEBUG_ARM_PARAM_1(7, number);
247 outhex12(int number) L4_NOTHROW
249 __KDEBUG_ARM_PARAM_1(8, number);
253 outhex8(int number) L4_NOTHROW
255 __KDEBUG_ARM_PARAM_1(9, number);
259 kd_display(char *text) L4_NOTHROW
265 l4kd_inchar(void) L4_NOTHROW
267 return __KDEBUG_ARM_PARAM_0(0xd);