blob: 4715f64a186511f8502ce00af069d68a0c2ca195 [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
32void gator_annotate_channel(int channel, const char *str)
33{
34 int str_size = strlen(str) & 0xffff;
35 long long header = ESCAPE_CODE | (STRING_ANNOTATION << 8) | (channel << 16) | ((long long)str_size << 48);
36 kannotate_write((char *)&header, sizeof(header));
37 kannotate_write(str, str_size);
38}
39
40EXPORT_SYMBOL(gator_annotate_channel);
41
42void gator_annotate(const char *str)
43{
44 gator_annotate_channel(0, str);
45}
46
47EXPORT_SYMBOL(gator_annotate);
48
49void gator_annotate_channel_color(int channel, int color, const char *str)
50{
51 int str_size = (strlen(str) + 4) & 0xffff;
52 char header[12];
53 header[0] = ESCAPE_CODE;
54 header[1] = STRING_ANNOTATION;
55 *(u32 *)(&header[2]) = channel;
56 *(u16 *)(&header[6]) = str_size;
57 *(u32 *)(&header[8]) = color;
58 kannotate_write((char *)&header, sizeof(header));
59 kannotate_write(str, str_size - 4);
60}
61
62EXPORT_SYMBOL(gator_annotate_channel_color);
63
64void gator_annotate_color(int color, const char *str)
65{
66 gator_annotate_channel_color(0, color, str);
67}
68
69EXPORT_SYMBOL(gator_annotate_color);
70
71void gator_annotate_channel_end(int channel)
72{
73 long long header = ESCAPE_CODE | (STRING_ANNOTATION << 8) | (channel << 16);
74 kannotate_write((char *)&header, sizeof(header));
75}
76
77EXPORT_SYMBOL(gator_annotate_channel_end);
78
79void gator_annotate_end(void)
80{
81 gator_annotate_channel_end(0);
82}
83
84EXPORT_SYMBOL(gator_annotate_end);
85
86void gator_annotate_name_channel(int channel, int group, const char* str)
87{
88 int str_size = strlen(str) & 0xffff;
89 char header[12];
90 header[0] = ESCAPE_CODE;
91 header[1] = NAME_CHANNEL_ANNOTATION;
92 *(u32 *)(&header[2]) = channel;
93 *(u32 *)(&header[6]) = group;
94 *(u16 *)(&header[10]) = str_size;
95 kannotate_write((char *)&header, sizeof(header));
96 kannotate_write(str, str_size);
97}
98
99EXPORT_SYMBOL(gator_annotate_name_channel);
100
101void gator_annotate_name_group(int group, const char* str)
102{
103 int str_size = strlen(str) & 0xffff;
104 long long header = ESCAPE_CODE | (NAME_GROUP_ANNOTATION << 8) | (group << 16) | ((long long)str_size << 48);
105 kannotate_write((char *)&header, sizeof(header));
106 kannotate_write(str, str_size);
107}
108
109EXPORT_SYMBOL(gator_annotate_name_group);
110
111void gator_annotate_visual(const char *data, unsigned int length, const char *str)
112{
113 int str_size = strlen(str) & 0xffff;
114 int visual_annotation = ESCAPE_CODE | (VISUAL_ANNOTATION << 8) | (str_size << 16);
115 kannotate_write((char *)&visual_annotation, sizeof(visual_annotation));
116 kannotate_write(str, str_size);
117 kannotate_write((char *)&length, sizeof(length));
118 kannotate_write(data, length);
119}
120
121EXPORT_SYMBOL(gator_annotate_visual);
122
123void gator_annotate_marker(void)
124{
125 int header = ESCAPE_CODE | (MARKER_ANNOTATION << 8);
126 kannotate_write((char *)&header, sizeof(header));
127}
128
129EXPORT_SYMBOL(gator_annotate_marker);
130
131void gator_annotate_marker_str(const char *str)
132{
133 int str_size = strlen(str) & 0xffff;
134 int header = ESCAPE_CODE | (MARKER_ANNOTATION << 8) | (str_size << 16);
135 kannotate_write((char *)&header, sizeof(header));
136 kannotate_write(str, str_size);
137}
138
139EXPORT_SYMBOL(gator_annotate_marker_str);
140
141void gator_annotate_marker_color(int color)
142{
143 long long header = (ESCAPE_CODE | (MARKER_ANNOTATION << 8) | 0x00040000 | ((long long)color << 32));
144 kannotate_write((char *)&header, sizeof(header));
145}
146
147EXPORT_SYMBOL(gator_annotate_marker_color);
148
149void gator_annotate_marker_color_str(int color, const char *str)
150{
151 int str_size = (strlen(str) + 4) & 0xffff;
152 long long header = ESCAPE_CODE | (MARKER_ANNOTATION << 8) | (str_size << 16) | ((long long)color << 32);
153 kannotate_write((char *)&header, sizeof(header));
154 kannotate_write(str, str_size - 4);
155}
156
157EXPORT_SYMBOL(gator_annotate_marker_color_str);