The internal data structure and code are tied to an old gcov format.
It's easier to just redo everything from scratch.
Salvage the reusable parts: leave xen/common/gcov and an empty Makefile
there, leave gcov support in Kconfig but mark that as broken. Also
reserve the sysctl number for later use (but delete relevant sysctl
structures).
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
INSTALL_BIN-$(CONFIG_X86) += xen-cpuid
INSTALL_BIN-$(CONFIG_X86) += xen-detect
INSTALL_BIN += xencons
-INSTALL_BIN += xencov_split
INSTALL_BIN += $(INSTALL_BIN-y)
# Everything to be installed in regular sbin/
INSTALL_SBIN-$(CONFIG_X86) += xen-mfndump
INSTALL_SBIN += xen-ringwatch
INSTALL_SBIN += xen-tmem-list-parse
-INSTALL_SBIN += xencov
INSTALL_SBIN += xenlockprof
INSTALL_SBIN += xenperf
INSTALL_SBIN += xenpm
TARGETS_COPY += xen-bugtool
TARGETS_COPY += xen-ringwatch
TARGETS_COPY += xencons
-TARGETS_COPY += xencov_split
TARGETS_COPY += xenpvnetboot
# Everything which needs to be built
xen-lowmemd: xen-lowmemd.o
$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenevtchn) $(LDLIBS_libxenctrl) $(LDLIBS_libxenstore) $(APPEND_LDFLAGS)
-xencov: xencov.o
- $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
-
-include $(DEPS)
+++ /dev/null
-/*
- * xencov: handle test coverage information from Xen.
- *
- * Copyright (c) 2013, Citrix Systems R&D Ltd.
- *
- * 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, see <http://www.gnu.org/licenses/>.
- */
-
-#include <xenctrl.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <err.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, struct xen_sysctl *sys, struct xc_hypercall_buffer *ptr)
-{
- struct xen_sysctl_coverage_op *cov;
- DECLARE_HYPERCALL_BUFFER_ARGUMENT(ptr);
-
- memset(sys, 0, sizeof(*sys));
- sys->cmd = XEN_SYSCTL_coverage_op;
-
- cov = &sys->u.coverage_op;
- cov->cmd = op;
- set_xen_guest_handle(cov->u.raw_info, ptr);
-
- return xc_sysctl(gcov_xch, sys);
-}
-
-static void gcov_read(const char *fn, int reset)
-{
- struct xen_sysctl sys;
- uint32_t total_len;
- DECLARE_HYPERCALL_BUFFER(uint8_t, p);
- FILE *f;
- int op = reset ? XEN_SYSCTL_COVERAGE_read_and_reset :
- XEN_SYSCTL_COVERAGE_read;
-
- /* get total length */
- if ( gcov_get_info(XEN_SYSCTL_COVERAGE_get_total_size, &sys, NULL) < 0 )
- err(1, "getting total length");
- total_len = sys.u.coverage_op.u.total_size;
- fprintf(stderr, "returned %u bytes\n", (unsigned) total_len);
-
- /* safe check */
- if ( total_len > 16u * 1024u * 1024u )
- errx(1, "coverage size too big %u bytes\n", total_len);
-
- /* allocate */
- p = xc_hypercall_buffer_alloc(gcov_xch, p, total_len);
- if ( p == NULL )
- err(1, "allocating memory for coverage");
-
- /* get data */
- memset(p, 0, total_len);
- if ( gcov_get_info(op, &sys, HYPERCALL_BUFFER(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);
- xc_hypercall_buffer_free(gcov_xch, p);
-}
-
-static void gcov_reset(void)
-{
- struct xen_sysctl sys;
-
- if ( gcov_get_info(XEN_SYSCTL_COVERAGE_reset, &sys, NULL) < 0 )
- err(1, "resetting coverage information");
-}
-
-static void usage(int exit_code)
-{
- FILE *out = exit_code ? stderr : stdout;
-
- fprintf(out, "xencov {reset|read|read-reset} [<filename>]\n"
- "\treset reset information\n"
- "\tread read information from xen to filename\n"
- "\tread-reset read and reset information from xen to filename\n"
- "\tfilename optional filename (default output)\n"
- );
- exit(exit_code);
-}
-
-int main(int argc, char **argv)
-{
- int opt;
-
- while ((opt = getopt(argc, argv, "h")) != -1) {
- switch (opt) {
- case 'h':
- usage(0);
- break;
- default:
- usage(1);
- }
- }
-
- argv += optind;
- argc -= optind;
- if (argc <= 0)
- usage(1);
-
- gcov_init();
-
- if ( strcmp(argv[0], "reset") == 0 )
- gcov_reset();
- else if ( strcmp(argv[0], "read") == 0 )
- gcov_read(argc > 1 ? argv[1] : "-", 0);
- else if ( strcmp(argv[0], "read-reset") == 0 )
- gcov_read(argc > 1 ? argv[1] : "-", 1);
- else
- usage(1);
-
- return 0;
-}
-
+++ /dev/null
-#!/usr/bin/perl
-
-# xencov_split - split coverage information from Xen
-#
-# Copyright (C) 2013 - Citrix Systems
-# -----
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that 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, see <http://www.gnu.org/licenses/>.
-
-use strict;
-use File::Path qw(mkpath);
-
-# some magic constants
-my $magic = 0x67636461;
-my $ctrBase = 0x01a10000;
-
-my $xenMagic = 0x58544346; # file header
-my $xenTagFunc = 0x58544366; # functions tag
-my $xenTagCount0 = 0x58544330; # counter 0 tag
-my $xenTagEnd = 0x5854432e; # end file
-
-# open input file
-if ($ARGV[0]) {
- my $fn = $ARGV[0];
- open(IN, '<', $fn) or die "opening file \"$fn\"";
-} else {
- open(IN, '<&STDIN') or die "redirecting input";
-}
-
-my $pos = 0;
-
-sub getRaw($)
-{
- my $l = shift;
- die 'got no data to read' if $l < 0;
- my $res = '';
- do {
- my $data;
- my $r = read(IN, $data, $l);
- die "error $! reading data from input at position $pos" if !defined($r);
- die "unexpected end of file at position $pos" if !$r;
- $l -= $r;
- $pos += $r;
- $res .= $data;
- } while ($l > 0);
- return $res;
-}
-
-sub get32()
-{
- return unpack('V', getRaw(4));
-}
-
-sub get64()
-{
- # This is returned as raw data as some Perl version could not
- # support 64 bit integer
- # This is ok for little endian machines
- return getRaw(8);
-}
-
-sub align()
-{
- my $l = $pos & 7;
- getRaw(8-$l) if $l;
-}
-
-# read a string prefixed by length
-sub getS()
-{
- my $l = get32();
- my $res = getRaw($l);
- align();
- return $res;
-}
-
-sub parseFunctions($)
-{
- my $numCounters = shift;
- my $num = get32();
-
- my @funcs;
- for my $n (1..$num) {
- my @data;
- my $ident = get32();
- my $checksum = get32();
- for my $n (1..$numCounters) {
- push @data, get32(); # number of counters for a type
- }
- push @funcs, [$ident, $checksum, \@data];
- }
- align();
- return @funcs;
-}
-
-sub parseCounters($)
-{
- my $tag = shift;
- die sprintf("wrong tag 0x%08x pos $pos (0x%08x)", $tag, $pos) if $tag < $xenTagCount0;
- $tag -= $xenTagCount0;
- die sprintf('wrong tag 0x%08x', $tag) if $tag > 5;
- my $data = '';
-
- my $num = get32();
- for my $n (1..$num) {
- $data .= get64();
- }
- align();
- return [$tag, $data];
-}
-
-
-sub parseFile()
-{
- my $ver = get32();
- my $stamp = get32();
- my $fn = getS();
- align();
-
- my $numCounters;
-
- print "got file $fn\n";
- die if $fn !~ m,^(/.*?)[^/]+\.gcda$,;
- mkpath(".$1");
- open(OUT, '>', ".$fn") or die;
-
- print OUT pack('VVV', $magic, $ver, $stamp);
-
- # read counters of file
- my @ctrs;
- my @funcs;
- my $tag;
- for (;;) {
- $tag = get32();
- last if ($tag == $xenMagic || $tag == $xenTagEnd);
- if ($tag == $xenTagFunc) {
- die if scalar(@funcs);
- @funcs = parseFunctions(scalar(@ctrs));
- next;
- }
-
- # must be a counter
- push @ctrs, parseCounters($tag);
- ++$numCounters;
- }
-
- # print all functions
- for my $f (@funcs) {
- # tag tag_len ident checksum
- print OUT pack('VVVV', 0x01000000, 2, $f->[0], $f->[1]);
- # all counts
- my $n = 0;
- for my $c (@{$f->[2]}) {
- my ($type, $data) = @{$ctrs[$n]};
- print OUT pack('VV', $ctrBase + 0x20000 * $type, $c*2);
- die "--$c--$type--$data--" if length($data) < $c * 8;
- print OUT substr($data, 0, $c * 8);
- $ctrs[$n] = [$type, substr($data, $c * 8)];
- ++$n;
- }
- }
- close(OUT);
-
- return $tag;
-}
-
-my $tag = get32();
-die 'no coverage or wrong file format' if $tag != $xenMagic;
-for (;;) {
- if ($tag == $xenMagic) {
- $tag = parseFile();
- } elsif ($tag == $xenTagEnd) {
- last;
- } else {
- die "wrong tag $tag";
- }
-}
config GCOV
bool "Gcov Support"
+ depends on BROKEN
---help---
Enable gcov (a test coverage program in GCC) support.
+++ /dev/null
-/*
- * This code maintains a list of active profiling data structures.
- *
- * Copyright IBM Corp. 2009
- * Author(s): Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
- *
- * Uses gcc-internal data definitions.
- * Based on the gcov-kernel patch by:
- * Hubertus Franke <frankeh@us.ibm.com>
- * Nigel Hinds <nhinds@us.ibm.com>
- * Rajan Ravindran <rajancr@us.ibm.com>
- * Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
- * Paul Larson
- */
-
-#include <xen/config.h>
-#include <xen/init.h>
-#include <xen/lib.h>
-#include <xen/hypercall.h>
-#include <xen/gcov.h>
-#include <xen/errno.h>
-#include <xen/guest_access.h>
-#include <public/xen.h>
-#include <public/gcov.h>
-
-static struct gcov_info *info_list;
-
-/*
- * __gcov_init is called by gcc-generated constructor code for each object
- * file compiled with -fprofile-arcs.
- *
- * Although this function is called only during initialization is called from
- * a .text section which is still present after initialization so not declare
- * as __init.
- */
-void __gcov_init(struct gcov_info *info)
-{
- /* add new profiling data structure to list */
- info->next = info_list;
- info_list = info;
-}
-
-/*
- * These functions may be referenced by gcc-generated profiling code but serve
- * no function for Xen.
- */
-void __gcov_flush(void)
-{
- /* Unused. */
-}
-
-void __gcov_merge_add(gcov_type *counters, unsigned int n_counters)
-{
- /* Unused. */
-}
-
-void __gcov_merge_single(gcov_type *counters, unsigned int n_counters)
-{
- /* Unused. */
-}
-
-void __gcov_merge_delta(gcov_type *counters, unsigned int n_counters)
-{
- /* Unused. */
-}
-
-static inline int counter_active(const struct gcov_info *info, unsigned int type)
-{
- return (1 << type) & info->ctr_mask;
-}
-
-typedef struct write_iter_t
-{
- XEN_GUEST_HANDLE(uint8) ptr;
- int real;
- uint32_t write_offset;
-} write_iter_t;
-
-static int write_raw(struct write_iter_t *iter, const void *data,
- size_t data_len)
-{
- if ( iter->real &&
- copy_to_guest_offset(iter->ptr, iter->write_offset,
- (const unsigned char *) data, data_len) )
- return -EFAULT;
-
- iter->write_offset += data_len;
- return 0;
-}
-
-#define chk(v) do { ret=(v); if ( ret ) return ret; } while(0)
-
-static inline int write32(write_iter_t *iter, uint32_t val)
-{
- return write_raw(iter, &val, sizeof(val));
-}
-
-static int write_string(write_iter_t *iter, const char *s)
-{
- int ret;
- size_t len = strlen(s);
-
- chk(write32(iter, len));
- return write_raw(iter, s, len);
-}
-
-static inline int next_type(const struct gcov_info *info, int *type)
-{
- while ( ++*type < XENCOV_COUNTERS && !counter_active(info, *type) )
- continue;
- return *type;
-}
-
-static inline void align_iter(write_iter_t *iter)
-{
- iter->write_offset =
- (iter->write_offset + sizeof(uint64_t) - 1) & -sizeof(uint64_t);
-}
-
-static int write_gcov(write_iter_t *iter)
-{
- struct gcov_info *info;
- int ret;
-
- /* reset offset */
- iter->write_offset = 0;
-
- /* dump all files */
- for ( info = info_list ; info; info = info->next )
- {
- const struct gcov_ctr_info *ctr;
- int type;
- size_t size_fn = sizeof(struct gcov_fn_info);
-
- align_iter(iter);
- chk(write32(iter, XENCOV_TAG_FILE));
- chk(write32(iter, info->version));
- chk(write32(iter, info->stamp));
- chk(write_string(iter, info->filename));
-
- /* dump counters */
- ctr = info->counts;
- for ( type = -1; next_type(info, &type) < XENCOV_COUNTERS; ++ctr )
- {
- align_iter(iter);
- chk(write32(iter, XENCOV_TAG_COUNTER(type)));
- chk(write32(iter, ctr->num));
- chk(write_raw(iter, ctr->values,
- ctr->num * sizeof(ctr->values[0])));
-
- size_fn += sizeof(unsigned);
- }
-
- /* dump all functions together */
- align_iter(iter);
- chk(write32(iter, XENCOV_TAG_FUNC));
- chk(write32(iter, info->n_functions));
- chk(write_raw(iter, info->functions, info->n_functions * size_fn));
- }
-
- /* stop tag */
- align_iter(iter);
- chk(write32(iter, XENCOV_TAG_END));
- return 0;
-}
-
-static int reset_counters(void)
-{
- struct gcov_info *info;
-
- for ( info = info_list ; info; info = info->next )
- {
- const struct gcov_ctr_info *ctr;
- int type;
-
- /* reset counters */
- ctr = info->counts;
- for ( type = -1; next_type(info, &type) < XENCOV_COUNTERS; ++ctr )
- memset(ctr->values, 0, ctr->num * sizeof(ctr->values[0]));
- }
-
- return 0;
-}
-
-int sysctl_coverage_op(xen_sysctl_coverage_op_t *op)
-{
- int ret = -EINVAL;
- write_iter_t iter;
-
- switch ( op->cmd )
- {
- case XEN_SYSCTL_COVERAGE_get_total_size:
- iter.real = 0;
-
- write_gcov(&iter);
- op->u.total_size = iter.write_offset;
- ret = 0;
- break;
-
- case XEN_SYSCTL_COVERAGE_read_and_reset:
- case XEN_SYSCTL_COVERAGE_read:
- iter.ptr = op->u.raw_info;
- iter.real = 1;
-
- ret = write_gcov(&iter);
- if ( ret || op->cmd != XEN_SYSCTL_COVERAGE_read_and_reset )
- break;
-
- /* fall through */
- case XEN_SYSCTL_COVERAGE_reset:
- ret = reset_counters();
- break;
- }
- return ret;
-}
-
-/*
- * Local variables:
- * mode: C
- * c-file-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
#include <xen/nodemask.h>
#include <xsm/xsm.h>
#include <xen/pmstat.h>
-#include <xen/gcov.h>
#include <xen/livepatch.h>
long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t) u_sysctl)
}
break;
-#ifdef CONFIG_GCOV
- case XEN_SYSCTL_coverage_op:
- ret = sysctl_coverage_op(&op->u.coverage_op);
- break;
-#endif
-
#ifdef CONFIG_HAS_PCI
case XEN_SYSCTL_pcitopoinfo:
{
+++ /dev/null
-/******************************************************************************
- * gcov.h
- *
- * Coverage structures exported by Xen.
- * Structure is different from Gcc one.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Copyright (c) 2013, Citrix Systems R&D Ltd.
- */
-
-#ifndef __XEN_PUBLIC_GCOV_H__
-#define __XEN_PUBLIC_GCOV_H__ __XEN_PUBLIC_GCOV_H__
-
-#define XENCOV_COUNTERS 5
-#define XENCOV_TAG_BASE 0x58544300u
-#define XENCOV_TAG_FILE (XENCOV_TAG_BASE+0x46u)
-#define XENCOV_TAG_FUNC (XENCOV_TAG_BASE+0x66u)
-#define XENCOV_TAG_COUNTER(n) (XENCOV_TAG_BASE+0x30u+((n)&0xfu))
-#define XENCOV_TAG_END (XENCOV_TAG_BASE+0x2eu)
-#define XENCOV_IS_TAG_COUNTER(n) \
- ((n) >= XENCOV_TAG_COUNTER(0) && (n) < XENCOV_TAG_COUNTER(XENCOV_COUNTERS))
-#define XENCOV_COUNTER_NUM(n) ((n)-XENCOV_TAG_COUNTER(0))
-
-/*
- * The main structure for the blob is
- * BLOB := FILE.. END
- * FILE := TAG_FILE VERSION STAMP FILENAME COUNTERS FUNCTIONS
- * FILENAME := LEN characters
- * characters are padded to 32 bit
- * LEN := 32 bit value
- * COUNTERS := TAG_COUNTER(n) NUM COUNTER..
- * NUM := 32 bit valie
- * COUNTER := 64 bit value
- * FUNCTIONS := TAG_FUNC NUM FUNCTION..
- * FUNCTION := IDENT CHECKSUM NUM_COUNTERS
- *
- * All tagged structures are aligned to 8 bytes
- */
-
-/**
- * File information
- * Prefixed with XENCOV_TAG_FILE and a string with filename
- * Aligned to 8 bytes
- */
-struct xencov_file
-{
- uint32_t tag; /* XENCOV_TAG_FILE */
- uint32_t version;
- uint32_t stamp;
- uint32_t fn_len;
- char filename[1];
-};
-
-
-/**
- * Counters information
- * Prefixed with XENCOV_TAG_COUNTER(n) where n is 0..(XENCOV_COUNTERS-1)
- * Aligned to 8 bytes
- */
-struct xencov_counter
-{
- uint32_t tag; /* XENCOV_TAG_COUNTER(n) */
- uint32_t num;
- uint64_t values[1];
-};
-
-/**
- * Information for each function
- * Number of counter is equal to the number of counter structures got before
- */
-struct xencov_function
-{
- uint32_t ident;
- uint32_t checksum;
- uint32_t num_counters[1];
-};
-
-/**
- * Information for all functions
- * Aligned to 8 bytes
- */
-struct xencov_functions
-{
- uint32_t tag; /* XENCOV_TAG_FUNC */
- uint32_t num;
- struct xencov_function xencov_function[1];
-};
-
-/**
- * Terminator
- */
-struct xencov_end
-{
- uint32_t tag; /* XENCOV_TAG_END */
-};
-
-#endif /* __XEN_PUBLIC_GCOV_H__ */
-
typedef struct xen_sysctl_scheduler_op xen_sysctl_scheduler_op_t;
DEFINE_XEN_GUEST_HANDLE(xen_sysctl_scheduler_op_t);
-/* XEN_SYSCTL_coverage_op */
-/*
- * Get total size of information, to help allocate
- * the buffer. The pointer points to a 32 bit value.
- */
-#define XEN_SYSCTL_COVERAGE_get_total_size 0
-
-/*
- * Read coverage information in a single run
- * You must use a tool to split them.
- */
-#define XEN_SYSCTL_COVERAGE_read 1
-
-/*
- * Reset all the coverage counters to 0
- * No parameters.
- */
-#define XEN_SYSCTL_COVERAGE_reset 2
-
-/*
- * Like XEN_SYSCTL_COVERAGE_read but reset also
- * counters to 0 in a single call.
- */
-#define XEN_SYSCTL_COVERAGE_read_and_reset 3
-
-struct xen_sysctl_coverage_op {
- uint32_t cmd; /* XEN_SYSCTL_COVERAGE_* */
- union {
- uint32_t total_size; /* OUT */
- XEN_GUEST_HANDLE_64(uint8) raw_info; /* OUT */
- } u;
-};
-typedef struct xen_sysctl_coverage_op xen_sysctl_coverage_op_t;
-DEFINE_XEN_GUEST_HANDLE(xen_sysctl_coverage_op_t);
-
#define XEN_SYSCTL_PSR_CMT_get_total_rmid 0
#define XEN_SYSCTL_PSR_CMT_get_l3_upscaling_factor 1
/* The L3 cache size is returned in KB unit */
#define XEN_SYSCTL_numainfo 17
#define XEN_SYSCTL_cpupool_op 18
#define XEN_SYSCTL_scheduler_op 19
-#define XEN_SYSCTL_coverage_op 20
+/* #define XEN_SYSCTL_coverage_op 20 */
#define XEN_SYSCTL_psr_cmt_op 21
#define XEN_SYSCTL_pcitopoinfo 22
#define XEN_SYSCTL_psr_cat_op 23
struct xen_sysctl_lockprof_op lockprof_op;
struct xen_sysctl_cpupool_op cpupool_op;
struct xen_sysctl_scheduler_op scheduler_op;
- struct xen_sysctl_coverage_op coverage_op;
struct xen_sysctl_psr_cmt_op psr_cmt_op;
struct xen_sysctl_psr_cat_op psr_cat_op;
struct xen_sysctl_tmem_op tmem_op;
+++ /dev/null
-/*
- * Profiling infrastructure declarations.
- *
- * This file is based on gcc-internal definitions. Data structures are
- * defined to be compatible with gcc counterparts. For a better
- * understanding, refer to gcc source: gcc/gcov-io.h.
- *
- * Copyright IBM Corp. 2009
- * Author(s): Peter Oberparleiter <oberpar@linux.vnet.ibm.com>
- *
- * Uses gcc-internal data definitions.
- */
-
-#ifndef __XEN_GCOV_H__
-#define __XEN_GCOV_H__ __XEN_GCOV_H__
-
-#include <public/sysctl.h>
-
-/*
- * Profiling data types used for gcc 3.4 and above - these are defined by
- * gcc and need to be kept as close to the original definition as possible to
- * remain compatible.
- */
-
-typedef uint64_t gcov_type;
-
-/**
- * struct gcov_fn_info - profiling meta data per function
- * @ident: object file-unique function identifier
- * @checksum: function checksum
- * @n_ctrs: number of values per counter type belonging to this function
- *
- * This data is generated by gcc during compilation and doesn't change
- * at run-time.
- */
-struct gcov_fn_info
-{
- unsigned int ident;
- unsigned int checksum;
- unsigned int n_ctrs[0];
-};
-
-/**
- * struct gcov_ctr_info - profiling data per counter type
- * @num: number of counter values for this type
- * @values: array of counter values for this type
- * @merge: merge function for counter values of this type (unused)
- *
- * This data is generated by gcc during compilation and doesn't change
- * at run-time with the exception of the values array.
- */
-struct gcov_ctr_info
-{
- unsigned int num;
- gcov_type *values;
- void (*merge)(gcov_type *, unsigned int);
-};
-
-/**
- * struct gcov_info - profiling data per object file
- * @version: gcov version magic indicating the gcc version used for compilation
- * @next: list head for a singly-linked list
- * @stamp: time stamp
- * @filename: name of the associated gcov data file
- * @n_functions: number of instrumented functions
- * @functions: function data
- * @ctr_mask: mask specifying which counter types are active
- * @counts: counter data per counter type
- *
- * This data is generated by gcc during compilation and doesn't change
- * at run-time with the exception of the next pointer.
- */
-struct gcov_info
-{
- unsigned int version;
- struct gcov_info *next;
- unsigned int stamp;
- const char *filename;
- unsigned int n_functions;
- const struct gcov_fn_info *functions;
- unsigned int ctr_mask;
- struct gcov_ctr_info counts[0];
-};
-
-
-/**
- * Sysctl operations for coverage
- */
-#ifdef CONFIG_GCOV
-int sysctl_coverage_op(xen_sysctl_coverage_op_t *op);
-#endif
-
-#endif /* __XEN_GCOV_H__ */