blob: 0108068255297285859854a15bc632579365de15 [file] [log] [blame]
Jon Medhurstaaf37a32013-06-11 12:10:56 +01001/**
Jon Medhurst15ce78d2014-04-10 09:02:02 +01002 * Copyright (C) ARM Limited 2012-2014. All rights reserved.
Jon Medhurstaaf37a32013-06-11 12:10:56 +01003 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 */
9
10#define ESCAPE_CODE 0x1c
11#define STRING_ANNOTATION 0x06
12#define NAME_CHANNEL_ANNOTATION 0x07
13#define NAME_GROUP_ANNOTATION 0x08
14#define VISUAL_ANNOTATION 0x04
15#define MARKER_ANNOTATION 0x05
16
17static void kannotate_write(const char *ptr, unsigned int size)
18{
19 int retval;
20 int pos = 0;
21 loff_t offset = 0;
22 while (pos < size) {
23 retval = annotate_write(NULL, &ptr[pos], size - pos, &offset);
24 if (retval < 0) {
25 printk(KERN_WARNING "gator: kannotate_write failed with return value %d\n", retval);
26 return;
27 }
28 pos += retval;
29 }
30}
31
Jon Medhurst15ce78d2014-04-10 09:02:02 +010032static void marshal_u16(char *buf, u16 val)
33{
Jon Medhurst34d97692013-12-19 09:23:06 +000034 buf[0] = val & 0xff;
35 buf[1] = (val >> 8) & 0xff;
36}
37
Jon Medhurst15ce78d2014-04-10 09:02:02 +010038static void marshal_u32(char *buf, u32 val)
39{
Jon Medhurst34d97692013-12-19 09:23:06 +000040 buf[0] = val & 0xff;
41 buf[1] = (val >> 8) & 0xff;
42 buf[2] = (val >> 16) & 0xff;
43 buf[3] = (val >> 24) & 0xff;
44}
45
Jon Medhurstaaf37a32013-06-11 12:10:56 +010046void gator_annotate_channel(int channel, const char *str)
47{
Jon Medhurst34d97692013-12-19 09:23:06 +000048 const u16 str_size = strlen(str) & 0xffff;
49 char header[8];
50 header[0] = ESCAPE_CODE;
51 header[1] = STRING_ANNOTATION;
52 marshal_u32(header + 2, channel);
53 marshal_u16(header + 6, str_size);
54 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +010055 kannotate_write(str, str_size);
56}
57
58EXPORT_SYMBOL(gator_annotate_channel);
59
60void gator_annotate(const char *str)
61{
62 gator_annotate_channel(0, str);
63}
64
65EXPORT_SYMBOL(gator_annotate);
66
67void gator_annotate_channel_color(int channel, int color, const char *str)
68{
Jon Medhurst34d97692013-12-19 09:23:06 +000069 const u16 str_size = (strlen(str) + 4) & 0xffff;
Jon Medhurstaaf37a32013-06-11 12:10:56 +010070 char header[12];
71 header[0] = ESCAPE_CODE;
72 header[1] = STRING_ANNOTATION;
Jon Medhurst34d97692013-12-19 09:23:06 +000073 marshal_u32(header + 2, channel);
74 marshal_u16(header + 6, str_size);
75 marshal_u32(header + 8, color);
76 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +010077 kannotate_write(str, str_size - 4);
78}
79
80EXPORT_SYMBOL(gator_annotate_channel_color);
81
82void gator_annotate_color(int color, const char *str)
83{
84 gator_annotate_channel_color(0, color, str);
85}
86
87EXPORT_SYMBOL(gator_annotate_color);
88
89void gator_annotate_channel_end(int channel)
90{
Jon Medhurst34d97692013-12-19 09:23:06 +000091 char header[8];
92 header[0] = ESCAPE_CODE;
93 header[1] = STRING_ANNOTATION;
94 marshal_u32(header + 2, channel);
95 marshal_u16(header + 6, 0);
96 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +010097}
98
99EXPORT_SYMBOL(gator_annotate_channel_end);
100
101void gator_annotate_end(void)
102{
103 gator_annotate_channel_end(0);
104}
105
106EXPORT_SYMBOL(gator_annotate_end);
107
108void gator_annotate_name_channel(int channel, int group, const char* str)
109{
Jon Medhurst34d97692013-12-19 09:23:06 +0000110 const u16 str_size = strlen(str) & 0xffff;
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100111 char header[12];
112 header[0] = ESCAPE_CODE;
113 header[1] = NAME_CHANNEL_ANNOTATION;
Jon Medhurst34d97692013-12-19 09:23:06 +0000114 marshal_u32(header + 2, channel);
115 marshal_u32(header + 6, group);
116 marshal_u16(header + 10, str_size);
117 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100118 kannotate_write(str, str_size);
119}
120
121EXPORT_SYMBOL(gator_annotate_name_channel);
122
123void gator_annotate_name_group(int group, const char* str)
124{
Jon Medhurst34d97692013-12-19 09:23:06 +0000125 const u16 str_size = strlen(str) & 0xffff;
126 char header[8];
127 header[0] = ESCAPE_CODE;
128 header[1] = NAME_GROUP_ANNOTATION;
129 marshal_u32(header + 2, group);
130 marshal_u16(header + 6, str_size);
131 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100132 kannotate_write(str, str_size);
133}
134
135EXPORT_SYMBOL(gator_annotate_name_group);
136
137void gator_annotate_visual(const char *data, unsigned int length, const char *str)
138{
Jon Medhurst34d97692013-12-19 09:23:06 +0000139 const u16 str_size = strlen(str) & 0xffff;
140 char header[4];
141 char header_length[4];
142 header[0] = ESCAPE_CODE;
143 header[1] = VISUAL_ANNOTATION;
144 marshal_u16(header + 2, str_size);
145 marshal_u32(header_length, length);
146 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100147 kannotate_write(str, str_size);
Jon Medhurst34d97692013-12-19 09:23:06 +0000148 kannotate_write(header_length, sizeof(header_length));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100149 kannotate_write(data, length);
150}
151
152EXPORT_SYMBOL(gator_annotate_visual);
153
154void gator_annotate_marker(void)
155{
Jon Medhurst34d97692013-12-19 09:23:06 +0000156 char header[4];
157 header[0] = ESCAPE_CODE;
158 header[1] = MARKER_ANNOTATION;
159 marshal_u16(header + 2, 0);
160 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100161}
162
163EXPORT_SYMBOL(gator_annotate_marker);
164
165void gator_annotate_marker_str(const char *str)
166{
Jon Medhurst34d97692013-12-19 09:23:06 +0000167 const u16 str_size = strlen(str) & 0xffff;
168 char header[4];
169 header[0] = ESCAPE_CODE;
170 header[1] = MARKER_ANNOTATION;
171 marshal_u16(header + 2, str_size);
172 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100173 kannotate_write(str, str_size);
174}
175
176EXPORT_SYMBOL(gator_annotate_marker_str);
177
178void gator_annotate_marker_color(int color)
179{
Jon Medhurst34d97692013-12-19 09:23:06 +0000180 char header[8];
181 header[0] = ESCAPE_CODE;
182 header[1] = MARKER_ANNOTATION;
183 marshal_u16(header + 2, 4);
184 marshal_u32(header + 4, color);
185 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100186}
187
188EXPORT_SYMBOL(gator_annotate_marker_color);
189
190void gator_annotate_marker_color_str(int color, const char *str)
191{
Jon Medhurst34d97692013-12-19 09:23:06 +0000192 const u16 str_size = (strlen(str) + 4) & 0xffff;
193 char header[8];
194 header[0] = ESCAPE_CODE;
195 header[1] = MARKER_ANNOTATION;
196 marshal_u16(header + 2, str_size);
197 marshal_u32(header + 4, color);
198 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100199 kannotate_write(str, str_size - 4);
200}
201
202EXPORT_SYMBOL(gator_annotate_marker_color_str);