Support perf TP_*() macros, add missing interrupt.h include
[lttng-modules.git] / probes / lttng-types.c
CommitLineData
40652b65
MD
1/*
2 * probes/lttng-types.c
3 *
4 * Copyright 2010 (c) - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
5 *
6 * LTTng types.
7 */
8
9#include <linux/module.h>
10#include <linux/types.h>
11#include <linux/seq_file.h>
12#include <linux/jbd.h> /* tid_t */
13#include <linux/debugfs.h>
14#include "lttng-types.h"
15
16struct dentry *lttng_types_dentry;
17
1d12cebd
MD
18#undef ENTRY
19#define ENTRY(name) [atype_##name] = #name
40652b65
MD
20
21const char * const astract_types[NR_ABSTRACT_TYPES] = {
1d12cebd
MD
22 ENTRY(integer),
23 ENTRY(enum),
24 ENTRY(array),
25 ENTRY(sequence),
26 ENTRY(string),
27};
28
29#undef ENTRY
30#define ENTRY(name) [lttng_encode_##name] = #name
31
32const char * const string_encodings[NR_STRING_ENCODINGS] = {
33 ENTRY(UTF8),
34 ENTRY(ASCII),
40652b65
MD
35};
36
37#define STAGE_EXPORT_ENUMS
38#include "lttng-types.h"
39#include "lttng-type-list.h"
40#undef STAGE_EXPORT_ENUMS
41
42struct lttng_type lttng_types[] = {
43#define STAGE_EXPORT_TYPES
44#include "lttng-types.h"
45#include "lttng-type-list.h"
46#undef STAGE_EXPORT_TYPES
47};
48
d0dd2ecb
MD
49static void print_indent(struct seq_file *m, unsigned int indent)
50{
51 int i;
52
53 for (i = 0; i < indent; i++)
54 seq_printf(m, "\t");
55}
56
57static void print_enum(struct seq_file *m, unsigned int indent,
58 const struct lttng_enum *lttng_enum)
40652b65
MD
59{
60 int i;
61
62 for (i = 0; i < lttng_enum->len; i++) {
d0dd2ecb 63 print_indent(m, indent);
40652b65 64 if (lttng_enum->entries[i].start == lttng_enum->entries[i].end)
d0dd2ecb 65 seq_printf(m, "{ %llu, %s },\n",
40652b65
MD
66 lttng_enum->entries[i].start,
67 lttng_enum->entries[i].string);
68 else
d0dd2ecb 69 seq_printf(m, "{ { %llu, %llu }, %s },\n",
40652b65
MD
70 lttng_enum->entries[i].start,
71 lttng_enum->entries[i].end,
72 lttng_enum->entries[i].string);
73 }
74}
75
d0dd2ecb
MD
76void lttng_print_event_type(struct seq_file *m, unsigned int indent,
77 const struct lttng_type *type)
40652b65 78{
d0dd2ecb 79 print_indent(m, indent);
40652b65
MD
80 switch(type->atype) {
81 case atype_integer:
d0dd2ecb
MD
82 seq_printf(m, "type %s%s{ parent = %s; size = %u; signed = %u; align = %u;",
83 type->name ? : "", type->name ? " " : "",
40652b65
MD
84 astract_types[type->atype],
85 type->u.integer.size,
86 type->u.integer.signedness,
87 type->u.integer.alignment);
1d12cebd 88 if (type->u.integer.reverse_byte_order)
d0dd2ecb 89 seq_printf(m, " byte_order = %s;",
1d12cebd
MD
90 (__BYTE_ORDER == __LITTLE_ENDIAN) ?
91 "be" : "le");
d0dd2ecb 92 seq_printf(m, " }");
40652b65
MD
93 break;
94 case atype_enum:
d0dd2ecb
MD
95 seq_printf(m, "type %s%s{ parent = %s; parent.parent = %s; map = {\n",
96 type->name ? : "", type->name ? " " : "",
40652b65
MD
97 astract_types[type->atype],
98 type->u.enumeration.parent_type);
d0dd2ecb
MD
99 print_enum(m, indent + 2, &type->u.enumeration.def);
100 print_indent(m, indent + 1);
101 seq_printf(m, "};\n");
102 print_indent(m, indent);
103 seq_printf(m, "}");
40652b65
MD
104 break;
105 case atype_array:
d0dd2ecb
MD
106 seq_printf(m, "type %s%s{ parent = %s; elem_type = %s; length = %u; }",
107 type->name ? : "", type->name ? " " : "",
40652b65
MD
108 astract_types[type->atype],
109 type->u.array.elem_type,
110 type->u.array.length);
111 break;
1d12cebd 112 case atype_sequence:
d0dd2ecb
MD
113 seq_printf(m, "type %s%s{ parent = %s; elem_type = %s; length_type = %s; }",
114 type->name ? : "", type->name ? " " : "",
1d12cebd
MD
115 astract_types[type->atype],
116 type->u.sequence.elem_type,
117 type->u.sequence.length_type);
118 break;
119 case atype_string:
d0dd2ecb
MD
120 seq_printf(m, "type %s%s{ parent = %s; encoding = %s; }",
121 type->name ? : "", type->name ? " " : "",
1d12cebd
MD
122 astract_types[type->atype],
123 string_encodings[type->u.string.encoding]);
124 break;
40652b65 125 default:
d0dd2ecb 126 seq_printf(m, "<<< unknown abstract type %s for type %s%s>>>",
40652b65 127 astract_types[type->atype],
d0dd2ecb 128 type->name ? : "", type->name ? " " : "");
40652b65
MD
129 }
130}
d0dd2ecb 131EXPORT_SYMBOL_GPL(lttng_print_event_type);
40652b65
MD
132
133static void *lttng_seq_start(struct seq_file *m, loff_t *pos)
134{
135 struct lttng_type *type = &lttng_types[*pos];
136
137 if (type > &lttng_types[ARRAY_SIZE(lttng_types) - 1])
138 return NULL;
139 return type;
140}
141
142static void *lttng_seq_next(struct seq_file *m, void *v, loff_t *ppos)
143{
144 struct lttng_type *type = &lttng_types[++(*ppos)];
145
146 if (type > &lttng_types[ARRAY_SIZE(lttng_types) - 1])
147 return NULL;
148 return type;
149}
150
151static void lttng_seq_stop(struct seq_file *m, void *v)
152{
153}
154
155static int lttng_seq_show(struct seq_file *m, void *v)
156{
157 struct lttng_type *type = v;
158
d0dd2ecb
MD
159 lttng_print_event_type(m, 0, type);
160 seq_printf(m, ";\n");
40652b65
MD
161 return 0;
162}
163
164static const struct seq_operations lttng_types_seq_ops = {
165 .start = lttng_seq_start,
166 .next = lttng_seq_next,
167 .stop = lttng_seq_stop,
168 .show = lttng_seq_show,
169};
170
171static int
172lttng_types_open(struct inode *inode, struct file *file)
173{
174 return seq_open(file, &lttng_types_seq_ops);
175}
176
177static const struct file_operations lttng_types_fops = {
178 .open = lttng_types_open,
179 .read = seq_read,
180 .llseek = seq_lseek,
181 .release = seq_release_private,
182};
183
184static int lttng_types_init(void)
185{
186 int ret = 0;
187
188 lttng_types_dentry = debugfs_create_file("lttng-types", S_IWUSR,
189 NULL, NULL, &lttng_types_fops);
190 if (IS_ERR(lttng_types_dentry) || !lttng_types_dentry) {
191 printk(KERN_ERR "Error creating LTTng type export file\n");
192 ret = -ENOMEM;
193 goto error;
194 }
195error:
196 return ret;
197}
198
199module_init(lttng_types_init);
200
201static void lttng_types_exit(void)
202{
203 debugfs_remove(lttng_types_dentry);
204}
205
206module_exit(lttng_types_exit);
207
208MODULE_LICENSE("GPL and additional rights");
209MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
210MODULE_DESCRIPTION("LTTng types");
This page took 0.033499 seconds and 4 git commands to generate.