3 * \brief Kernel debugger macros
7 * (c) 2008-2009 Technische Universität Dresden
8 * This file is part of TUD:OS and distributed under the terms of the
9 * GNU General Public License 2.
10 * Please see the COPYING-GPL-2 file for details.
12 * As a special exception, you may use this file as part of a free software
13 * library without restriction. Specifically, if other files instantiate
14 * templates or use macros or inline functions from this file, or you compile
15 * this file and link it with other files to produce an executable, this
16 * file does not by itself cause the resulting executable to be covered by
17 * the GNU General Public License. This exception does not however
18 * invalidate any other reasons why the executable file might be covered by
19 * the GNU General Public License.
23 #include <l4/sys/compiler.h>
27 #ifndef L4_SYSCALL_MAGIC_OFFSET
28 # define L4_SYSCALL_MAGIC_OFFSET 8
30 #define L4_SYSCALL_ENTER_KDEBUG (-0x00000020-L4_SYSCALL_MAGIC_OFFSET)
32 #define enter_kdebug(text...) \
33 __asm__ __volatile__ ( \
37 " .ascii \"" text "\" \n" \
42 : "i" (L4_SYSCALL_ENTER_KDEBUG) \
46 outnstring(const char* x, unsigned len) L4_NOTHROW;
49 outstring(const char *text) L4_NOTHROW;
52 outchar(char c) L4_NOTHROW;
55 outdec(int number) L4_NOTHROW;
58 outhex32(int number) L4_NOTHROW;
61 outhex20(int number) L4_NOTHROW;
64 outhex16(int number) L4_NOTHROW;
67 outhex12(int number) L4_NOTHROW;
70 outhex8(int number) L4_NOTHROW;
73 kd_display(char *text) L4_NOTHROW;
76 l4kd_inchar(void) L4_NOTHROW;
79 l4_sys_cli(void) L4_NOTHROW;
82 l4_sys_sti(void) L4_NOTHROW;
85 l4_atomic_add(volatile long int* mem, long int offset) L4_NOTHROW L4_LONG_CALL;
88 l4_atomic_cmpxchg(volatile long int* mem, long int oldval, long int newval) L4_NOTHROW L4_LONG_CALL;
91 * -------------------------------------------------------------------
95 #define __KDEBUG_ARM_PARAM_0(nr) \
97 register unsigned long r0 __asm__("r0"); \
98 __asm__ __volatile__ \
100 "stmdb sp!, {r1-r12,lr} \n\t" \
103 "cmp lr, #" #nr " \n\t" \
104 "ldmia sp!, {r1-r12,lr} \n\t" \
108 "i" (L4_SYSCALL_ENTER_KDEBUG) \
113 #define __KDEBUG_ARM_PARAM_1(nr, p1) \
115 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
116 __asm__ __volatile__ \
118 "stmdb sp!, {r1-r12,lr} \n\t" \
121 "cmp lr, #" #nr " \n\t" \
122 "ldmia sp!, {r1-r12,lr} \n\t" \
126 "i" (L4_SYSCALL_ENTER_KDEBUG), \
132 #define __KDEBUG_ARM_PARAM_2(nr, p1, p2) \
134 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
135 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
136 __asm__ __volatile__ \
138 "stmdb sp!, {r2-r12,lr} \n\t" \
141 "cmp lr, #" #nr " \n\t" \
142 "ldmia sp!, {r2-r12,lr} \n\t" \
147 "i" (L4_SYSCALL_ENTER_KDEBUG), \
154 #define __KDEBUG_ARM_PARAM_3(nr, p1, p2, p3) \
156 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
157 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
158 register unsigned long r2 __asm__("r2") = (unsigned long)(p3);\
159 __asm__ __volatile__ \
161 "stmdb sp!, {r3-r12,lr} \n\t" \
164 "cmp lr, #" #nr " \n\t" \
165 "ldmia sp!, {r3-r12,lr} \n\t" \
171 "i" (L4_SYSCALL_ENTER_KDEBUG), \
179 #define __KDEBUG_ARM_PARAM_5(nr, p1, p2, p3, p4, p5) \
181 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
182 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
183 register unsigned long r2 __asm__("r2") = (unsigned long)(p3);\
184 register unsigned long r3 __asm__("r3") = (unsigned long)(p4);\
185 register unsigned long r4 __asm__("r4") = (unsigned long)(p5);\
186 __asm__ __volatile__ \
188 "stmdb sp!, {r5-r12,lr} \n\t" \
191 "cmp lr, #" #nr " \n\t" \
192 "ldmia sp!, {r5-r12,lr} \n\t" \
200 "i" (L4_SYSCALL_ENTER_KDEBUG), \
212 outnstring(const char* x, unsigned len) L4_NOTHROW
214 __asm__ volatile ("" : : : "memory");
215 __KDEBUG_ARM_PARAM_2(3, x, len);
219 outstring(const char *text) L4_NOTHROW
221 __asm__ volatile("" : : : "memory");
222 __KDEBUG_ARM_PARAM_1(2, text);
226 outchar(char c) L4_NOTHROW
228 __KDEBUG_ARM_PARAM_1(1, c);
232 outdec(int number) L4_NOTHROW
234 __KDEBUG_ARM_PARAM_1(4, number);
238 outhex32(int number) L4_NOTHROW
240 __KDEBUG_ARM_PARAM_1(5, number);
244 outhex20(int number) L4_NOTHROW
246 __KDEBUG_ARM_PARAM_1(6, number);
250 outhex16(int number) L4_NOTHROW
252 __KDEBUG_ARM_PARAM_1(7, number);
256 outhex12(int number) L4_NOTHROW
258 __KDEBUG_ARM_PARAM_1(8, number);
262 outhex8(int number) L4_NOTHROW
264 __KDEBUG_ARM_PARAM_1(9, number);
268 kd_display(char *text) L4_NOTHROW
274 l4kd_inchar(void) L4_NOTHROW
276 return __KDEBUG_ARM_PARAM_0(0xd);
280 l4_sys_cli(void) L4_NOTHROW
282 __KDEBUG_ARM_PARAM_0(0x32);
286 l4_sys_sti(void) L4_NOTHROW
288 __KDEBUG_ARM_PARAM_0(0x33);