+int print_loader_header_user(facility_t *fac)
+{
+ char filename[PATH_MAX];
+ unsigned int filename_size = 0;
+ FILE *fd;
+ dprintf("%s\n", fac->name);
+
+ strcpy(filename, "ltt-facility-loader-");
+ filename_size = strlen(filename);
+
+ strncat(filename, fac->name, PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+
+ if(fac->arch) {
+ strncat(filename, "_", PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+
+ strncat(filename, fac->arch, PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+ }
+
+ strncat(filename, ".h", PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+
+
+ fd = fopen(filename, "w");
+ if(fd == NULL) {
+ printf("Error opening file %s for writing : %s\n",
+ filename, strerror(errno));
+ return errno;
+ }
+
+ fprintf(fd, "#ifndef _LTT_FACILITY_LOADER_%s_H_\n", fac->capname);
+ fprintf(fd, "#define _LTT_FACILITY_LOADER_%s_H_\n\n", fac->capname);
+ fprintf(fd,"#include <ltt/ltt-usertrace.h>\n");
+ if(!fac->arch)
+ fprintf(fd,"#include <ltt/ltt-facility-id-%s.h>\n\n",
+ fac->name);
+ else
+ fprintf(fd,"#include <ltt/ltt-facility-id-%s_%s.h>\n\n",
+ fac->name,
+ fac->arch);
+ fprintf(fd,"ltt_facility_t\tltt_facility_%s;\n", fac->name);
+ fprintf(fd,"ltt_facility_t\tltt_facility_%s_%X;\n\n",
+ fac->name, fac->checksum);
+
+ fprintf(fd,"#define LTT_FACILITY_SYMBOL\t\t\t\t\t\t\tltt_facility_%s\n",
+ fac->name);
+ fprintf(fd,"#define LTT_FACILITY_CHECKSUM_SYMBOL\t\tltt_facility_%s_%X\n",
+ fac->name, fac->checksum);
+ fprintf(fd,"#define LTT_FACILITY_CHECKSUM\t\t\t\t\t\t0x%X\n", fac->checksum);
+ fprintf(fd,"#define LTT_FACILITY_NAME\t\t\t\t\t\t\t\t\"%s\"\n", fac->name);
+ fprintf(fd,"#define LTT_FACILITY_NUM_EVENTS\t\t\t\t\tfacility_%s_num_events\n\n",
+ fac->name);
+ fprintf(fd, "#endif //_LTT_FACILITY_LOADER_%s_H_\n", fac->capname);
+
+ fclose(fd);
+
+ return 0;
+}
+
+
+
+/* ltt-facility-loader-name.c : generic facility loader
+ * loader_c */
+int print_loader_c(facility_t *fac)
+{
+ char filename[PATH_MAX];
+ unsigned int filename_size = 0;
+ FILE *fd;
+ dprintf("%s\n", fac->name);
+
+ strcpy(filename, "ltt-facility-loader-");
+ filename_size = strlen(filename);
+
+ strncat(filename, fac->name, PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+
+ if(fac->arch) {
+ strncat(filename, "_", PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+
+ strncat(filename, fac->arch, PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+ }
+
+ strncat(filename, ".c", PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+
+
+ fd = fopen(filename, "w");
+ if(fd == NULL) {
+ printf("Error opening file %s for writing : %s\n",
+ filename, strerror(errno));
+ return errno;
+ }
+
+ fprintf(fd, "/*\n");
+ if(!fac->arch)
+ fprintf(fd, " * ltt-facility-loader-%s.c\n", fac->name);
+ else
+ fprintf(fd, " * ltt-facility-loader-%s_%s.c\n", fac->name, fac->arch);
+ fprintf(fd, " *\n");
+ fprintf(fd, " * (C) Copyright 2005 - \n");
+ fprintf(fd, " * Mathieu Desnoyers (mathieu.desnoyers@polymtl.ca)\n");
+ fprintf(fd, " *\n");
+ fprintf(fd, " * Contains the LTT facility loader.\n");
+ fprintf(fd, " *\n");
+ fprintf(fd, " */\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "#include <linux/ltt-facilities.h>\n");
+ fprintf(fd, "#include <linux/module.h>\n");
+ fprintf(fd, "#include <linux/init.h>\n");
+ fprintf(fd, "#include <linux/config.h>\n");
+ if(!fac->arch)
+ fprintf(fd, "#include \"ltt-facility-loader-%s.h\"\n", fac->name);
+ else
+ fprintf(fd, "#include \"ltt-facility-loader-%s_%s.h\"\n",
+ fac->name, fac->arch);
+ fprintf(fd, "\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "#ifdef CONFIG_LTT\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "EXPORT_SYMBOL(LTT_FACILITY_SYMBOL);\n");
+ fprintf(fd, "EXPORT_SYMBOL(LTT_FACILITY_CHECKSUM_SYMBOL);\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "static const char ltt_facility_name[] = LTT_FACILITY_NAME;\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "#define SYMBOL_STRING(sym) #sym\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "static struct ltt_facility facility = {\n");
+ fprintf(fd, "\t.name = ltt_facility_name,\n");
+ fprintf(fd, "\t.num_events = LTT_FACILITY_NUM_EVENTS,\n");
+ fprintf(fd, "\t.checksum = LTT_FACILITY_CHECKSUM,\n");
+ fprintf(fd, "\t.symbol = SYMBOL_STRING(LTT_FACILITY_SYMBOL),\n");
+ fprintf(fd, "};\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "static int __init facility_init(void)\n");
+ fprintf(fd, "{\n");
+ fprintf(fd, "\tprintk(KERN_INFO \"LTT : ltt-facility-%s init in kernel\\n\");\n", fac->name);
+ fprintf(fd, "\n");
+ fprintf(fd, "\tLTT_FACILITY_SYMBOL = ltt_facility_kernel_register(&facility);\n");
+ fprintf(fd, "\tLTT_FACILITY_CHECKSUM_SYMBOL = LTT_FACILITY_SYMBOL;\n");
+ fprintf(fd, "\t\n");
+ fprintf(fd, "\treturn LTT_FACILITY_SYMBOL;\n");
+ fprintf(fd, "}\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "#ifndef MODULE\n");
+ fprintf(fd, "__initcall(facility_init);\n");
+ fprintf(fd, "#else\n");
+ fprintf(fd, "module_init(facility_init);\n");
+ fprintf(fd, "static void __exit facility_exit(void)\n");
+ fprintf(fd, "{\n");
+ fprintf(fd, "\tint err;\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "\terr = ltt_facility_unregister(LTT_FACILITY_SYMBOL);\n");
+ fprintf(fd, "\tif (err != 0)\n");
+ fprintf(fd, "\t\tprintk(KERN_ERR \"LTT : Error in unregistering facility.\\n\");\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "}\n");
+ fprintf(fd, "module_exit(facility_exit)\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "MODULE_LICENSE(\"GPL\");\n");
+ fprintf(fd, "MODULE_AUTHOR(\"Mathieu Desnoyers\");\n");
+ fprintf(fd, "MODULE_DESCRIPTION(\"Linux Trace Toolkit Facility\");\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "#endif //MODULE\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "#endif //CONFIG_LTT\n");
+
+ fclose(fd);
+
+ return 0;
+}
+
+int print_loader_c_user(facility_t *fac)
+{
+ char filename[PATH_MAX];
+ unsigned int filename_size = 0;
+ FILE *fd;
+ dprintf("%s\n", fac->name);
+
+ strcpy(filename, "ltt-facility-loader-");
+ filename_size = strlen(filename);
+
+ strncat(filename, fac->name, PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+
+ if(fac->arch) {
+ strncat(filename, "_", PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+
+ strncat(filename, fac->arch, PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+ }
+
+ strncat(filename, ".c", PATH_MAX - filename_size);
+ filename_size = strlen(filename);
+
+
+ fd = fopen(filename, "w");
+ if(fd == NULL) {
+ printf("Error opening file %s for writing : %s\n",
+ filename, strerror(errno));
+ return errno;
+ }
+
+ fprintf(fd, "/*\n");
+ if(!fac->arch)
+ fprintf(fd, " * ltt-facility-loader-%s.c\n", fac->name);
+ else
+ fprintf(fd, " * ltt-facility-loader-%s_%s.c\n", fac->name, fac->arch);
+ fprintf(fd, " *\n");
+ fprintf(fd, " * (C) Copyright 2005 - \n");
+ fprintf(fd, " * Mathieu Desnoyers (mathieu.desnoyers@polymtl.ca)\n");
+ fprintf(fd, " *\n");
+ fprintf(fd, " * Contains the LTT user space facility loader.\n");
+ fprintf(fd, " *\n");
+ fprintf(fd, " */\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "#define LTT_TRACE\n");
+ fprintf(fd, "#include <error.h>\n");
+ fprintf(fd, "#include <stdio.h>\n");
+ fprintf(fd, "#include <ltt/ltt-usertrace.h>\n");
+ if(!fac->arch)
+ fprintf(fd, "#include \"ltt-facility-loader-%s.h\"\n", fac->name);
+ else
+ fprintf(fd, "#include \"ltt-facility-loader-%s_%s.h\"\n",
+ fac->name, fac->arch);
+ fprintf(fd, "\n");
+ fprintf(fd, "static struct user_facility_info facility = {\n");
+ fprintf(fd, "\t.name = LTT_FACILITY_NAME,\n");
+ fprintf(fd, "\t.num_events = LTT_FACILITY_NUM_EVENTS,\n");
+ fprintf(fd, "#ifndef LTT_PACK\n");
+ fprintf(fd, "\t.alignment = sizeof(void*),\n");
+ fprintf(fd, "#else\n");
+ fprintf(fd, "\t.alignment = 0,\n");
+ fprintf(fd, "#endif //LTT_PACK\n");
+ fprintf(fd, "\t.checksum = LTT_FACILITY_CHECKSUM,\n");
+ fprintf(fd, "\t.int_size = sizeof(int),\n");
+ fprintf(fd, "\t.long_size = sizeof(long),\n");
+ fprintf(fd, "\t.pointer_size = sizeof(void*),\n");
+ fprintf(fd, "\t.size_t_size = sizeof(size_t)\n");
+ fprintf(fd, "};\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "static void __attribute__((constructor)) __ltt_user_init(void)\n");
+ fprintf(fd, "{\n");
+ fprintf(fd, "\tint err;\n");
+ fprintf(fd, "#ifdef LTT_SHOW_DEBUG\n");
+ fprintf(fd, "\tprintf(\"LTT : ltt-facility-%s init in userspace\\n\");\n", fac->name);
+ fprintf(fd, "#endif //LTT_SHOW_DEBUG\n");
+ fprintf(fd, "\n");
+ fprintf(fd, "\terr = ltt_register_generic(<T_FACILITY_SYMBOL, &facility);\n");
+ fprintf(fd, "\tLTT_FACILITY_CHECKSUM_SYMBOL = LTT_FACILITY_SYMBOL;\n");
+ fprintf(fd, "\t\n");
+ fprintf(fd, "\tif (err) {\n");
+ fprintf(fd, "#ifdef LTT_SHOW_DEBUG\n");
+ fprintf(fd, "\t\tperror(\"Error in ltt_register_generic\");\n");
+ fprintf(fd, "#endif //LTT_SHOW_DEBUG\n");
+ fprintf(fd, "\t}\n");
+ fprintf(fd, "}\n");
+ fprintf(fd, "\n");
+
+ fclose(fd);
+
+ return 0;
+}
+
+
+
+/* open facility */
+/* code taken from ltt_facility_open in ltt/facility.c in lttv */
+