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 l4_atomic_add(volatile long int* mem, long int offset) L4_NOTHROW L4_LONG_CALL;
91 l4_atomic_xchg(volatile long int* mem, long int newval) L4_NOTHROW L4_LONG_CALL;
94 l4_atomic_cmpxchg(volatile long int* mem, long int oldval, long int newval) L4_NOTHROW L4_LONG_CALL;
97 * -------------------------------------------------------------------
101 #define __KDEBUG_ARM_PARAM_0(nr) \
103 register unsigned long r0 __asm__("r0"); \
104 __asm__ __volatile__ \
106 "stmdb sp!, {r1-r12,lr} \n\t" \
109 "cmp lr, #" #nr " \n\t" \
110 "ldmia sp!, {r1-r12,lr} \n\t" \
114 "i" (L4_SYSCALL_ENTER_KDEBUG) \
119 #define __KDEBUG_ARM_PARAM_1(nr, p1) \
121 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
122 __asm__ __volatile__ \
124 "stmdb sp!, {r1-r12,lr} \n\t" \
127 "cmp lr, #" #nr " \n\t" \
128 "ldmia sp!, {r1-r12,lr} \n\t" \
132 "i" (L4_SYSCALL_ENTER_KDEBUG), \
138 #define __KDEBUG_ARM_PARAM_2(nr, p1, p2) \
140 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
141 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
142 __asm__ __volatile__ \
144 "stmdb sp!, {r2-r12,lr} \n\t" \
147 "cmp lr, #" #nr " \n\t" \
148 "ldmia sp!, {r2-r12,lr} \n\t" \
153 "i" (L4_SYSCALL_ENTER_KDEBUG), \
160 #define __KDEBUG_ARM_PARAM_3(nr, p1, p2, p3) \
162 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
163 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
164 register unsigned long r2 __asm__("r2") = (unsigned long)(p3);\
165 __asm__ __volatile__ \
167 "stmdb sp!, {r3-r12,lr} \n\t" \
170 "cmp lr, #" #nr " \n\t" \
171 "ldmia sp!, {r3-r12,lr} \n\t" \
177 "i" (L4_SYSCALL_ENTER_KDEBUG), \
185 #define __KDEBUG_ARM_PARAM_5(nr, p1, p2, p3, p4, p5) \
187 register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
188 register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
189 register unsigned long r2 __asm__("r2") = (unsigned long)(p3);\
190 register unsigned long r3 __asm__("r3") = (unsigned long)(p4);\
191 register unsigned long r4 __asm__("r4") = (unsigned long)(p5);\
192 __asm__ __volatile__ \
194 "stmdb sp!, {r5-r12,lr} \n\t" \
197 "cmp lr, #" #nr " \n\t" \
198 "ldmia sp!, {r5-r12,lr} \n\t" \
206 "i" (L4_SYSCALL_ENTER_KDEBUG), \
218 outnstring(const char* x, unsigned len) L4_NOTHROW
220 __asm__ volatile ("" : : : "memory");
221 __KDEBUG_ARM_PARAM_2(3, x, len);
225 outstring(const char *text) L4_NOTHROW
227 __asm__ volatile("" : : : "memory");
228 __KDEBUG_ARM_PARAM_1(2, text);
232 outchar(char c) L4_NOTHROW
234 __KDEBUG_ARM_PARAM_1(1, c);
238 outdec(int number) L4_NOTHROW
240 __KDEBUG_ARM_PARAM_1(4, number);
244 outhex32(int number) L4_NOTHROW
246 __KDEBUG_ARM_PARAM_1(5, number);
250 outhex20(int number) L4_NOTHROW
252 __KDEBUG_ARM_PARAM_1(6, number);
256 outhex16(int number) L4_NOTHROW
258 __KDEBUG_ARM_PARAM_1(7, number);
262 outhex12(int number) L4_NOTHROW
264 __KDEBUG_ARM_PARAM_1(8, number);
268 outhex8(int number) L4_NOTHROW
270 __KDEBUG_ARM_PARAM_1(9, number);
274 kd_display(char *text) L4_NOTHROW
280 l4kd_inchar(void) L4_NOTHROW
282 return __KDEBUG_ARM_PARAM_0(0xd);
286 l4_sys_cli(void) L4_NOTHROW
288 __KDEBUG_ARM_PARAM_0(0x32);
292 l4_sys_sti(void) L4_NOTHROW
294 __KDEBUG_ARM_PARAM_0(0x33);