]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4sys/include/ARCH-arm/kdebug.h
update
[l4.git] / l4 / pkg / l4sys / include / ARCH-arm / kdebug.h
1 /**
2  * \file
3  * \brief   Kernel debugger macros
4  * \ingroup api_calls
5  */
6 /*
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)
10  *
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.
14  *
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.
23  */
24 #pragma once
25
26 #include <l4/sys/compiler.h>
27
28 #ifdef __GNUC__
29
30 #ifndef L4_SYSCALL_MAGIC_OFFSET
31 #  define L4_SYSCALL_MAGIC_OFFSET       8
32 #endif
33 #define L4_SYSCALL_ENTER_KDEBUG         (-0x00000020-L4_SYSCALL_MAGIC_OFFSET)
34
35 #define enter_kdebug(text...)                   \
36 __asm__ __volatile__ (                          \
37     "   mov     lr, pc          \n"             \
38     "   mov     pc, %0          \n"             \
39     "   b       1f              \n"             \
40     "   .ascii  \"" text "\"    \n"             \
41     "   .byte   0               \n"             \
42     "   .align  4               \n"             \
43     "1:                         \n"             \
44     :                                           \
45     : "i" (L4_SYSCALL_ENTER_KDEBUG)             \
46     : "lr")
47
48 L4_INLINE void
49 outnstring(const char* x, unsigned len) L4_NOTHROW;
50
51 L4_INLINE void
52 outstring(const char *text) L4_NOTHROW;
53
54 L4_INLINE void
55 outchar(char c) L4_NOTHROW;
56
57 L4_INLINE void
58 outdec(int number) L4_NOTHROW;
59
60 L4_INLINE void
61 outhex32(int number) L4_NOTHROW;
62
63 L4_INLINE void
64 outhex20(int number) L4_NOTHROW;
65
66 L4_INLINE void
67 outhex16(int number) L4_NOTHROW;
68
69 L4_INLINE void
70 outhex12(int number) L4_NOTHROW;
71
72 L4_INLINE void
73 outhex8(int number) L4_NOTHROW;
74
75 L4_INLINE void
76 kd_display(char *text) L4_NOTHROW;
77
78 L4_INLINE int
79 l4kd_inchar(void) L4_NOTHROW;
80
81 L4_INLINE void
82 l4_sys_cli(void) L4_NOTHROW;
83
84 L4_INLINE void
85 l4_sys_sti(void) L4_NOTHROW;
86
87 /*
88  * -------------------------------------------------------------------
89  * Implementations
90  */
91
92 #define __KDEBUG_ARM_PARAM_0(nr)                                \
93   ({                                                            \
94     register unsigned long r0 __asm__("r0");                    \
95     __asm__ __volatile__                                        \
96       (                                                         \
97        "stmdb sp!, {r1-r12,lr}  \n\t"                           \
98        "mov     lr, pc          \n\t"                           \
99        "mov     pc, %1          \n\t"                           \
100        "cmp     lr, #" #nr "    \n\t"                           \
101        "ldmia sp!, {r1-r12,lr}  \n\t"                           \
102        :                                                        \
103        "=r" (r0)                                                \
104        :                                                        \
105        "i" (L4_SYSCALL_ENTER_KDEBUG)                            \
106       );                                                        \
107     r0;                                                         \
108   })
109
110 #define __KDEBUG_ARM_PARAM_1(nr, p1)                            \
111   ({                                                            \
112     register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
113     __asm__ __volatile__                                        \
114       (                                                         \
115        "stmdb sp!, {r1-r12,lr}  \n\t"                           \
116        "mov     lr, pc          \n\t"                           \
117        "mov     pc, %1          \n\t"                           \
118        "cmp     lr, #" #nr "    \n\t"                           \
119        "ldmia sp!, {r1-r12,lr}  \n\t"                           \
120        :                                                        \
121        "=r" (r0)                                                \
122        :                                                        \
123        "i" (L4_SYSCALL_ENTER_KDEBUG),                           \
124        "0" (r0)                                                 \
125       );                                                        \
126     r0;                                                         \
127   })
128
129 #define __KDEBUG_ARM_PARAM_2(nr, p1, p2)                        \
130   ({                                                            \
131     register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
132     register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
133     __asm__ __volatile__                                        \
134       (                                                         \
135        "stmdb sp!, {r2-r12,lr}  \n\t"                           \
136        "mov     lr, pc          \n\t"                           \
137        "mov     pc, %2          \n\t"                           \
138        "cmp     lr, #" #nr "    \n\t"                           \
139        "ldmia sp!, {r2-r12,lr}  \n\t"                           \
140        :                                                        \
141        "=r" (r0),                                               \
142        "=r" (r1)                                                \
143        :                                                        \
144        "i" (L4_SYSCALL_ENTER_KDEBUG),                           \
145        "0" (r0),                                                \
146        "r" (r1)                                                 \
147       );                                                        \
148     r0;                                                         \
149   })
150
151 #define __KDEBUG_ARM_PARAM_3(nr, p1, p2, p3)                    \
152   ({                                                            \
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__                                        \
157       (                                                         \
158        "stmdb sp!, {r3-r12,lr}  \n\t"                           \
159        "mov     lr, pc          \n\t"                           \
160        "mov     pc, %3          \n\t"                           \
161        "cmp     lr, #" #nr "    \n\t"                           \
162        "ldmia sp!, {r3-r12,lr}  \n\t"                           \
163        :                                                        \
164        "=r" (r0),                                               \
165        "=r" (r1),                                               \
166        "=r" (r2)                                                \
167        :                                                        \
168        "i" (L4_SYSCALL_ENTER_KDEBUG),                           \
169        "0" (r0),                                                \
170        "r" (r1),                                                \
171        "r" (r2)                                                 \
172       );                                                        \
173     r0;                                                         \
174   })
175
176 #define __KDEBUG_ARM_PARAM_5(nr, p1, p2, p3, p4, p5)            \
177   ({                                                            \
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__                                        \
184       (                                                         \
185        "stmdb sp!, {r5-r12,lr}  \n\t"                           \
186        "mov     lr, pc          \n\t"                           \
187        "mov     pc, %5          \n\t"                           \
188        "cmp     lr, #" #nr "    \n\t"                           \
189        "ldmia sp!, {r5-r12,lr}  \n\t"                           \
190        :                                                        \
191        "=r" (r0),                                               \
192        "=r" (r1),                                               \
193        "=r" (r2),                                               \
194        "=r" (r3),                                               \
195        "=r" (r4)                                                \
196        :                                                        \
197        "i" (L4_SYSCALL_ENTER_KDEBUG),                           \
198        "0" (r0),                                                \
199        "r" (r1),                                                \
200        "r" (r2),                                                \
201        "r" (r3),                                                \
202        "r" (r4)                                                 \
203       );                                                        \
204     r0;                                                         \
205   })
206
207
208 L4_INLINE void
209 outnstring(const char* x, unsigned len) L4_NOTHROW
210 {
211   __asm__ volatile ("" : : : "memory");
212   __KDEBUG_ARM_PARAM_2(3, x, len);
213 }
214
215 L4_INLINE void
216 outstring(const char *text) L4_NOTHROW
217 {
218   __asm__ volatile("" : : : "memory");
219   __KDEBUG_ARM_PARAM_1(2, text);
220 }
221
222 L4_INLINE void
223 outchar(char c) L4_NOTHROW
224 {
225   __KDEBUG_ARM_PARAM_1(1, c);
226 }
227
228 L4_INLINE void
229 outdec(int number) L4_NOTHROW
230 {
231   __KDEBUG_ARM_PARAM_1(4, number);
232 }
233
234 L4_INLINE void
235 outhex32(int number) L4_NOTHROW
236 {
237   __KDEBUG_ARM_PARAM_1(5, number);
238 }
239
240 L4_INLINE void
241 outhex20(int number) L4_NOTHROW
242 {
243   __KDEBUG_ARM_PARAM_1(6, number);
244 }
245
246 L4_INLINE void
247 outhex16(int number) L4_NOTHROW
248 {
249   __KDEBUG_ARM_PARAM_1(7, number);
250 }
251
252 L4_INLINE void
253 outhex12(int number) L4_NOTHROW
254 {
255   __KDEBUG_ARM_PARAM_1(8, number);
256 }
257
258 L4_INLINE void
259 outhex8(int number) L4_NOTHROW
260 {
261   __KDEBUG_ARM_PARAM_1(9, number);
262 }
263
264 L4_INLINE void
265 kd_display(char *text) L4_NOTHROW
266 {
267   outstring(text);
268 }
269
270 L4_INLINE int
271 l4kd_inchar(void) L4_NOTHROW
272 {
273   return __KDEBUG_ARM_PARAM_0(0xd);
274 }
275
276 L4_INLINE void
277 l4_sys_cli(void) L4_NOTHROW
278 {
279   __KDEBUG_ARM_PARAM_0(0x32);
280 }
281
282 L4_INLINE void
283 l4_sys_sti(void) L4_NOTHROW
284 {
285   __KDEBUG_ARM_PARAM_0(0x33);
286 }
287
288 #endif //__GNUC__