]> rtime.felk.cvut.cz Git - l4.git/blob - l4/pkg/l4sys/include/ARCH-arm/kdebug.h
6ab0d006a177ff7bcd11e6ca4f6ce93c5e75d8c2
[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 EXTERN_C long int
88 l4_atomic_add(volatile long int* mem, long int offset) L4_NOTHROW L4_LONG_CALL;
89
90 EXTERN_C long int
91 l4_atomic_xchg(volatile long int* mem, long int newval) L4_NOTHROW L4_LONG_CALL;
92
93 EXTERN_C long int
94 l4_atomic_cmpxchg(volatile long int* mem, long int oldval, long int newval) L4_NOTHROW L4_LONG_CALL;
95
96 /*
97  * -------------------------------------------------------------------
98  * Implementations
99  */
100
101 #define __KDEBUG_ARM_PARAM_0(nr)                                \
102   ({                                                            \
103     register unsigned long r0 __asm__("r0");                    \
104     __asm__ __volatile__                                        \
105       (                                                         \
106        "stmdb sp!, {r1-r12,lr}  \n\t"                           \
107        "mov     lr, pc          \n\t"                           \
108        "mov     pc, %1          \n\t"                           \
109        "cmp     lr, #" #nr "    \n\t"                           \
110        "ldmia sp!, {r1-r12,lr}  \n\t"                           \
111        :                                                        \
112        "=r" (r0)                                                \
113        :                                                        \
114        "i" (L4_SYSCALL_ENTER_KDEBUG)                            \
115       );                                                        \
116     r0;                                                         \
117   })
118
119 #define __KDEBUG_ARM_PARAM_1(nr, p1)                            \
120   ({                                                            \
121     register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
122     __asm__ __volatile__                                        \
123       (                                                         \
124        "stmdb sp!, {r1-r12,lr}  \n\t"                           \
125        "mov     lr, pc          \n\t"                           \
126        "mov     pc, %1          \n\t"                           \
127        "cmp     lr, #" #nr "    \n\t"                           \
128        "ldmia sp!, {r1-r12,lr}  \n\t"                           \
129        :                                                        \
130        "=r" (r0)                                                \
131        :                                                        \
132        "i" (L4_SYSCALL_ENTER_KDEBUG),                           \
133        "0" (r0)                                                 \
134       );                                                        \
135     r0;                                                         \
136   })
137
138 #define __KDEBUG_ARM_PARAM_2(nr, p1, p2)                        \
139   ({                                                            \
140     register unsigned long r0 __asm__("r0") = (unsigned long)(p1);\
141     register unsigned long r1 __asm__("r1") = (unsigned long)(p2);\
142     __asm__ __volatile__                                        \
143       (                                                         \
144        "stmdb sp!, {r2-r12,lr}  \n\t"                           \
145        "mov     lr, pc          \n\t"                           \
146        "mov     pc, %2          \n\t"                           \
147        "cmp     lr, #" #nr "    \n\t"                           \
148        "ldmia sp!, {r2-r12,lr}  \n\t"                           \
149        :                                                        \
150        "=r" (r0),                                               \
151        "=r" (r1)                                                \
152        :                                                        \
153        "i" (L4_SYSCALL_ENTER_KDEBUG),                           \
154        "0" (r0),                                                \
155        "r" (r1)                                                 \
156       );                                                        \
157     r0;                                                         \
158   })
159
160 #define __KDEBUG_ARM_PARAM_3(nr, p1, p2, p3)                    \
161   ({                                                            \
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__                                        \
166       (                                                         \
167        "stmdb sp!, {r3-r12,lr}  \n\t"                           \
168        "mov     lr, pc          \n\t"                           \
169        "mov     pc, %3          \n\t"                           \
170        "cmp     lr, #" #nr "    \n\t"                           \
171        "ldmia sp!, {r3-r12,lr}  \n\t"                           \
172        :                                                        \
173        "=r" (r0),                                               \
174        "=r" (r1),                                               \
175        "=r" (r2)                                                \
176        :                                                        \
177        "i" (L4_SYSCALL_ENTER_KDEBUG),                           \
178        "0" (r0),                                                \
179        "r" (r1),                                                \
180        "r" (r2)                                                 \
181       );                                                        \
182     r0;                                                         \
183   })
184
185 #define __KDEBUG_ARM_PARAM_5(nr, p1, p2, p3, p4, p5)            \
186   ({                                                            \
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__                                        \
193       (                                                         \
194        "stmdb sp!, {r5-r12,lr}  \n\t"                           \
195        "mov     lr, pc          \n\t"                           \
196        "mov     pc, %5          \n\t"                           \
197        "cmp     lr, #" #nr "    \n\t"                           \
198        "ldmia sp!, {r5-r12,lr}  \n\t"                           \
199        :                                                        \
200        "=r" (r0),                                               \
201        "=r" (r1),                                               \
202        "=r" (r2),                                               \
203        "=r" (r3),                                               \
204        "=r" (r4)                                                \
205        :                                                        \
206        "i" (L4_SYSCALL_ENTER_KDEBUG),                           \
207        "0" (r0),                                                \
208        "r" (r1),                                                \
209        "r" (r2),                                                \
210        "r" (r3),                                                \
211        "r" (r4)                                                 \
212       );                                                        \
213     r0;                                                         \
214   })
215
216
217 L4_INLINE void
218 outnstring(const char* x, unsigned len) L4_NOTHROW
219 {
220   __asm__ volatile ("" : : : "memory");
221   __KDEBUG_ARM_PARAM_2(3, x, len);
222 }
223
224 L4_INLINE void
225 outstring(const char *text) L4_NOTHROW
226 {
227   __asm__ volatile("" : : : "memory");
228   __KDEBUG_ARM_PARAM_1(2, text);
229 }
230
231 L4_INLINE void
232 outchar(char c) L4_NOTHROW
233 {
234   __KDEBUG_ARM_PARAM_1(1, c);
235 }
236
237 L4_INLINE void
238 outdec(int number) L4_NOTHROW
239 {
240   __KDEBUG_ARM_PARAM_1(4, number);
241 }
242
243 L4_INLINE void
244 outhex32(int number) L4_NOTHROW
245 {
246   __KDEBUG_ARM_PARAM_1(5, number);
247 }
248
249 L4_INLINE void
250 outhex20(int number) L4_NOTHROW
251 {
252   __KDEBUG_ARM_PARAM_1(6, number);
253 }
254
255 L4_INLINE void
256 outhex16(int number) L4_NOTHROW
257 {
258   __KDEBUG_ARM_PARAM_1(7, number);
259 }
260
261 L4_INLINE void
262 outhex12(int number) L4_NOTHROW
263 {
264   __KDEBUG_ARM_PARAM_1(8, number);
265 }
266
267 L4_INLINE void
268 outhex8(int number) L4_NOTHROW
269 {
270   __KDEBUG_ARM_PARAM_1(9, number);
271 }
272
273 L4_INLINE void
274 kd_display(char *text) L4_NOTHROW
275 {
276   outstring(text);
277 }
278
279 L4_INLINE int
280 l4kd_inchar(void) L4_NOTHROW
281 {
282   return __KDEBUG_ARM_PARAM_0(0xd);
283 }
284
285 L4_INLINE void
286 l4_sys_cli(void) L4_NOTHROW
287 {
288   __KDEBUG_ARM_PARAM_0(0x32);
289 }
290
291 L4_INLINE void
292 l4_sys_sti(void) L4_NOTHROW
293 {
294   __KDEBUG_ARM_PARAM_0(0x33);
295 }
296
297 #endif //__GNUC__