4 * Copyright 2010 (c) - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
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 "../wrapper/symbols.h" /* for wrapper_vmalloc_sync_all() */
15 #include "lttng-types.h"
17 struct dentry
*lttng_types_dentry
;
20 #define ENTRY(name) [atype_##name] = #name
22 const char * const astract_types
[NR_ABSTRACT_TYPES
] = {
31 #define ENTRY(name) [lttng_encode_##name] = #name
33 const char * const string_encodings
[NR_STRING_ENCODINGS
] = {
38 #define STAGE_EXPORT_ENUMS
39 #include "lttng-types.h"
40 #include "lttng-type-list.h"
41 #undef STAGE_EXPORT_ENUMS
43 struct lttng_type lttng_types
[] = {
44 #define STAGE_EXPORT_TYPES
45 #include "lttng-types.h"
46 #include "lttng-type-list.h"
47 #undef STAGE_EXPORT_TYPES
50 static void print_indent(struct seq_file
*m
, unsigned int indent
)
54 for (i
= 0; i
< indent
; i
++)
58 static void print_enum(struct seq_file
*m
, unsigned int indent
,
59 const struct lttng_enum
*lttng_enum
)
63 for (i
= 0; i
< lttng_enum
->len
; i
++) {
64 print_indent(m
, indent
);
65 if (lttng_enum
->entries
[i
].start
== lttng_enum
->entries
[i
].end
)
66 seq_printf(m
, "{ %llu, %s },\n",
67 lttng_enum
->entries
[i
].start
,
68 lttng_enum
->entries
[i
].string
);
70 seq_printf(m
, "{ { %llu, %llu }, %s },\n",
71 lttng_enum
->entries
[i
].start
,
72 lttng_enum
->entries
[i
].end
,
73 lttng_enum
->entries
[i
].string
);
77 void lttng_print_event_type(struct seq_file
*m
, unsigned int indent
,
78 const struct lttng_type
*type
)
80 print_indent(m
, indent
);
83 seq_printf(m
, "type %s%s{ parent = %s; size = %u; signed = %u; align = %u;",
84 type
->name
? : "", type
->name
? " " : "",
85 astract_types
[type
->atype
],
87 type
->u
.integer
.signedness
,
88 type
->u
.integer
.alignment
);
89 if (type
->u
.integer
.reverse_byte_order
)
90 seq_printf(m
, " byte_order = %s;",
91 (__BYTE_ORDER
== __LITTLE_ENDIAN
) ?
96 seq_printf(m
, "type %s%s{ parent = %s; parent.parent = %s; map = {\n",
97 type
->name
? : "", type
->name
? " " : "",
98 astract_types
[type
->atype
],
99 type
->u
.enumeration
.parent_type
);
100 print_enum(m
, indent
+ 2, &type
->u
.enumeration
.def
);
101 print_indent(m
, indent
+ 1);
102 seq_printf(m
, "};\n");
103 print_indent(m
, indent
);
107 seq_printf(m
, "type %s%s{ parent = %s; elem_type = %s; length = %u; }",
108 type
->name
? : "", type
->name
? " " : "",
109 astract_types
[type
->atype
],
110 type
->u
.array
.elem_type
,
111 type
->u
.array
.length
);
114 seq_printf(m
, "type %s%s{ parent = %s; elem_type = %s; length_type = %s; }",
115 type
->name
? : "", type
->name
? " " : "",
116 astract_types
[type
->atype
],
117 type
->u
.sequence
.elem_type
,
118 type
->u
.sequence
.length_type
);
121 seq_printf(m
, "type %s%s{ parent = %s; encoding = %s; }",
122 type
->name
? : "", type
->name
? " " : "",
123 astract_types
[type
->atype
],
124 string_encodings
[type
->u
.string
.encoding
]);
127 seq_printf(m
, "<<< unknown abstract type %s for type %s%s>>>",
128 astract_types
[type
->atype
],
129 type
->name
? : "", type
->name
? " " : "");
132 EXPORT_SYMBOL_GPL(lttng_print_event_type
);
134 static void *lttng_seq_start(struct seq_file
*m
, loff_t
*pos
)
136 struct lttng_type
*type
= <tng_types
[*pos
];
138 if (type
> <tng_types
[ARRAY_SIZE(lttng_types
) - 1])
143 static void *lttng_seq_next(struct seq_file
*m
, void *v
, loff_t
*ppos
)
145 struct lttng_type
*type
= <tng_types
[++(*ppos
)];
147 if (type
> <tng_types
[ARRAY_SIZE(lttng_types
) - 1])
152 static void lttng_seq_stop(struct seq_file
*m
, void *v
)
156 static int lttng_seq_show(struct seq_file
*m
, void *v
)
158 struct lttng_type
*type
= v
;
160 lttng_print_event_type(m
, 0, type
);
161 seq_printf(m
, ";\n");
165 static const struct seq_operations lttng_types_seq_ops
= {
166 .start
= lttng_seq_start
,
167 .next
= lttng_seq_next
,
168 .stop
= lttng_seq_stop
,
169 .show
= lttng_seq_show
,
173 lttng_types_open(struct inode
*inode
, struct file
*file
)
175 return seq_open(file
, <tng_types_seq_ops
);
178 static const struct file_operations lttng_types_fops
= {
179 .open
= lttng_types_open
,
182 .release
= seq_release_private
,
185 static int lttng_types_init(void)
189 wrapper_vmalloc_sync_all();
190 lttng_types_dentry
= debugfs_create_file("lttng-types", S_IWUSR
,
191 NULL
, NULL
, <tng_types_fops
);
192 if (IS_ERR(lttng_types_dentry
) || !lttng_types_dentry
) {
193 printk(KERN_ERR
"Error creating LTTng type export file\n");
201 module_init(lttng_types_init
);
203 static void lttng_types_exit(void)
205 debugfs_remove(lttng_types_dentry
);
208 module_exit(lttng_types_exit
);
210 MODULE_LICENSE("GPL and additional rights");
211 MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
212 MODULE_DESCRIPTION("LTTng types");