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