[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 5/5] Add small utility to deal with test coverage information from Xen
Currently the utility can read and reset coverage informations. Signed-off-by: Frediano Ziglio <frediano.ziglio@xxxxxxxxxx> --- .gitignore | 1 + .hgignore | 1 + tools/misc/Makefile | 8 ++- tools/misc/xencov.c | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 tools/misc/xencov.c diff --git a/.gitignore b/.gitignore index af48492..9e947ce 100644 --- a/.gitignore +++ b/.gitignore @@ -223,6 +223,7 @@ tools/misc/gtraceview tools/misc/gtracestat tools/misc/xenlockprof tools/misc/lowmemd +tools/misc/xencov tools/pygrub/build/* tools/python/build/* tools/python/xen/util/path.py diff --git a/.hgignore b/.hgignore index 146d8d4..e98c3df 100644 --- a/.hgignore +++ b/.hgignore @@ -218,6 +218,7 @@ ^tools/misc/gtraceview$ ^tools/misc/gtracestat$ ^tools/misc/xenlockprof$ +^tools/misc/xencov$ ^tools/pygrub/build/.*$ ^tools/python/build/.*$ ^tools/python/xen/util/path\.py$ diff --git a/tools/misc/Makefile b/tools/misc/Makefile index 22e60fd..eef9411 100644 --- a/tools/misc/Makefile +++ b/tools/misc/Makefile @@ -9,7 +9,7 @@ CFLAGS += $(CFLAGS_libxenstore) HDRS = $(wildcard *.h) -TARGETS-y := xenperf xenpm xen-tmem-list-parse gtraceview gtracestat xenlockprof xenwatchdogd +TARGETS-y := xenperf xenpm xen-tmem-list-parse gtraceview gtracestat xenlockprof xenwatchdogd xencov TARGETS-$(CONFIG_X86) += xen-detect xen-hvmctx xen-hvmcrash xen-lowmemd TARGETS-$(CONFIG_MIGRATE) += xen-hptool TARGETS := $(TARGETS-y) @@ -22,7 +22,8 @@ INSTALL_BIN-y := xencons INSTALL_BIN-$(CONFIG_X86) += xen-detect INSTALL_BIN := $(INSTALL_BIN-y) -INSTALL_SBIN-y := xm xen-bugtool xen-python-path xend xenperf xsview xenpm xen-tmem-list-parse gtraceview gtracestat xenlockprof xenwatchdogd xen-ringwatch +INSTALL_SBIN-y := xm xen-bugtool xen-python-path xend xenperf xsview xenpm xen-tmem-list-parse gtraceview \ + gtracestat xenlockprof xenwatchdogd xen-ringwatch xencov INSTALL_SBIN-$(CONFIG_X86) += xen-hvmctx xen-hvmcrash xen-lowmemd INSTALL_SBIN-$(CONFIG_MIGRATE) += xen-hptool INSTALL_SBIN := $(INSTALL_SBIN-y) @@ -85,4 +86,7 @@ xen-lowmemd: xen-lowmemd.o gtraceview: gtraceview.o $(CC) $(LDFLAGS) -o $@ $< $(CURSES_LIBS) $(APPEND_LDFLAGS) +xencov: xencov.o + $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS) + -include $(DEPS) diff --git a/tools/misc/xencov.c b/tools/misc/xencov.c new file mode 100644 index 0000000..5e7f440 --- /dev/null +++ b/tools/misc/xencov.c @@ -0,0 +1,141 @@ +/* + * xencov: handle test coverage information from Xen. + * + * Copyright (c) 2013, Frediano Ziglio + * + * This program is free software; you can redistribute it and/or modify it + * under the terms and conditions of the GNU General Public License, + * version 2, as published by the Free Software Foundation. + * + * This program is distributed in the hope it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place - Suite 330, Boston, MA 02111-1307 USA. + */ + +#include <xenctrl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <errno.h> +#include <err.h> +#include <sys/mman.h> + +static xc_interface *gcov_xch = NULL; + +static void gcov_init(void) +{ + gcov_xch = xc_interface_open(NULL, NULL, 0); + if ( !gcov_xch ) + err(1, "opening interface"); +} + +int gcov_get_info(int op, void *ptr) +{ + struct xen_sysctl_coverage_op *cov; + struct xen_sysctl sys; + + memset(&sys, 0, sizeof(sys)); + sys.cmd = XEN_SYSCTL_coverage_op; + + cov = &sys.u.coverage_op; + cov->cmd = op; + cov->u.total_size.p = ptr; + + return xc_sysctl(gcov_xch, &sys); +} + +static void gcov_read(const char *fn) +{ + unsigned page_size = sysconf(_SC_PAGESIZE); + uint32_t *ui, total_len; + uint8_t *p; + size_t size; + FILE *f; + + /* allocate */ + p = mmap(0, page_size, PROT_WRITE|PROT_READ, + MAP_PRIVATE|MAP_ANON|MAP_LOCKED, -1, 0); + if ( p == (uint8_t *) -1 ) + err(1, "allocating memory"); + + /* get total length */ + ui = (uint32_t *) p; + *ui = 0; + if ( gcov_get_info(XEN_SYSCTL_COVERAGE_get_total_size, ui) < 0 ) + err(1, "getting total length"); + fprintf(stderr, "returned %u bytes\n", (unsigned) *ui); + + /* safe check */ + total_len = *ui; + if ( total_len > 16u * 1024u * 1024u ) + errx(1, "coverage size too big %u bytes\n", total_len); + + /* reallocate */ + munmap(p, page_size); + size = total_len + page_size; + size -= (size % page_size); + p = mmap(0, size, PROT_WRITE|PROT_READ, + MAP_PRIVATE|MAP_ANON|MAP_LOCKED, -1, 0); + if ( p == (uint8_t *) -1 ) + err(1, "mapping memory for coverage"); + + /* get data */ + memset(p, 0, total_len); + if ( gcov_get_info(XEN_SYSCTL_COVERAGE_read, p) < 0 ) + err(1, "getting coverage information"); + + /* write to a file */ + if ( strcmp(fn, "-") == 0 ) + f = stdout; + else + f = fopen(fn, "w"); + if ( !f ) + err(1, "opening output file"); + if ( fwrite(p, 1, total_len, f) != total_len ) + err(1, "writing coverage to file"); + if (f != stdout) + fclose(f); +} + +static void gcov_reset(void) +{ + if ( gcov_get_info(XEN_SYSCTL_COVERAGE_reset, NULL) < 0 ) + err(1, "resetting coverage information"); +} + +static void usage(void) +{ + fprintf(stderr, "xencov {reset|read} [<filename>]\n" + "\treset reset information\n" + "\tread read information from xen to filename\n" + "\tfilename optional filename (default output)\n" + ); + exit(1); +} + +int main(int argc, char **argv) +{ + gcov_init(); + + /* check support */ + if ( gcov_get_info(XEN_SYSCTL_COVERAGE_enabled, NULL) < 0 ) + err(1, "checking coverage support"); + + if ( argc < 2 ) + usage(); + if ( strcmp(argv[1], "reset") == 0 ) + gcov_reset(); + else if ( strcmp(argv[1], "read") == 0 ) + gcov_read(argc > 2 ? argv[2] : "-"); + else + usage(); + + return 0; +} + -- 1.7.9.5 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |