blob: a406e4882974ba27571d7dadb12feaf1050103e8 [file] [log] [blame]
Jon Medhurstaaf37a32013-06-11 12:10:56 +01001/**
2 * Copyright (C) ARM Limited 2012-2013. All rights reserved.
3 *
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 Medhurst34d97692013-12-19 09:23:06 +000032static void marshal_u16(char *buf, u16 val) {
33 buf[0] = val & 0xff;
34 buf[1] = (val >> 8) & 0xff;
35}
36
37static void marshal_u32(char *buf, u32 val) {
38 buf[0] = val & 0xff;
39 buf[1] = (val >> 8) & 0xff;
40 buf[2] = (val >> 16) & 0xff;
41 buf[3] = (val >> 24) & 0xff;
42}
43
Jon Medhurstaaf37a32013-06-11 12:10:56 +010044void gator_annotate_channel(int channel, const char *str)
45{
Jon Medhurst34d97692013-12-19 09:23:06 +000046 const u16 str_size = strlen(str) & 0xffff;
47 char header[8];
48 header[0] = ESCAPE_CODE;
49 header[1] = STRING_ANNOTATION;
50 marshal_u32(header + 2, channel);
51 marshal_u16(header + 6, str_size);
52 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +010053 kannotate_write(str, str_size);
54}
55
56EXPORT_SYMBOL(gator_annotate_channel);
57
58void gator_annotate(const char *str)
59{
60 gator_annotate_channel(0, str);
61}
62
63EXPORT_SYMBOL(gator_annotate);
64
65void gator_annotate_channel_color(int channel, int color, const char *str)
66{
Jon Medhurst34d97692013-12-19 09:23:06 +000067 const u16 str_size = (strlen(str) + 4) & 0xffff;
Jon Medhurstaaf37a32013-06-11 12:10:56 +010068 char header[12];
69 header[0] = ESCAPE_CODE;
70 header[1] = STRING_ANNOTATION;
Jon Medhurst34d97692013-12-19 09:23:06 +000071 marshal_u32(header + 2, channel);
72 marshal_u16(header + 6, str_size);
73 marshal_u32(header + 8, color);
74 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +010075 kannotate_write(str, str_size - 4);
76}
77
78EXPORT_SYMBOL(gator_annotate_channel_color);
79
80void gator_annotate_color(int color, const char *str)
81{
82 gator_annotate_channel_color(0, color, str);
83}
84
85EXPORT_SYMBOL(gator_annotate_color);
86
87void gator_annotate_channel_end(int channel)
88{
Jon Medhurst34d97692013-12-19 09:23:06 +000089 char header[8];
90 header[0] = ESCAPE_CODE;
91 header[1] = STRING_ANNOTATION;
92 marshal_u32(header + 2, channel);
93 marshal_u16(header + 6, 0);
94 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +010095}
96
97EXPORT_SYMBOL(gator_annotate_channel_end);
98
99void gator_annotate_end(void)
100{
101 gator_annotate_channel_end(0);
102}
103
104EXPORT_SYMBOL(gator_annotate_end);
105
106void gator_annotate_name_channel(int channel, int group, const char* str)
107{
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];
110 header[0] = ESCAPE_CODE;
111 header[1] = NAME_CHANNEL_ANNOTATION;
Jon Medhurst34d97692013-12-19 09:23:06 +0000112 marshal_u32(header + 2, channel);
113 marshal_u32(header + 6, group);
114 marshal_u16(header + 10, str_size);
115 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100116 kannotate_write(str, str_size);
117}
118
119EXPORT_SYMBOL(gator_annotate_name_channel);
120
121void gator_annotate_name_group(int group, const char* str)
122{
Jon Medhurst34d97692013-12-19 09:23:06 +0000123 const u16 str_size = strlen(str) & 0xffff;
124 char header[8];
125 header[0] = ESCAPE_CODE;
126 header[1] = NAME_GROUP_ANNOTATION;
127 marshal_u32(header + 2, group);
128 marshal_u16(header + 6, str_size);
129 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100130 kannotate_write(str, str_size);
131}
132
133EXPORT_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];
140 header[0] = ESCAPE_CODE;
141 header[1] = VISUAL_ANNOTATION;
142 marshal_u16(header + 2, str_size);
143 marshal_u32(header_length, length);
144 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100145 kannotate_write(str, str_size);
Jon Medhurst34d97692013-12-19 09:23:06 +0000146 kannotate_write(header_length, sizeof(header_length));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100147 kannotate_write(data, length);
148}
149
150EXPORT_SYMBOL(gator_annotate_visual);
151
152void gator_annotate_marker(void)
153{
Jon Medhurst34d97692013-12-19 09:23:06 +0000154 char header[4];
155 header[0] = ESCAPE_CODE;
156 header[1] = MARKER_ANNOTATION;
157 marshal_u16(header + 2, 0);
158 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100159}
160
161EXPORT_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];
167 header[0] = ESCAPE_CODE;
168 header[1] = MARKER_ANNOTATION;
169 marshal_u16(header + 2, str_size);
170 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100171 kannotate_write(str, str_size);
172}
173
174EXPORT_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];
179 header[0] = ESCAPE_CODE;
180 header[1] = MARKER_ANNOTATION;
181 marshal_u16(header + 2, 4);
182 marshal_u32(header + 4, color);
183 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100184}
185
186EXPORT_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];
192 header[0] = ESCAPE_CODE;
193 header[1] = MARKER_ANNOTATION;
194 marshal_u16(header + 2, str_size);
195 marshal_u32(header + 4, color);
196 kannotate_write(header, sizeof(header));
Jon Medhurstaaf37a32013-06-11 12:10:56 +0100197 kannotate_write(str, str_size - 4);
198}
199
200EXPORT_SYMBOL(gator_annotate_marker_color_str);