blob: 54e8e86e34cf32626e668aa479b2308187afe68c [file] [log] [blame]
Jon Medhurstaaf37a32013-06-11 12:10:56 +01001/**
Jon Medhurstb1d07442015-05-08 12:04:18 +01002 * Copyright (C) ARM Limited 2012-2015. 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;
Jon Medhurst96b56152014-10-30 18:01:15 +000022
Jon Medhurstaaf37a32013-06-11 12:10:56 +010023 while (pos < size) {
24 retval = annotate_write(NULL, &ptr[pos], size - pos, &offset);
25 if (retval < 0) {
Jon Medhurst96b56152014-10-30 18:01:15 +000026 pr_warning("gator: kannotate_write failed with return value %d\n", retval);
Jon Medhurstaaf37a32013-06-11 12:10:56 +010027 return;
28 }
29 pos += retval;
30 }
31}
32
Jon Medhurst15ce78d2014-04-10 09:02:02 +010033static void marshal_u16(char *buf, u16 val)
34{
Jon Medhurst34d97692013-12-19 09:23:06 +000035 buf[0] = val & 0xff;
36 buf[1] = (val >> 8) & 0xff;
37}
38
Jon Medhurst15ce78d2014-04-10 09:02:02 +010039static void marshal_u32(char *buf, u32 val)
40{
Jon Medhurst34d97692013-12-19 09:23:06 +000041 buf[0] = val & 0xff;
42 buf[1] = (val >> 8) & 0xff;
43 buf[2] = (val >> 16) & 0xff;
44 buf[3] = (val >> 24) & 0xff;
45}
46
Jon Medhurstaaf37a32013-06-11 12:10:56 +010047void gator_annotate_channel(int channel, const char *str)
48{
Jon Medhurst34d97692013-12-19 09:23:06 +000049 const u16 str_size = strlen(str) & 0xffff;
50 char header[8];
Jon Medhurst96b56152014-10-30 18:01:15 +000051
Jon Medhurst34d97692013-12-19 09:23:06 +000052 header[0] = ESCAPE_CODE;
53 header[1] = STRING_ANNOTATION;
54 marshal_u32(header + 2, channel);
55 marshal_u16(header + 6, str_size);
56 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +010057 kannotate_write(str, str_size);
58}
Jon Medhurstaaf37a32013-06-11 12:10:56 +010059EXPORT_SYMBOL(gator_annotate_channel);
60
61void gator_annotate(const char *str)
62{
63 gator_annotate_channel(0, str);
64}
Jon Medhurstaaf37a32013-06-11 12:10:56 +010065EXPORT_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];
Jon Medhurst96b56152014-10-30 18:01:15 +000071
Jon Medhurstaaf37a32013-06-11 12:10:56 +010072 header[0] = ESCAPE_CODE;
73 header[1] = STRING_ANNOTATION;
Jon Medhurst34d97692013-12-19 09:23:06 +000074 marshal_u32(header + 2, channel);
75 marshal_u16(header + 6, str_size);
76 marshal_u32(header + 8, color);
77 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +010078 kannotate_write(str, str_size - 4);
79}
Jon Medhurstaaf37a32013-06-11 12:10:56 +010080EXPORT_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}
Jon Medhurstaaf37a32013-06-11 12:10:56 +010086EXPORT_SYMBOL(gator_annotate_color);
87
88void gator_annotate_channel_end(int channel)
89{
Jon Medhurst34d97692013-12-19 09:23:06 +000090 char header[8];
Jon Medhurst96b56152014-10-30 18:01:15 +000091
Jon Medhurst34d97692013-12-19 09:23:06 +000092 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}
Jon Medhurstaaf37a32013-06-11 12:10:56 +010098EXPORT_SYMBOL(gator_annotate_channel_end);
99
100void gator_annotate_end(void)
101{
102 gator_annotate_channel_end(0);
103}
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100104EXPORT_SYMBOL(gator_annotate_end);
105
Jon Medhurst96b56152014-10-30 18:01:15 +0000106void gator_annotate_name_channel(int channel, int group, const char *str)
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100107{
Jon Medhurst34d97692013-12-19 09:23:06 +0000108 const u16 str_size = strlen(str) & 0xffff;
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100109 char header[12];
Jon Medhurst96b56152014-10-30 18:01:15 +0000110
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100111 header[0] = ESCAPE_CODE;
112 header[1] = NAME_CHANNEL_ANNOTATION;
Jon Medhurst34d97692013-12-19 09:23:06 +0000113 marshal_u32(header + 2, channel);
114 marshal_u32(header + 6, group);
115 marshal_u16(header + 10, str_size);
116 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100117 kannotate_write(str, str_size);
118}
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100119EXPORT_SYMBOL(gator_annotate_name_channel);
120
Jon Medhurst96b56152014-10-30 18:01:15 +0000121void gator_annotate_name_group(int group, const char *str)
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100122{
Jon Medhurst34d97692013-12-19 09:23:06 +0000123 const u16 str_size = strlen(str) & 0xffff;
124 char header[8];
Jon Medhurst96b56152014-10-30 18:01:15 +0000125
Jon Medhurst34d97692013-12-19 09:23:06 +0000126 header[0] = ESCAPE_CODE;
127 header[1] = NAME_GROUP_ANNOTATION;
128 marshal_u32(header + 2, group);
129 marshal_u16(header + 6, str_size);
130 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100131 kannotate_write(str, str_size);
132}
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100133EXPORT_SYMBOL(gator_annotate_name_group);
134
135void gator_annotate_visual(const char *data, unsigned int length, const char *str)
136{
Jon Medhurst34d97692013-12-19 09:23:06 +0000137 const u16 str_size = strlen(str) & 0xffff;
138 char header[4];
139 char header_length[4];
Jon Medhurst96b56152014-10-30 18:01:15 +0000140
Jon Medhurst34d97692013-12-19 09:23:06 +0000141 header[0] = ESCAPE_CODE;
142 header[1] = VISUAL_ANNOTATION;
143 marshal_u16(header + 2, str_size);
144 marshal_u32(header_length, length);
145 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100146 kannotate_write(str, str_size);
Jon Medhurst34d97692013-12-19 09:23:06 +0000147 kannotate_write(header_length, sizeof(header_length));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100148 kannotate_write(data, length);
149}
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100150EXPORT_SYMBOL(gator_annotate_visual);
151
152void gator_annotate_marker(void)
153{
Jon Medhurst34d97692013-12-19 09:23:06 +0000154 char header[4];
Jon Medhurst96b56152014-10-30 18:01:15 +0000155
Jon Medhurst34d97692013-12-19 09:23:06 +0000156 header[0] = ESCAPE_CODE;
157 header[1] = MARKER_ANNOTATION;
158 marshal_u16(header + 2, 0);
159 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100160}
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100161EXPORT_SYMBOL(gator_annotate_marker);
162
163void gator_annotate_marker_str(const char *str)
164{
Jon Medhurst34d97692013-12-19 09:23:06 +0000165 const u16 str_size = strlen(str) & 0xffff;
166 char header[4];
Jon Medhurst96b56152014-10-30 18:01:15 +0000167
Jon Medhurst34d97692013-12-19 09:23:06 +0000168 header[0] = ESCAPE_CODE;
169 header[1] = MARKER_ANNOTATION;
170 marshal_u16(header + 2, str_size);
171 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100172 kannotate_write(str, str_size);
173}
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100174EXPORT_SYMBOL(gator_annotate_marker_str);
175
176void gator_annotate_marker_color(int color)
177{
Jon Medhurst34d97692013-12-19 09:23:06 +0000178 char header[8];
Jon Medhurst96b56152014-10-30 18:01:15 +0000179
Jon Medhurst34d97692013-12-19 09:23:06 +0000180 header[0] = ESCAPE_CODE;
181 header[1] = MARKER_ANNOTATION;
182 marshal_u16(header + 2, 4);
183 marshal_u32(header + 4, color);
184 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100185}
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100186EXPORT_SYMBOL(gator_annotate_marker_color);
187
188void gator_annotate_marker_color_str(int color, const char *str)
189{
Jon Medhurst34d97692013-12-19 09:23:06 +0000190 const u16 str_size = (strlen(str) + 4) & 0xffff;
191 char header[8];
Jon Medhurst96b56152014-10-30 18:01:15 +0000192
Jon Medhurst34d97692013-12-19 09:23:06 +0000193 header[0] = ESCAPE_CODE;
194 header[1] = MARKER_ANNOTATION;
195 marshal_u16(header + 2, str_size);
196 marshal_u32(header + 4, color);
197 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100198 kannotate_write(str, str_size - 4);
199}
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100200EXPORT_SYMBOL(gator_annotate_marker_color_str);