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 l4_sys_cli(void) L4_NOTHROW;
85 l4_sys_sti(void) L4_NOTHROW;
88 * -------------------------------------------------------------------
92 #define __KDEBUG_ARM_PARAM_0(nr) \
94 register unsigned long r0 __asm__("r0"); \
95 __asm__ __volatile__ \
97 "stmdb sp!, {r1-r12,lr} \n\t" \
100 "cmp lr, #" #nr " \n\t" \
101 "ldmia sp!, {r1-r12,lr} \n\t" \
105 "i" (L4_SYSCALL_ENTER_KDEBUG) \
110 #define __KDEBUG_ARM_PARAM_1(nr, p1) \
112 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
113 __asm__ __volatile__ \
115 "stmdb sp!, {r1-r12,lr} \n\t" \
118 "cmp lr, #" #nr " \n\t" \
119 "ldmia sp!, {r1-r12,lr} \n\t" \
123 "i" (L4_SYSCALL_ENTER_KDEBUG), \
129 #define __KDEBUG_ARM_PARAM_2(nr, p1, p2) \
131 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
132 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
133 __asm__ __volatile__ \
135 "stmdb sp!, {r2-r12,lr} \n\t" \
138 "cmp lr, #" #nr " \n\t" \
139 "ldmia sp!, {r2-r12,lr} \n\t" \
144 "i" (L4_SYSCALL_ENTER_KDEBUG), \
151 #define __KDEBUG_ARM_PARAM_3(nr, p1, p2, p3) \
153 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
154 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
155 register unsigned long r2 __asm__("r2") = (unsigned long)(p3);\
156 __asm__ __volatile__ \
158 "stmdb sp!, {r3-r12,lr} \n\t" \
161 "cmp lr, #" #nr " \n\t" \
162 "ldmia sp!, {r3-r12,lr} \n\t" \
168 "i" (L4_SYSCALL_ENTER_KDEBUG), \
176 #define __KDEBUG_ARM_PARAM_5(nr, p1, p2, p3, p4, p5) \
178 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
179 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
180 register unsigned long r2 __asm__("r2") = (unsigned long)(p3);\
181 register unsigned long r3 __asm__("r3") = (unsigned long)(p4);\
182 register unsigned long r4 __asm__("r4") = (unsigned long)(p5);\
183 __asm__ __volatile__ \
185 "stmdb sp!, {r5-r12,lr} \n\t" \
188 "cmp lr, #" #nr " \n\t" \
189 "ldmia sp!, {r5-r12,lr} \n\t" \
197 "i" (L4_SYSCALL_ENTER_KDEBUG), \
209 outnstring(const char* x, unsigned len) L4_NOTHROW
211 __asm__ volatile ("" : : : "memory");
212 __KDEBUG_ARM_PARAM_2(3, x, len);
216 outstring(const char *text) L4_NOTHROW
218 __asm__ volatile("" : : : "memory");
219 __KDEBUG_ARM_PARAM_1(2, text);
223 outchar(char c) L4_NOTHROW
225 __KDEBUG_ARM_PARAM_1(1, c);
229 outdec(int number) L4_NOTHROW
231 __KDEBUG_ARM_PARAM_1(4, number);
235 outhex32(int number) L4_NOTHROW
237 __KDEBUG_ARM_PARAM_1(5, number);
241 outhex20(int number) L4_NOTHROW
243 __KDEBUG_ARM_PARAM_1(6, number);
247 outhex16(int number) L4_NOTHROW
249 __KDEBUG_ARM_PARAM_1(7, number);
253 outhex12(int number) L4_NOTHROW
255 __KDEBUG_ARM_PARAM_1(8, number);
259 outhex8(int number) L4_NOTHROW
261 __KDEBUG_ARM_PARAM_1(9, number);
265 kd_display(char *text) L4_NOTHROW
271 l4kd_inchar(void) L4_NOTHROW
273 return __KDEBUG_ARM_PARAM_0(0xd);
277 l4_sys_cli(void) L4_NOTHROW
279 __KDEBUG_ARM_PARAM_0(0x32);
283 l4_sys_sti(void) L4_NOTHROW
285 __KDEBUG_ARM_PARAM_0(0x33);