Commit 4bc4b131 authored by Daniel Bristot de Oliveira's avatar Daniel Bristot de Oliveira Committed by Steven Rostedt (Google)
Browse files

rv: Add rv tool

This is the (user-space) runtime verification tool, named rv.

This tool aims to be the interface for in-kernel rv monitors, as
well as the home for monitors in user-space (online asynchronous),
and in *eBPF.

The tool receives a command as the first argument, the current
commands are:

  list	- list all available monitors
  mon	- run a given monitor

Each monitor is an independent piece of software inside the
tool and can have their own arguments.

There is no monitor implemented in this patch, it only
adds the basic structure of the tool, based on rtla.

  # rv --help
    rv version 6.1.0-rc4: help

    usage: rv command [-h] [command_options]

	-h/--help: print this menu

	command: run one of the following command:
	  list: list all available monitors
	  mon:  run a monitor

	[command options]: each command has its own set of options
		           run rv command -h for further information

*dot2bpf is the next patch set, depends on this, doing cleanups.

Link: https://lkml.kernel.org/r/fb51184f3b95aea0d7bfdc33ec09f4153aee84fa.1668180100.git.bristot@kernel.org



Cc: Jonathan Corbet <corbet@lwn.net>
Signed-off-by: default avatarDaniel Bristot de Oliveira <bristot@kernel.org>
Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
parent 4c687437
Loading
Loading
Loading
Loading
+119 −0
Original line number Diff line number Diff line
NAME	:=	rv
# Follow the kernel version
VERSION :=	$(shell cat VERSION 2> /dev/null || make -sC ../../.. kernelversion | grep -v make)

# From libtracefs:
# Makefiles suck: This macro sets a default value of $(2) for the
# variable named by $(1), unless the variable has been set by
# environment or command line. This is necessary for CC and AR
# because make sets default values, so the simpler ?= approach
# won't work as expected.
define allow-override
  $(if $(or $(findstring environment,$(origin $(1))),\
            $(findstring command line,$(origin $(1)))),,\
    $(eval $(1) = $(2)))
endef

# Allow setting CC and AR, or setting CROSS_COMPILE as a prefix.
$(call allow-override,CC,$(CROSS_COMPILE)gcc)
$(call allow-override,AR,$(CROSS_COMPILE)ar)
$(call allow-override,STRIP,$(CROSS_COMPILE)strip)
$(call allow-override,PKG_CONFIG,pkg-config)
$(call allow-override,LD_SO_CONF_PATH,/etc/ld.so.conf.d/)
$(call allow-override,LDCONFIG,ldconfig)

INSTALL	=	install
MKDIR	=	mkdir
FOPTS	:=	-flto=auto -ffat-lto-objects -fexceptions -fstack-protector-strong \
		-fasynchronous-unwind-tables -fstack-clash-protection
WOPTS	:= 	-Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -Wno-maybe-uninitialized

TRACEFS_HEADERS	:= $$($(PKG_CONFIG) --cflags libtracefs)

CFLAGS	:=	-O -g -DVERSION=\"$(VERSION)\" $(FOPTS) $(MOPTS) $(WOPTS) $(TRACEFS_HEADERS) $(EXTRA_CFLAGS) -I include
LDFLAGS	:=	-ggdb $(EXTRA_LDFLAGS)
LIBS	:=	$$($(PKG_CONFIG) --libs libtracefs)

