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 "lttng-types.h"
16 struct dentry
*lttng_types_dentry
;
19 #define ENTRY(name) [atype_##name] = #name
21 const char * const astract_types
[NR_ABSTRACT_TYPES
] = {
30 #define ENTRY(name) [lttng_encode_##name] = #name
32 const char * const string_encodings
[NR_STRING_ENCODINGS
] = {
37 #define STAGE_EXPORT_ENUMS
38 #include "lttng-types.h"
39 #include "lttng-type-list.h"
40 #undef STAGE_EXPORT_ENUMS
42 struct 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
49 static void print_indent(struct seq_file
*m
, unsigned int indent
)
53 for (i
= 0; i
< indent
; i
++)
57 static void print_enum(struct seq_file
*m
, unsigned int indent
,
58 const struct lttng_enum
*lttng_enum
)
62 for (i
= 0; i
< lttng_enum
->len
; i
++) {
63 print_indent(m
, indent
);
64 if (lttng_enum
->entries
[i
].start
== lttng_enum
->entries
[i
].end
)
65 seq_printf(m
, "{ %llu, %s },\n",
66 lttng_enum
->entries
[i
].start
,
67 lttng_enum
->entries
[i
].string
);
69 seq_printf(m
, "{ { %llu, %llu }, %s },\n",
70 lttng_enum
->entries
[i
].start
,
71 lttng_enum
->entries
[i
].end
,
72 lttng_enum
->entries
[i
].string
);
76 void lttng_print_event_type(struct seq_file
*m
, unsigned int indent
,
77 const struct lttng_type
*type
)
79 print_indent(m
, indent
);
82 seq_printf(m
, "type %s%s{ parent = %s; size = %u; signed = %u; align = %u;",
83 type
->name
? : "", type
->name
? " " : "",
84 astract_types
[type
->atype
],
86 type
->u
.integer
.signedness
,
87 type
->u
.integer
.alignment
);
88 if (type
->u
.integer
.reverse_byte_order
)
89 seq_printf(m
, " byte_order = %s;",
90 (__BYTE_ORDER
== __LITTLE_ENDIAN
) ?
95 seq_printf(m
, "type %s%s{ parent = %s; parent.parent = %s; map = {\n",
96 type
->name
? : "", type
->name
? " " : "",
97 astract_types
[type
->atype
],
98 type
->u
.enumeration
.parent_type
);
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
);
106 seq_printf(m
, "type %s%s{ parent = %s; elem_type = %s; length = %u; }",
107 type
->name
? : "", type
->name
? " " : "",
108 astract_types
[type
->atype
],
109 type
->u
.array
.elem_type
,
110 type
->u
.array
.length
);
113 seq_printf(m
, "type %s%s{ parent = %s; elem_type = %s; length_type = %s; }",
114 type
->name
? : "", type
->name
? " " : "",
115 astract_types
[type
->atype
],
116 type
->u
.sequence
.elem_type
,
117 type
->u
.sequence
.length_type
);
120 seq_printf(m
, "type %s%s{ parent = %s; encoding = %s; }",
121 type
->name
? : "", type
->name
? " " : "",
122 astract_types
[type
->atype
],
123 string_encodings
[type
->u
.string
.encoding
]);
126 seq_printf(m
, "<<< unknown abstract type %s for type %s%s>>>",
127 astract_types
[type
->atype
],
128 type
->name
? : "", type
->name
? " " : "");
131 EXPORT_SYMBOL_GPL(lttng_print_event_type
);
133 static void *lttng_seq_start(struct seq_file
*m
, loff_t
*pos
)
135 struct lttng_type
*type
= <tng_types
[*pos
];
137 if (type
> <tng_types
[ARRAY_SIZE(lttng_types
) - 1])
142 static void *lttng_seq_next(struct seq_file
*m
, void *v
, loff_t
*ppos
)
144 struct lttng_type
*type
= <tng_types
[++(*ppos
)];
146 if (type
> <tng_types
[ARRAY_SIZE(lttng_types
) - 1])
151 static void lttng_seq_stop(struct seq_file
*m
, void *v
)
155 static int lttng_seq_show(struct seq_file
*m
, void *v
)
157 struct lttng_type
*type
= v
;
159 lttng_print_event_type(m
, 0, type
);
160 seq_printf(m
, ";\n");
164 static 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
,
172 lttng_types_open(struct inode
*inode
, struct file
*file
)
174 return seq_open(file
, <tng_types_seq_ops
);
177 static const struct file_operations lttng_types_fops
= {
178 .open
= lttng_types_open
,
181 .release
= seq_release_private
,
184 static int lttng_types_init(void)
188 lttng_types_dentry
= debugfs_create_file("lttng-types", S_IWUSR
,
189 NULL
, NULL
, <tng_types_fops
);
190 if (IS_ERR(lttng_types_dentry
) || !lttng_types_dentry
) {
191 printk(KERN_ERR
"Error creating LTTng type export file\n");
199 module_init(lttng_types_init
);
201 static void lttng_types_exit(void)
203 debugfs_remove(lttng_types_dentry
);
206 module_exit(lttng_types_exit
);
208 MODULE_LICENSE("GPL and additional rights");
209 MODULE_AUTHOR("Mathieu Desnoyers <mathieu.desnoyers@efficios.com>");
210 MODULE_DESCRIPTION("LTTng types");