From patchwork Wed Jul 26 10:43:45 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Felix Schmoll X-Patchwork-Id: 9864561 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id CDA1A603F9 for ; Wed, 26 Jul 2017 10:47:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A595827FB1 for ; Wed, 26 Jul 2017 10:47:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 9A2B8285F3; Wed, 26 Jul 2017 10:47:21 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.6 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_MED, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 93AA828747 for ; Wed, 26 Jul 2017 10:47:20 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1daJnN-0003K0-58; Wed, 26 Jul 2017 10:44:01 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1daJnL-0003Ju-4O for xen-devel@lists.xenproject.org; Wed, 26 Jul 2017 10:43:59 +0000 Received: from [85.158.139.211] by server-4.bemta-5.messagelabs.com id 7B/C3-02184-E6278795; Wed, 26 Jul 2017 10:43:58 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprNIsWRWlGSWpSXmKPExsXiVRvkpJtbVBF p0H1fyuL7lslMDowehz9cYQlgjGLNzEvKr0hgzbi+p5ut4FFhxbmP11kaGLtiuxi5OIQEZjJK dO55zwrisAhcYpG4f3YxG4gjIfCORWJa3yyWLkZOICdN4v7JQ+wQdrnEtzkzweJCApoSX7q7G CFGzWeSOLWugxUkwSZgIDF75UVmEFtEQEni3qrJTCBFzAIHGCW6fu0BmyQs4CPxefFHJhCbRU BVYnfXWqDVHBy8AvYS2547QSyTl9jVdpF1AiPfAkaGVYwaxalFZalFuoZGeklFmekZJbmJmTm 6hgamermpxcWJ6ak5iUnFesn5uZsYgcHCAAQ7GPtmOR9ilORgUhLlnWRaESnEl5SfUpmRWJwR X1Sak1p8iFGGg0NJgpe9ECgnWJSanlqRlpkDDFuYtAQHj5IIbyhImre4IDG3ODMdInWK0Z5jw +r1X5g4FvRsAJKTDmwHkq8m/P/GJMSSl5+XKiXO+7sAqE0ApC2jNA9uKCzOLjHKSgnzMgKdKc RTkFqUm1mCKv+KUZyDUUmY9wPIFJ7MvBK43a+AzmICOmvOjFKQs0oSEVJSDYxW2ps8OrYxfUg tulSS0dq7/rl+mt12l1fyTpdcHcqOMFxZ71arZOnTkzBRv/TUtUvMu46ZM6kZtVgq2La8au2w DBfi2KnT3u3EsbFPN273Rvstm05t1tPVN/rw/p3I1laPUwdvsN6oOlSkv3iG2mSzT3xPPoj8W m1r4PwmRfiz25eHLGqXJJVYijMSDbWYi4oTAXRJoNeuAgAA X-Env-Sender: eggi.innovations@gmail.com X-Msg-Ref: server-11.tower-206.messagelabs.com!1501065837!84791220!1 X-Originating-IP: [74.125.82.66] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.4.25; banners=-,-,- X-VirusChecked: Checked Received: (qmail 33783 invoked from network); 26 Jul 2017 10:43:57 -0000 Received: from mail-wm0-f66.google.com (HELO mail-wm0-f66.google.com) (74.125.82.66) by server-11.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 26 Jul 2017 10:43:57 -0000 Received: by mail-wm0-f66.google.com with SMTP id r123so10079347wmb.5 for ; Wed, 26 Jul 2017 03:43:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=N0rHD+4fEOptjGWF3dO2qwq1Sc2St+KHJBPvpDIWcP8=; b=oEyt4c3fGkJ4fRdBxPygE5b5zRR5Vpc6m3HSpD1Csg0csCGB6PfbCE8r9wvtc0GwHd GZuuvtGr9edtxRYOd0zV0RxpJiIlrwvNvVDAsT4nxqP7uRzvPfhO65VwlWzlIu9/tXdr ZTp6l1HGRRHd0/9qLkmr1NaoJ31n924Tp5vfkkVFcb1a/XoknIDASQwICOY/rxP0N8Dd AUkHqTneDAkNWvmf7+5Kb4N0Krq4zr1p5xeGuFyif61s4uoKJ4tPHVJQYadrHqZcwtHg 8nMKkv4EkwZHEjKL+pIzNw5Xa2eBye5UGfXoXJ2OjpYQ0SEPpGNKYNlCSOwb+yW5kOGV QjnQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=N0rHD+4fEOptjGWF3dO2qwq1Sc2St+KHJBPvpDIWcP8=; b=MUBgtXdT/6SnhnuuR4mS9Ss1HDWcCkU/ov+436oinYvQAcsyR36ZnGNGMTc1c4I6BA Ua+FvZyEwas6N1Lkk8ErYzzX4h8FmdsPtzV07dpTy0XJM3S05E7w4EVZ9d8CFS32e9jm nl50DnW39mZ+DV2nlRtVism3JDvCT3VHCxsr9khWlmCuEnuQ3L1AajBQjLykSz8L9SrF Z0Vcl7HbnhozFxxTMxR4IZn4+m8Soqh5pIrzl3k62fZcBpVGv3Adyw3PHj0p8IkqAqOV 0qTSF8YltzEp6i7yjungyug8vasZz/QGjZ9V4tlqrtSh+ZTqf6L5yYQ008/McTlClqmN 2sag== X-Gm-Message-State: AIVw1119JMVaXyEBYvUEZq1L8uj32/WzIeeh9uUeD5xtVThQt6Y/UoS2 a9AEHgAeHVLpDWX5zQGhxA== X-Received: by 10.28.206.12 with SMTP id e12mr413127wmg.81.1501065836351; Wed, 26 Jul 2017 03:43:56 -0700 (PDT) Received: from localhost.localdomain (ip-109-47-0-103.web.vodafone.de. [109.47.0.103]) by smtp.gmail.com with ESMTPSA id w11sm10383828wrc.6.2017.07.26.03.43.53 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 26 Jul 2017 03:43:55 -0700 (PDT) From: Felix Schmoll To: xen-devel@lists.xenproject.org Date: Wed, 26 Jul 2017 12:43:45 +0200 Message-Id: <20170726104345.26176-1-eggi.innovations@gmail.com> X-Mailer: git-send-email 2.11.0 Cc: sstabellini@kernel.org, wei.liu2@citrix.com, Felix Schmoll , andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, julien.grall@arm.com, jbeulich@suse.com Subject: [Xen-devel] [PATCH v2] xen: Implement hypercall for tracing of program counters X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP This commit makes the changes to the hypervisor, the build system as well as libxc necessary in order to facilitate tracing of program counters. A discussion of the design can be found in the mailing list: https://lists.xen.org/archives/html/xen-devel/2017-05/threads.html#02210 The list of files to be included for tracing might still be too extensive, resulting in indeterministic tracing output for some use cases. Signed-off-by: Felix Schmoll --- Changed since v1: * Fixed bug that prevented xen from compiling when CONFIG_TRACE_PC was disabled * Adapted formatting to coding style * Renamed files and variables to conform to trace_pc-idiom * Changed hypercall variables to be publicly accessible * Added appropriate licenses * Fix position of hypercall in hypercall-table * Increase tracing coverage * Delete buffer if on domain destruction path --- xen/Kconfig | 4 ++ xen/Rules.mk | 4 ++ xen/arch/arm/traps.c | 1 + xen/arch/x86/Makefile | 2 + xen/arch/x86/hvm/hypercall.c | 1 + xen/arch/x86/hypercall.c | 1 + xen/arch/x86/pv/hypercall.c | 1 + xen/common/Makefile | 13 ++++++ xen/common/domain.c | 4 ++ xen/common/trace_pc.c | 95 +++++++++++++++++++++++++++++++++++++++++++ xen/common/trace_pc_stub.c | 39 ++++++++++++++++++ xen/include/public/trace_pc.h | 38 +++++++++++++++++ xen/include/public/xen.h | 1 + xen/include/xen/hypercall.h | 7 ++++ xen/include/xen/sched.h | 6 +++ xen/include/xen/trace_pc.h | 31 ++++++++++++++ 16 files changed, 248 insertions(+) create mode 100644 xen/common/trace_pc.c create mode 100644 xen/common/trace_pc_stub.c create mode 100644 xen/include/public/trace_pc.h create mode 100644 xen/include/xen/trace_pc.h diff --git a/xen/Kconfig b/xen/Kconfig index 65d491d776..5ed2c9c390 100644 --- a/xen/Kconfig +++ b/xen/Kconfig @@ -38,4 +38,8 @@ config LTO If unsure, say N. +config TRACE_PC + bool "Enable tracing e.g. for fuzzing" + default false + source "Kconfig.debug" diff --git a/xen/Rules.mk b/xen/Rules.mk index 77bcd44922..dde14e3228 100644 --- a/xen/Rules.mk +++ b/xen/Rules.mk @@ -170,6 +170,10 @@ clean:: $(addprefix _clean_, $(subdir-all)) _clean_%/: FORCE $(MAKE) -f $(BASEDIR)/Rules.mk -C $* clean +ifeq ($(CONFIG_TRACE_PC),y) +$(objs-need-tracing): CFLAGS += -fsanitize-coverage=trace-pc +endif + %.o: %.c Makefile $(CC) $(CFLAGS) -c $< -o $@ diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index c07999b518..247a68c964 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1419,6 +1419,7 @@ static arm_hypercall_t arm_hypercall_table[] = { HYPERCALL(platform_op, 1), HYPERCALL_ARM(vcpu_op, 3), HYPERCALL(vm_assist, 2), + HYPERCALL(trace_pc, 4), }; #ifndef NDEBUG diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index 93ead6e5dd..b283c3e22c 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -74,6 +74,8 @@ efi-y := $(shell if [ ! -r $(BASEDIR)/include/xen/compile.h -o \ -O $(BASEDIR)/include/xen/compile.h ]; then \ echo '$(TARGET).efi'; fi) +objs-need-tracing := cpuid.o hypercall.o + ifneq ($(build_id_linker),) notes_phdrs = --notes else diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c index e7238ce293..b59d7d481e 100644 --- a/xen/arch/x86/hvm/hypercall.c +++ b/xen/arch/x86/hvm/hypercall.c @@ -132,6 +132,7 @@ static const hypercall_table_t hvm_hypercall_table[] = { COMPAT_CALL(mmuext_op), HYPERCALL(xenpmu_op), COMPAT_CALL(dm_op), + HYPERCALL(trace_pc), HYPERCALL(arch_1) }; diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c index e30181817a..672ffe7ef5 100644 --- a/xen/arch/x86/hypercall.c +++ b/xen/arch/x86/hypercall.c @@ -68,6 +68,7 @@ const hypercall_args_t hypercall_args_table[NR_hypercalls] = ARGS(xenpmu_op, 2), ARGS(dm_op, 3), ARGS(mca, 1), + ARGS(trace_pc, 4), ARGS(arch_1, 1), }; diff --git a/xen/arch/x86/pv/hypercall.c b/xen/arch/x86/pv/hypercall.c index f79f7eef62..13eb2e86a2 100644 --- a/xen/arch/x86/pv/hypercall.c +++ b/xen/arch/x86/pv/hypercall.c @@ -80,6 +80,7 @@ static const hypercall_table_t pv_hypercall_table[] = { HYPERCALL(xenpmu_op), COMPAT_CALL(dm_op), HYPERCALL(mca), + HYPERCALL(trace_pc), HYPERCALL(arch_1), }; diff --git a/xen/common/Makefile b/xen/common/Makefile index 26c5a64337..7f7345cb90 100644 --- a/xen/common/Makefile +++ b/xen/common/Makefile @@ -6,6 +6,8 @@ obj-y += cpupool.o obj-$(CONFIG_HAS_DEVICE_TREE) += device_tree.o obj-y += domctl.o obj-y += domain.o +obj-y += trace_pc.o +obj-$(CONFIG_TRACE_PC) += trace_pc_stub.o obj-y += event_2l.o obj-y += event_channel.o obj-y += event_fifo.o @@ -80,3 +82,14 @@ subdir-$(CONFIG_GCOV) += gcov subdir-y += libelf subdir-$(CONFIG_HAS_DEVICE_TREE) += libfdt + +objs-need-tracing := bsearch.o \ + decompress.o device_tree.o domain.o domctl.o earlycpio.o grant_table.o \ + guestcopy.o gunzip.o inflate.o kernel.o kexec.o keyhandler.o kimage.o \ + lib.o livepatch.o lzo.o mem_access.o memory.o multicall.o notifier.o \ + page_alloc.o pdx.o perfc.o radix_tree.o rangeset.o \ + rbtree.o shutdown.o sort.o stop_machine.o \ + symbols.o symbols-dummy.o sysctl.o time.o tmem.o \ + tmem_control.o tmem_xen.o trace.o unlz4.o unlzo.o unxz.o version.o \ + virtual_region.o vmap.o vm_event.o warning.o xenoprof.o \ + xmalloc_tlsf.o diff --git a/xen/common/domain.c b/xen/common/domain.c index b22aacc57e..c98a0a94ec 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -874,6 +874,10 @@ void domain_destroy(struct domain *d) rcu_assign_pointer(*pd, d->next_in_hashbucket); spin_unlock(&domlist_update_lock); +#ifdef CONFIG_TRACE_PC + xfree(d->tracing_buffer); +#endif + /* Schedule RCU asynchronous completion of domain destroy. */ call_rcu(&d->rcu, complete_domain_destroy); } diff --git a/xen/common/trace_pc.c b/xen/common/trace_pc.c new file mode 100644 index 0000000000..780bbc0660 --- /dev/null +++ b/xen/common/trace_pc.c @@ -0,0 +1,95 @@ +/****************************************************************************** + * trace_pc.c + * + * Implementation of the program counter tracing hypercall. + * + * Copyright (c) 2017 Felix Schmoll + * + * 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 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 . + */ + +#include +#include +#include +#include + +long do_trace_pc(domid_t dom, int mode, unsigned int size, + XEN_GUEST_HANDLE_PARAM(uint64_t) buf) +{ +#ifdef CONFIG_TRACE_PC + int ret = 0; + struct domain *d; + + if ( dom == DOMID_SELF ) + d = current->domain; + else + d = get_domain_by_id(dom); + + if ( !d ) + return -EINVAL; /* invalid domain */ + + switch ( mode ) + { + case XEN_TRACE_PC_START: + { + if ( d->tracing_buffer ) + { + ret = -EBUSY; /* domain already being traced */ + break; + } + + d->tracing_buffer_pos = 0; + d->tracing_buffer_size = size; + d->tracing_buffer = xmalloc_array(uint64_t, size); + + if ( !d->tracing_buffer ) + ret = -ENOMEM; + break; + } + + case XEN_TRACE_PC_STOP: + { + uint64_t* temp = d->tracing_buffer; + d->tracing_buffer = NULL; + + if ( copy_to_guest(buf, temp, d->tracing_buffer_pos) ) + ret = -EFAULT; + + xfree(temp); + + ret = d->tracing_buffer_pos; + break; + } + + default: + ret = -ENOSYS; + } + + if ( dom != DOMID_SELF ) + put_domain(d); + + return ret; +#else + return 0; +#endif +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/common/trace_pc_stub.c b/xen/common/trace_pc_stub.c new file mode 100644 index 0000000000..4aba7dba9f --- /dev/null +++ b/xen/common/trace_pc_stub.c @@ -0,0 +1,39 @@ +/****************************************************************************** + * trace_pc_stub.c + * + * Edge function/stub for the program counter tracing hypercall. + * + * Copyright (c) 2017 Felix Schmoll + * + * 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 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 . + */ + +#include +#include + +void __sanitizer_cov_trace_pc(void) +{ + struct domain *d; + + if ( system_state < SYS_STATE_active ) + return; + + d = current->domain; + + if ( d->tracing_buffer && + (d->tracing_buffer_pos < d->tracing_buffer_size) ) + { + d->tracing_buffer[d->tracing_buffer_pos++] = + (uint64_t) __builtin_return_address(0); + } +} diff --git a/xen/include/public/trace_pc.h b/xen/include/public/trace_pc.h new file mode 100644 index 0000000000..54e430a561 --- /dev/null +++ b/xen/include/public/trace_pc.h @@ -0,0 +1,38 @@ +/****************************************************************************** + * trace_pc.h + * + * Macros for program counter tracing hypercall. + * + * Copyright (C) 2017 Felix Schmoll + * + * 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. + */ + +#ifndef __XEN_PUBLIC_TRACE_PC_H__ +#define __XEN_PUBLIC_TRACE_PC_H__ + +#if defined(__XEN__) || defined(__XEN_TOOLS__) + +#define XEN_TRACE_PC_START 0 +#define XEN_TRACE_PC_STOP 1 + +#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */ + +#endif /* __XEN_PUBLIC_TRACE_PC_H__ */ diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index 2ac6b1e24d..95d83c21ce 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -121,6 +121,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); #define __HYPERVISOR_xc_reserved_op 39 /* reserved for XenClient */ #define __HYPERVISOR_xenpmu_op 40 #define __HYPERVISOR_dm_op 41 +#define __HYPERVISOR_trace_pc 42 /* Architecture-specific hypercall definitions. */ #define __HYPERVISOR_arch_0 48 diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h index cc99aea57d..aa6269e7b7 100644 --- a/xen/include/xen/hypercall.h +++ b/xen/include/xen/hypercall.h @@ -83,6 +83,13 @@ do_xen_version( XEN_GUEST_HANDLE_PARAM(void) arg); extern long +do_trace_pc( + domid_t dom_id, + int mode, + unsigned int size, + XEN_GUEST_HANDLE_PARAM(uint64_t) buf); + +extern long do_console_io( int cmd, int count, diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 6673b27d88..4bd3fe2417 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -483,6 +483,12 @@ struct domain unsigned int guest_request_enabled : 1; unsigned int guest_request_sync : 1; } monitor; + +#ifdef CONFIG_TRACE_PC + uint64_t* tracing_buffer; + unsigned int tracing_buffer_pos; + unsigned int tracing_buffer_size; +#endif }; /* Protect updates/reads (resp.) of domain_list and domain_hash. */ diff --git a/xen/include/xen/trace_pc.h b/xen/include/xen/trace_pc.h new file mode 100644 index 0000000000..631815de30 --- /dev/null +++ b/xen/include/xen/trace_pc.h @@ -0,0 +1,31 @@ +/****************************************************************************** + * trace_pc.h + * + * Declarations for the program counter tracing hypercall + * + * Copyright (C) 2017 Felix Schmoll + * + * 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 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 . + */ + +#ifndef __TRACE_PC_H__ +#define __TRACE_PC_H__ + +#include +#include + +#include + +void __sanitizer_cov_trace_pc(void); + +#endif /* __TRACE_PC_H__ */