SRC	:=	$(wildcard src/*.c)
HDR	:=	$(wildcard src/*.h)
OBJ	:=	$(SRC:.c=.o)
DIRS	:=	src
FILES	:=	Makefile README.txt
CEXT	:=	bz2
TARBALL	:=	$(NAME)-$(VERSION).tar.$(CEXT)
TAROPTS	:=	-cvjf $(TARBALL)
BINDIR	:=	/usr/bin
DATADIR	:=	/usr/share
MANDIR	:=	$(DATADIR)/man
LICDIR	:=	$(DATADIR)/licenses
SRCTREE	:=	$(or $(BUILD_SRC),$(CURDIR))

LIBTRACEEVENT_MIN_VERSION = 1.5
LIBTRACEFS_MIN_VERSION = 1.3

.PHONY:	all warnings show_warnings
all:	warnings rv

TEST_LIBTRACEEVENT = $(shell sh -c "$(PKG_CONFIG) --atleast-version $(LIBTRACEEVENT_MIN_VERSION) libtraceevent > /dev/null 2>&1 || echo n")
ifeq ("$(TEST_LIBTRACEEVENT)", "n")
WARNINGS = show_warnings
MISSING_LIBS += echo "**   libtraceevent version $(LIBTRACEEVENT_MIN_VERSION) or higher";
MISSING_PACKAGES += "libtraceevent-devel"
MISSING_SOURCE += echo "**  https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git/ ";
endif

TEST_LIBTRACEFS = $(shell sh -c "$(PKG_CONFIG) --atleast-version $(LIBTRACEFS_MIN_VERSION) libtracefs > /dev/null 2>&1 || echo n")
ifeq ("$(TEST_LIBTRACEFS)", "n")
WARNINGS = show_warnings
MISSING_LIBS += echo "**   libtracefs version $(LIBTRACEFS_MIN_VERSION) or higher";
MISSING_PACKAGES += "libtracefs-devel"
MISSING_SOURCE += echo "**  https://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git/ ";
endif

define show_dependencies
	@echo "********************************************";				\
	echo "** NOTICE: Failed build dependencies";					\
	echo "**";									\
	echo "** Required Libraries:";							\
	$(MISSING_LIBS)									\
	echo "**";									\
	echo "** Consider installing the latest libtracefs from your";			\
	echo "** distribution, e.g., 'dnf install $(MISSING_PACKAGES)' on Fedora,";	\
	echo "** or from source:";							\
	echo "**";									\
	$(MISSING_SOURCE)								\
	echo "**";									\
	echo "********************************************"
endef

show_warnings:
	$(call show_dependencies);

ifneq ("$(WARNINGS)", "")
ERROR_OUT = $(error Please add the necessary dependencies)

warnings: $(WARNINGS)
	$(ERROR_OUT)
endif

rv: $(OBJ)
	$(CC) -o rv $(LDFLAGS) $(OBJ) $(LIBS)

.PHONY: install
install:
	$(MKDIR) -p $(DESTDIR)$(BINDIR)
	$(INSTALL) rv -m 755 $(DESTDIR)$(BINDIR)
	$(STRIP) $(DESTDIR)$(BINDIR)/rv

.PHONY: clean tarball
clean:
	@test ! -f rv || rm rv
	@test ! -f $(TARBALL) || rm -f $(TARBALL)
	@rm -rf *~ $(OBJ) *.tar.$(CEXT)

tarball: clean
	rm -rf $(NAME)-$(VERSION) && mkdir $(NAME)-$(VERSION)
	echo $(VERSION) > $(NAME)-$(VERSION)/VERSION
	cp -r $(DIRS) $(FILES) $(NAME)-$(VERSION)
	tar $(TAROPTS) --exclude='*~' $(NAME)-$(VERSION)
	rm -rf $(NAME)-$(VERSION)
+38 −0
Original line number Diff line number Diff line
RV: Runtime Verification

Runtime Verification (RV) is a lightweight (yet rigorous) method that
complements classical exhaustive verification techniques (such as model
checking and theorem proving) with a more practical approach for
complex systems.

The rv tool is the interface for a collection of monitors that aim
analysing the logical and timing behavior of Linux.

Installing RV

RV depends on the following libraries and tools:

 - libtracefs
 - libtraceevent

It also depends on python3-docutils to compile man pages.

For development, we suggest the following steps for compiling rtla:

  $ git clone git://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git
  $ cd libtraceevent/
  $ make
  $ sudo make install
  $ cd ..
  $ git clone git://git.kernel.org/pub/scm/libs/libtrace/libtracefs.git
  $ cd libtracefs/
  $ make
  $ sudo make install
  $ cd ..
  $ cd $rv_src
  $ make
  $ sudo make install

For further information, please see rv manpage and the kernel documentation:
  Runtime Verification:
    Documentation/trace/rv/runtime-verification.rst
+12 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

#define MAX_DESCRIPTION 1024
#define MAX_DA_NAME_LEN	24

struct monitor {
	char name[MAX_DA_NAME_LEN];
	char desc[MAX_DESCRIPTION];
	int enabled;
};

int should_stop(void);
+16 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

#include <tracefs.h>

struct trace_instance {
	struct tracefs_instance		*inst;
	struct tep_handle		*tep;
	struct trace_seq		*seq;
};

int trace_instance_init(struct trace_instance *trace, char *name);
int trace_instance_start(struct trace_instance *trace);
void trace_instance_destroy(struct trace_instance *trace);

int collect_registered_events(struct tep_event *event, struct tep_record *record,
			      int cpu, void *context);
+8 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0

#define MAX_PATH		1024

void debug_msg(const char *fmt, ...);
void err_msg(const char *fmt, ...);

extern int config_debug;
Loading