lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 10 Nov 2017 14:29:12 +0200 From: "Yordan Karadzhov (VMware)" <y.karadz@...il.com> To: rostedt@...dmis.org Cc: jan.kiszka@...mens.com, linux-kernel@...r.kernel.org, "Yordan Karadzhov (VMware)" <y.karadz@...il.com> Subject: [PATCH v2 1/4] kernelshark: Adding infrastructure for GUI plugins Makefile modified in order to support building of GUI plugins. kshark_plugin_loader and kshark_plugin_unloader are modified kshark_plugin_reloader is defined and is called when the user loads a new trace data file. Signed-off-by: Yordan Karadzhov (VMware) <y.karadz@...il.com> --- Makefile | 31 ++++++++++-- kernel-shark.c | 150 +++++++++++++++++++++++++++++++++++++------------------- kshark-plugin.h | 22 ++++++++- 3 files changed, 146 insertions(+), 57 deletions(-) diff --git a/Makefile b/Makefile index 5c35143..8d0f16f 100644 --- a/Makefile +++ b/Makefile @@ -293,6 +293,8 @@ else print_shared_lib_compile = echo ' $(GUI)COMPILE SHARED LIB '$(GOBJ); print_plugin_obj_compile = echo ' $(GUI)COMPILE PLUGIN OBJ '$(GOBJ); print_plugin_build = echo ' $(GUI)BUILD PLUGIN '$(GOBJ); + print_gui_plugin_obj_compile = echo ' $(GUI)COMPILE GUI_PLUGIN OBJ '$(GOBJ); + print_gui_plugin_build = echo ' $(GUI)BUILD GUI_PLUGIN '$(GOBJ); print_static_lib_build = echo ' $(GUI)BUILD STATIC LIB '$(GOBJ); print_install = echo ' $(GUI)INSTALL '$(GSPACE)$1' to $(DESTDIR_SQ)$2'; endif @@ -317,6 +319,14 @@ do_plugin_build = \ ($(print_plugin_build) \ $(CC) $(CFLAGS) $(LDFLAGS) -shared -nostartfiles -o $@ $<) +do_compile_gui_plugin_obj = \ + ($(print_gui_plugin_obj_compile) \ + $(CC) -c $(CPPFLAGS) $(CFLAGS) -fPIC -o $@ $<) + +do_gui_plugin_build = \ + ($(print_gui_plugin_build) \ + $(CC) $(CFLAGS) $(LDFLAGS) -shared -nostartfiles -o $@ $<) + do_build_static_lib = \ ($(print_static_lib_build) \ $(RM) $@; $(AR) rcs $@ $^) @@ -373,13 +383,17 @@ PLUGIN_OBJS += plugin_tlb.o PLUGINS := $(PLUGIN_OBJS:.o=.so) +GUI_PLUGIN_OBJS = + +GUI_PLUGINS := $(GUI_PLUGIN_OBJS:.o=.so) + ALL_OBJS = $(TRACE_CMD_OBJS) $(KERNEL_SHARK_OBJS) $(TRACE_VIEW_MAIN_OBJS) \ - $(TRACE_GRAPH_MAIN_OBJS) $(TCMD_LIB_OBJS) $(PLUGIN_OBJS) + $(TRACE_GRAPH_MAIN_OBJS) $(TCMD_LIB_OBJS) $(PLUGIN_OBJS) $(GUI_PLUGIN_OBJS) CMD_TARGETS = trace_plugin_dir trace_python_dir tc_version.h libparsevent.a $(LIB_FILE) \ trace-cmd $(PLUGINS) $(BUILD_PYTHON) -GUI_TARGETS = ks_version.h trace-graph trace-view kernelshark +GUI_TARGETS = ks_version.h trace-graph trace-view kernelshark $(GUI_PLUGINS) TARGETS = $(CMD_TARGETS) $(GUI_TARGETS) @@ -401,7 +415,7 @@ gui: $(CMD_TARGETS) all_gui: $(GUI_TARGETS) show_gui_done -GUI_OBJS = $(KERNEL_SHARK_OBJS) $(TRACE_VIEW_MAIN_OBJS) $(TRACE_GRAPH_MAIN_OBJS) +GUI_OBJS = $(KERNEL_SHARK_OBJS) $(TRACE_VIEW_MAIN_OBJS) $(TRACE_GRAPH_MAIN_OBJS) $(GUI_PLUGIN_OBJS) gui_objs := $(sort $(GUI_OBJS)) @@ -447,6 +461,12 @@ $(PLUGIN_OBJS): %.o : $(src)/%.c $(PLUGINS): %.so: %.o $(Q)$(do_plugin_build) +$(GUI_PLUGIN_OBJS): %.o : $(src)/%.c + $(Q)$(do_compile_gui_plugin_obj) + +$(GUI_PLUGINS): %.so: %.o + $(Q)$(do_gui_plugin_build) + define make_version.h (echo '/* This file is automatically generated. Do not modify. */'; \ echo \#define VERSION_CODE $(shell \ @@ -549,7 +569,10 @@ cscope: force $(RM) cscope* find . -name '*.[ch]' | cscope -b -q -PLUGINS_INSTALL = $(subst .so,.install,$(PLUGINS)) $(subst .so,.install,$(PYTHON_PLUGINS)) +PLUGINS_INSTALL = +PLUGINS_INSTALL += $(subst .so,.install,$(PLUGINS)) +PLUGINS_INSTALL += $(subst .so,.install,$(GUI_PLUGINS)) +PLUGINS_INSTALL += $(subst .so,.install,$(PYTHON_PLUGINS)) define do_install $(print_install) \ diff --git a/kernel-shark.c b/kernel-shark.c index 89723c3..79b387a 100644 --- a/kernel-shark.c +++ b/kernel-shark.c @@ -339,6 +339,96 @@ int kernelshark_load_file(struct shark_info *info, const char *file) return 0; } +static struct plugin_list { + struct plugin_list *next; + const char *file; +} *plugins; +static struct plugin_list **plugin_next = &plugins; + +static void add_plugin(const char *file) +{ + struct stat st; + int ret; + + ret = stat(file, &st); + if (ret < 0) { + warning("plugin %s not found", file); + return; + } + + *plugin_next = calloc(sizeof(struct plugin_list), 1); + if (!*plugin_next) { + warning("failed to allocat memory for plugin"); + return; + } + + (*plugin_next)->file = file; + plugin_next = &(*plugin_next)->next; +} + +static void handle_plugins(struct shark_info *info, + struct trace_view_store *store, + int task_id) +{ + kshark_plugin_load_func func; + struct plugin_list *plugin; + void *handle; + char* func_name; + int fn_size = 0; + + switch (task_id) { + case KSHARK_PLUGIN_LOAD: + fn_size = asprintf(&func_name, KSHARK_PLUGIN_LOADER_NAME); + break; + + case KSHARK_PLUGIN_RELOAD: + fn_size = asprintf(&func_name, KSHARK_PLUGIN_RELOADER_NAME); + break; + + case KSHARK_PLUGIN_UNLOAD: + fn_size = asprintf(&func_name, KSHARK_PLUGIN_UNLOADER_NAME); + break; + + default: + return; + } + + if (fn_size <= 0) { + warning("failed to allocat memory for plugin function name"); + return; + } + + for (plugin = plugins; plugin; plugin = plugin->next) { + handle = dlopen(plugin->file, RTLD_NOW | RTLD_GLOBAL); + + if (!handle) { + warning("cound not load plugin '%s'\n%s\n", + plugin->file, dlerror()); + continue; + } + + func = dlsym(handle, func_name); + if (!func) { + warning("cound not find func '%s' in plugin '%s'\n%s\n", + func_name, plugin->file, dlerror()); + continue; + } + + func(info, store); + } + + if (task_id == KSHARK_PLUGIN_UNLOAD) { + while ((plugin = plugins)) { + plugins = plugin->next; + free(plugin); + } + + plugin_next = &plugins; + } + + free(func_name); +} + static void /* Callback for the clicked signal of the Load button */ load_clicked (gpointer data) @@ -353,6 +443,9 @@ load_clicked (gpointer data) kernelshark_load_file(info, filename); + GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(info->treeview)); + handle_plugins(info, TRACE_VIEW_STORE(model), KSHARK_PLUGIN_RELOAD); + g_free(filename); } @@ -1805,56 +1898,6 @@ button_press_event(GtkWidget *widget, GdkEventButton *event, gpointer data) return FALSE; } -static struct plugin_list { - struct plugin_list *next; - const char *file; -} *plugins; -static struct plugin_list **plugin_next = &plugins; - -static void add_plugin(const char *file) -{ - struct stat st; - int ret; - - ret = stat(file, &st); - if (ret < 0) { - warning("plugin %s not found", file); - return; - } - - *plugin_next = calloc(sizeof(struct plugin_list), 1); - if (!*plugin_next) - die("failed to allocat memory for plugin"); - - (*plugin_next)->file = file; - plugin_next = &(*plugin_next)->next; -} - -static void handle_plugins(struct shark_info *info) -{ - kshark_plugin_load_func func; - struct plugin_list *plugin; - void *handle; - - while ((plugin = plugins)) { - plugins = plugin->next; - - handle = dlopen(plugin->file, RTLD_NOW | RTLD_GLOBAL); - free(plugin); - if (!handle) { - warning("cound not load plugin '%s'\n%s\n", - plugin->file, dlerror()); - continue; - } - func = dlsym(handle, KSHARK_PLUGIN_LOADER_NAME); - if (!func) { - warning("cound not find func '%s' in plugin '%s'\n%s\n", - KSHARK_PLUGIN_LOADER_NAME, plugin->file, dlerror()); - continue; - } - func(info); - } -} static void sig_end(int sig) { @@ -1882,6 +1925,7 @@ void kernel_shark(int argc, char **argv) GtkWidget *spin; GtkWidget *check; GtkWidget *statusbar; + GtkTreeModel *model; int ret; int c; @@ -2495,7 +2539,8 @@ void kernel_shark(int argc, char **argv) gtk_widget_set_size_request(window, TRACE_WIDTH, TRACE_HEIGHT); - handle_plugins(info); + model = gtk_tree_view_get_model(GTK_TREE_VIEW(info->treeview)); + handle_plugins(info, TRACE_VIEW_STORE(model), KSHARK_PLUGIN_LOAD); gdk_threads_enter(); @@ -2510,6 +2555,9 @@ void kernel_shark(int argc, char **argv) info->ginfo->no_draw = FALSE; gtk_main (); gdk_threads_leave(); + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(info->treeview)); + handle_plugins(info, TRACE_VIEW_STORE(model), KSHARK_PLUGIN_UNLOAD); } int main(int argc, char **argv) diff --git a/kshark-plugin.h b/kshark-plugin.h index 95ba797..81c09b5 100644 --- a/kshark-plugin.h +++ b/kshark-plugin.h @@ -17,19 +17,37 @@ * * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +#include <limits.h> + +#include "event-parse.h" + #ifndef _KSHARK_PLUGIN_H #define _KSHARK_PLUGIN_H #define KSHARK_PLUGIN_LOADER kshark_plugin_loader +#define KSHARK_PLUGIN_RELOADER kshark_plugin_reloader #define KSHARK_PLUGIN_UNLOADER kshark_plugin_unloader #define _MAKE_STR(x) #x #define MAKE_STR(x) _MAKE_STR(x) #define KSHARK_PLUGIN_LOADER_NAME MAKE_STR(KSHARK_PLUGIN_LOADER) +#define KSHARK_PLUGIN_RELOADER_NAME MAKE_STR(KSHARK_PLUGIN_RELOADER) #define KSHARK_PLUGIN_UNLOADER_NAME MAKE_STR(KSHARK_PLUGIN_UNLOADER) -typedef int (*kshark_plugin_load_func)(void *info); -typedef int (*kshark_plugin_unload_func)(void *info); +typedef int (*kshark_plugin_load_func)(void *info, void *store); +typedef int (*kshark_plugin_unload_func)(void *info, void *store); + +typedef int (*kshark_plugin_event_handler_func)(struct pevent_record *record, + int task_id, + void *val); + +typedef int (*kshark_plugin_context_update_func)(struct pevent *pevent, int task_id); +enum gui_plugin_actions { + KSHARK_PLUGIN_LOAD, + KSHARK_PLUGIN_RELOAD, + KSHARK_PLUGIN_UNLOAD, +}; #endif -- 2.15.0.rc0
Powered by blists - more mailing lists